Zend Framework: Подкаталоги в каталоге контроллеров - PullRequest
4 голосов
/ 08 марта 2010

Я использую Zend Framework для своего сайта и только что создал специальный модуль "api" для создания ... Ну, API.

Теперь у меня много контроллеров в моем модуле, и я хотел бы создать подкаталоги в этом каталоге контроллеров, чтобы "привести в порядок" его. Моя новая структура будет выглядеть примерно так:

 - controllers/
 - controllers/contents/[controllers]
 - controllers/users/[controllers]
 - controllers/misc/[controllers]

Однако я совершенно не могу найти, какие URL и перенаправления с помощью Zend_Controller_Router_Route могут отображаться на эти контроллеры. Можно ли это как-то сделать или я должен просто вернуться к нормальной структуре и поместить все мои контроллеры в один каталог?


Я попытался использовать разделители _, как предложено smack0007, и, как это казалось логичным, учитывая, как Zend Framework обычно ссылается на подкаталоги, но я получил ошибку.


Редактировать: Удалил длинный текст ошибки, поскольку он не был связан с вопросом, поскольку это было только проблемой, потому что я не использовал регистр пропра, полагая, что мне пришлось вводить заглавную букву в первой букве каталога. Теперь все работает хорошо.

Ответы [ 2 ]

4 голосов
/ 08 марта 2010

Я сделал это в проекте еще в версии 1.5, но я не знаю, будет ли это работать больше.

Вы должны добавить к своим контроллерам префикс "{FOLDER} _", а затем использовать полное имя в URL.

Так что в вашем случае у вас будет контроллер с именем:

contents_FooController

и маршрут:

/contents_foo/index
0 голосов
/ 24 мая 2016

Я пытался выполнить несколько уровней в URL для старого приложения и избегал использования большого количества URL-маршрутов. Поэтому я подумал о группировании контроллеров в подкаталоги и определении URL-адреса для него.

Для строения

modules
 --test
   --controllers
     --sub
        -- OtherController.php
     --DefaultController.php

В Bootstrap.php модуля я добавил:

public function __construct($application)
    {
        parent::__construct($application);
        $frontController = Zend_Controller_Front::getInstance();
        $frontController->addControllerDirectory(__DIR__ . '/controllers',
            'test');
        $frontController->addControllerDirectory(__DIR__ . '/controllers/sub',
            'test_sub');
    }

DefaultController.php равен

class Test_DefaultController extends Zend_Controller_Action {
     public function subAction()
    {
         $level1 = $this->getRequest()->getParam('level1');
         $level2 = $this->getRequest()->getParam('level2');
         return $this->_forward($level2, $level1, 'test_sub');
    }

Таким образом, он будет перенаправлен на наш контроллер в подкаталоге.

Наконец, добавлен маршрут:

new Zend_Controller_Router_Route_Regex('([a-z-]+)/([a-z-]+)/([a-z-]+)/([a-z-]+)/([a-z-]+)',
    array(),
    array(1 => 'module', 2 => 'controller', 3 => 'action', 4 => 'level1', 5 => 'level2'),
    '%s/%s/%s/%s/%s'
)

Теперь с запросом test / default / sub / other / index вы можете вызвать indexAction в OtherController.php

...