ZF Zend_Controller_Router_Route_Module С и без маршрута по умолчанию для модуля
У меня есть проект, который я начал без использования структуры модулей в ZF 1, теперь мне нужно разместить структуру модулей для управления пользователями (для меня это более логично).
Моя проблема, маршрут "по умолчанию" должен пытаться идти с:controller/:action/:id и маршрут модуля
должен идти с:module/:controller/:action/:id по умолчанию от ZF 1 - использовать вышеупомянутое без: id
но моя "логика" требует поля: id, как я могу заставить эту работу?
То, что я пытался прийти к:
protected function _initModuleAutoload()
{
$modelLoader = new Zend_Application_Module_Autoloader(
array('namespace' => 'DM',
'basePath' => APPLICATION_PATH . '/modules/default')
, array('namespace' => 'UM',
'basePath' => APPLICATION_PATH . '/modules/users')
);
$modelLoader->addResourceType('service', 'services', 'Service');
$modelLoader->addResourceType('serviceplugin', 'services/plugins', 'Service_Plugin');
return $modelLoader;
}
public function _initFrontController()
{
$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$route1 = new Zend_Controller_Router_Route(
':module/:controller/:action/:id/',
array(
'id' => '\d+'
, 'module' => 'default'
, 'controller' => 'index'
, 'action' => 'index'
)
);
$router->addRoute('default', $route1);
$front->addModuleDirectory(APPLICATION_PATH . "/modules/");
$front
->registerPlugin(new Far_Access_Plugin_Identity(), 1)
->registerPlugin(new Far_Access_Plugin_Access(), 2)
->throwExceptions(true)
;
return $front;
}
Также попытался создать второй маршрут для пользователей вместо по умолчанию, но не сработало.
Есть идеи? Что я делаю неправильно?
Помощь от irc в freenode была предоставлена в канале #zftalk, когда я предоставил эту ссылку.
Bittarman: crash82: добавить требования к идентификатору, поэтому он должен быть [\ d] +
Bittarman: или просто добавьте экземпляр Zend_Controller_Router_Route_Module, прикованный к Zend_Controller_Router_Route, с просто: id в нем, со значением по умолчанию для id, например, false.
Bittarman: также _initModuleAutoload - это бессмысленно. Bittarman: наличие вашего модуля "по умолчанию" в директории модулей - это неправильно
Bittarman: и вы останавливаете работу ресурса frontcontroller, имея _initFrontController
Bittarman: поэтому resources.frontController больше не будет работать.crash82: гул... Так много проблем:(, поэтому я могу просто поместить модуль "по умолчанию" в каталог приложения, и любые другие модули могут продолжать загружаться из модуля / пути?
Биттарман: да:)
crash82: собираюсь попробовать этот Bittarman: и каждый модуль, который имеет загрузчик, предоставляет свой собственный загрузчик ресурсов модуля
Bittarman: итак, если вы продолжите создавать больше, у вас будет по два на каждый модуль.
Биттарман: вы удивитесь, сколько людей это сделает.
Биттарман: s/tht/that/
1 ответ
Когда мне нужно передать параметр в URL в моих скриптах, я использую один из нескольких методов. Для самых простых вещей нет реальной необходимости создавать новый маршрут.
<a href="/music/index/album/id/<?php echo $variable->id ?>"><?php echo $track->album ?></a>
, Передайте параметр как /id/album_id
- используйте помощник вида url ():
<?php echo $this->url(array('controller' => 'index', 'action' => 'index', 'id' => $variable->id)); ?>
Этот помощник также примет модуль в качестве первого параметра. - Первые 2 работают в скриптах вида, чтобы сделать то же самое в контроллере, вы можете использовать помощник действий reidrector:
$this->getHelper('Redirector')->gotoSimple('action'=> 'someAction', 'controller' => 'someController', 'module' => 'someModule', array('id' => $id );
с контроллером, модулем и параметрами, необязательными, по умолчаниюNULL
, - или вы можете использовать метод действия утилиты _forward ():
$this->_forward($action, $controller, $module, array($params))
тот же синтаксис, что и у gotoSimple ().
Существуют и другие способы выполнения этого вида маршрутизации, я оставлю вам возможность найти остальное, но вы можете начать с помощников действий, служебных методов и просмотра помощников.