kostyl, я в zf пишу свой сервисный уровень для работы с моделями, а контроллер лишь обрабатывает запросы и перенаправляет их сервисному уровню, меня это конечно не напрягает. Вот пример:
/**
* New book
*
* @return void
*/
public function createAction()
{
$form = $this->_service->getForm();
if ($this->getRequest()->isPost()) {
$data = $this->_request->getPost();
if ($this->_service->processFormCreate($data)) {
$model = $this->_service->getModel();
$this->getHelper('redirector')->gotoSimple(
'view', 'book', null, array(
'id' => $model['id'])
);
}
}
$this->view->form = $form;
$this->view->title = 'Добавление книги';
}
А уже в сервисном уровне, что-то вроде:
/**
* Process create form and return true if form is valid, otherwise return false
*
* @param array $data
* @return bool
*/
public function processFormCreate(array $data)
{
if (!$this->getForm()->isValid($data)) {
return false;
}
$formData = $this->getForm()->getValues();
$data = array(
'user_id' => $this->_getUserId(),
'image_id' => $this->_getImageId($this->getForm()->image),
'title' => $formData['title'],
'annotation' => $formData['annotation'],
'author_name' => $formData['author_name'],
'links' => $formData['links'],
'format' => $formData['format'],
'language' => $formData['language'],
'pages_count' => $formData['pages_count'],
'year' => $formData['year']
);
$table = new Model_DbTable_Books();
$table->insert($data);
$data['id'] = $table->getAdapter()->lastInsertId();
$data['categories'] = $this->_assignBookToCategories(
$data['id'], $formData['categories']
);
$this->setModel($data);
return true;
}
Сейчас, хочу попробовать написать, что вроде событийной архитектуры, как ты говоришь. Только у меня это будет, что-то вроде Pub-sub или Observer. Хочется попробовать сделать нечто такое, что бы любой компонент системы мог генерировать событие и любой мог его перехватывать, что бы оно еще всплывало как в javascript по chain of responsibility.
Мне еще в этом плане реализация ловушек в Drupal нравиться.
А команда, да это по сути действие, и мне кажется не нужно пихать в нее acl и так далее. А она выполняет какие-то атомарные операции, а уже как ты говоришь диспетчер или CommandManager идет надстройкой к ней. Я могу быть не прав, еще не пробовал работать с командами.