2009-10-06 2 views
0

Извините, это довольно длинный вопрос, но я хочу, чтобы здесь были некоторые изъяны.Zend-Framework: как мы это делаем без модуля?

Я новичок в zend и стараюсь избегать использования модулей, так как я считаю, что аспект вида zend довольно гибкий, и модуль добавит дополнительную директорию и путаницу. Однако мне интересно одно. Приложение, которое я создаю, довольно большой, на самом деле у него есть концепция модулей в приложении.

Я знаю, что если с помощью модуля, то может быть более организованным, где вы можете поместить модули в своем собственном каталоге и имеют индивидуальный вид и контроллер и т.д.

однако я решил симулировать каталог модуля в виде

--lang/module (на самом деле контроллер)/контроллер (это действие)/действие (это дочернее действие)/other-params/-

Как мы идем и выполняем этот вид моделирования

Начальная идея i ha ve добавляет еще один маршрут к приложению, беря 4-й параметр в качестве дочернего действия. например

класс some_controller простираться расширяет Zend_Controller_Action {

public function someAction{ 

    switch (child-action) { 
     case 'child-action1': 
      ....... excute some action 
      break; 
     case 'child-action2': 
      ....... excute some action 
      break;.... 
    } 

} 

что-то подобное. Это имеет смысл или если есть какой-либо другой подход? и с этим подходом мы интегрируем Zend_ACL как добавление «поддельного дочернего действия» в качестве ресурса? Спасибо.

+0

У меня возникла проблема с пониманием того, что вы имеете в виду, можете ли вы дать мне представление об объектах, с которыми вы имеете дело - конструктивные имена контроллеров/действий/детей? Душа для вашего макета действия может зависеть от того, какую работу вы пытаетесь сделать. – gnarf

+0

В основном я пытаюсь имитировать модули без каталога модулей с zend framework. Проблемы лежат в/action/child-action. Каков наилучший подход к определению/моделированию действий детей в существующих действиях? Я хочу изменить/myModule/myController/myAction в/myController/myAction/myChildAction/ Большое спасибо. – Dan

ответ

1

Может быть, вы можете настроить свои маршруты так:

/:controller/:action/:child-action 

Смотрите here для получения дополнительной информации о настройке маршрутов.

Тогда в своих методах действий:

$childAction = $this->getParam('child-action'); 

// convert $childAction to camelCase. 

if(method_exists($this, $childAction)) 
{ 
     // Check ACL 
     $this->$childAction(); 
} 

Не называйте ребенка действия с действиями постфикса, как позволило бы действия, которые можно назвать непосредственно. Вы могли бы постфикс их с чем-то вроде «fooChild», но не «fooChildAction», поскольку они затем отображали бы «foo-child».

+0

Спасибо за помощь. Это означает, что в каждой функции действия мы должны выполнять эти проверки и пересылку. Любое расширение плагина или класса, которое я могу применить для получения этой проверки для всех контроллеров действий? – Dan

+0

Вы собираетесь делать это за каждое действие в своем приложении? Если да, то почему вы против модулей? Я могу понять, почему вы можете использовать этот подход, если вы делаете это только для нескольких действий в своем приложении. Вы можете создать свой собственный плагин и проверить предварительную настройку плагина для дочерних действий и соответствующим образом изменить запрос. – smack0007

0

Я думаю, что это делает его много сложнее, чем просто работать с каталогом модуля структуры ... Который раз установка, это не так уж сложно вообще, это просто логическое разделение классов ...

+0

Если он только хочет сделать это за несколько действий в своем приложении, я могу понять, почему этот подход может быть желательным. – smack0007

0

было бы больше смысла, чтобы добавить маршрут;)

есть: модуль /: контроллер /: действие/-> админ/сообщения/добавить

и: модуль/сообщения/добавить /: действие -> admin/posts/add/concept, который будет ссылаться на PostsAddController :: ConceptAction();

лучше, чем оператор switch, я думаю;) Но вы можете использовать его для ... случая «sth»: $ this -> _ forward ('my-action', 'my-controller');