ZF Zend_Controller_Router_Route_Module使用和使用模块默认路由

时间:2012-04-29 12:30:57

标签: zend-framework zend-route zend-framework-modules zend-router

我有一个项目女巫,我开始没有在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;
}

还尝试为用户创建第二个路径而不是默认路由但不起作用。

有什么想法吗?我究竟做错了什么?

当我提供此链接时,在频道#zftalk中提供了freenode中irc的帮助。

  

Bittarman:crash82:为id添加需求,因此必须是[\ d] +
  Bittarman:或者,只需添加一个实例   Zend_Controller_Router_Route_Module链接到   Zend_Controller_Router_Route,其中只有:id,默认设置   对于像假的id   Bittarman:同样,_initModuleAutoload,毫无意义   Bittarman:在模块dir中有你的'默认'模块,有点儿   错
  Bittarman:你停止前控制器资源   通过_initFrontController工作   Bittarman:所以resources.frontController将不再有效。

     

crash82:哼......这么多问题:(,所以我可以放置   “默认”模块进入应用程序目录和任何其他模块   可以继续从模块/路径加载?

     

Bittarman:是的:)

     

crash82:试试吧   Bittarman:并且,每个具有引导程序的模块都提供自己的模块资源加载器
  Bittarman:所以,如果你创造更多这样的东西,你最终会得到两个模块   Bittarman:你会惊讶于有多少人这样做   Bittarman:s / tht / that /

1 个答案:

答案 0 :(得分:0)

当我需要在脚本中的url中传递参数时,我使用了几种方法中的一种。对于大多数简单的事情,没有必要创建新的路线。

  1. <a href="/music/index/album/id/<?php echo $variable->id ?>"><?php echo $track->album ?></a>。将参数传递为/ id/album_id
  2. 使用url()视图助手:<?php echo $this->url(array('controller' => 'index', 'action' => 'index', 'id' => $variable->id)); ?>此助手也会将模块作为第一个参数。
  3. 前两个工作在视图脚本中,要在控制器中执行相同的操作,您可以使用reidrector操作助手:$this->getHelper('Redirector')->gotoSimple('action'=> 'someAction', 'controller' => 'someController', 'module' => 'someModule', array('id' => $id );,控制器,模块和参数是可选的,默认值为NULL
  4. 或者您可以使用动作实用程序方法_forward():$this->_forward($action, $controller, $module, array($params))与gotoSimple()具有相同的语法。
  5. 还有其他方法可以实现这种路由,我会留给您查找其余的路由,但您可以从Action Helpersutility methodsview helpers