Фреймворк Zend :Подкаталоги в каталоге контроллеров
-
18-09-2019 - |
Вопрос
Я использую Zend Framework для своего веб-сайта и только что создал специальный модуль "api" для создания...Ну, API.
Теперь у меня в моем модуле много контроллеров, и я хотел бы создать подкаталоги в этом каталоге controllers, чтобы "привести его в порядок".Моя новая структура была бы примерно такой :
- controllers/
- controllers/contents/[controllers]
- controllers/users/[controllers]
- controllers/misc/[controllers]
Однако я нахожусь в полной неспособности найти, какие URL-адреса и перенаправления с использованием Zend_Controller_Router_Route могли бы быть сопоставлены с этими контроллерами.Возможно ли это как-то сделать или я должен просто вернуться к обычной структуре и поместить все мои контроллеры в один каталог?
Я попытался использовать разделители _, как предложено smack0007, и поскольку это казалось логичным, учитывая, как Zend Framework обычно ссылается на подкаталоги, но я получил сообщение об ошибке.
Редактировать :Удалил длинный текст ошибки, поскольку он не был связан с вопросом, поскольку это была проблема только из-за того, что я не использовал регистр propre, полагая, что мне нужно было поместить верхний регистр в первую букву каталога.Теперь все работает хорошо.
Решение
Я делал это в project еще в версии 1.5, но я не знаю, будет ли это работать больше.
Вы должны добавить к своим контроллерам префикс "{FOLDER}_", а затем использовать полное имя в URL-адресе.
Итак, в вашем случае у вас был бы контроллер с именем:
contents_FooController
и маршрут:
/contents_foo/index
Другие советы
Я пытался выполнить несколько уровней по 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