С идеологией MVC (model) в ZF1?

Всем доброго времени, уважаемые хабравчане.



Начал осваивать Zend Framework. Система грандиозная со своими плюсами, минусами, прелестями и сложностями. Особенно когда не совсем понимаешь best practice.



Понимаю, что запутался совсем в конец, поэтому обращаюсь к вам за помощью / подсказкой / советом, коим буду безмерно благодарен.



Делаю небольшое REST приложение. Достаточно стандартный набор несложных действий, но хочу погрузится во все недра фреймворка и научиться делать не «как получится», а «как лучше» и «как правильно».



С контроллером / вью вопросов не возникло. А вот с моделью, с каждой прочитанной статьей, я понимаю, я все больше теряюсь.



Попробую сформулировать основные вопросы.

Сколько файлов под модели надо создавать?

Видел разные виды реализации наследования — от _Table, _Table_Abstract, _Row, _Rowset и тд. Когда лучше от чего наследоваться?

В идеологии ZF встречал еще использование Mapper у моделей. Как следует разделять данные? Какая часть должна работать с БД (надо ли разделять на Unit / Collection и если да, то как лучше / правильнее), а какая оперировать с различными данными. Например, различные fetch.

Есть helper, которые используют не только в качестве помощников для вью, но и для данных. Верно ли это?

Есть сервисы, которые пока полностью не освоил. С учетом вышеперечисленных вопросов про модели, что сюда лучше отдавать?



Достаточно много литературы изучил, но вместо понимания становится больше каши в голове. Буду рад любой помощи, хорошим ссылкам / отсылкам к мануалам и тд.



Если вопросы покажутся глупыми, просьба не минусовать, а помочь. Я же действительно хочу стать лучше :)
  • Вопрос задан
  • 4272 просмотра
Пригласить эксперта
Ответы на вопрос 3
@anitspam
Чуть-чуть личного опыта. Зенд — это мегауниверсальный фреймворк. А значит мегабольшой и мегасложный. И такое ощущение, что создавался архитекторами для архитекторов.

Поэтому, изучая его, вы не найдёте «единственных» (рекомендованных) рецептов как сделать ту или иную концептуальную вещь.
Поэтому у ваших моделей будет несколько «лишних» файлов (те самые _Table, _Row, _Rowset, плюс бывают _Gateway, _Factory, ...)
Поэтому слишком много времени будет уходить на обдумывание, как же назвать/сделать/куда поместить «простые» вещи.
Поэтому вы не сможете найти пару десятков открытых проектов, чтобы посмотреть, как же сообщество решило делать какую-нибудь штуку (эта штука будет сделана по-разному в найденных проектах).
Поэтому в багтрекере вы будете видеть тикеты, открытые по нескольку лет с риторическими вопросами «Есть какой-нибудь прогресс по этой проблеме?».

Поэтому на первых порах, пока ещё не освоили фреймворк, сделайте как можно проще, без усложнений. Если вам надо делать запросы к базе, пусть пока это будет вот так
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$query = "SELECT ...";
$db_result = $db->fetchAll($query);

потом может вам понравится вот так
$o_select = $o_db->select()
                ->from("...", $a_columns)
                ->where('... = ?', ...)
                ->order('... ASC');
$a_result = $o_db->fetchAll($o_select);

потом так
public function fetchAllBy...($...)
    {
        ...
        return new ..._Model_...Set(...);
    }


Просто пишите как знаете на текущем уровне и с получением очередного «левел апа» будете знать, как же приспособить этот фреймворк для своих нужд.
Ответ написан
Kuzma
@Kuzma
попробуйте посмотреть на github.com/codeinchaos/restful-zend-framework. не обязательно его использовать — достаточно посмотреть как там сделано.

Блог автора этого проекта:
www.codeinchaos.com/post/3107629294/restful-services-with-zend-framework-part-1
www.codeinchaos.com/post/3645298058/restful-services-with-zend-framework-part-2
Ответ написан
@mbt

Я создаю 2 файла: application/models/DbTable/Items.php


class Application_Model_DbTable_Items extends Zend_Db_Table_Abstract
{
    protected $_rowClass = 'Application_Model_Item';
    protected $_name = 'items'; //Table name
}

application/models/Item.php


class Application_Model_Item extends Zend_Db_Table_Row_Abstract
{
    public function getName(){
        return $this->title; //database table column
    }
}

Потом в контроллер:


$itemsTable = new Application_Model_DbTable_Items();
$items = $itemsTable->fetchAll();
foreach($items as $item){
    echo $item->getName() . '-';
}

Преимущество такого метода в модели можно писать дополнительные функции. DbTable возвращаеть объект Application_Model_Item

Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы