0

我有一个项目,我开始时没有在 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,如 false。
Bittarman:另外,_initModuleAutoload,是毫无意义的 Bittarman:在模块目录中拥有“默认”模块,有点错误
Bittarman:并且您通过拥有 _initFrontController
Bittarman 来停止前端控制器资源的工作:因此 resources.frontController 将不再工作。

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

比特曼:是的:)

crash82: 去尝试那个 Bittarman: 并且,每个有引导程序的模块都提供自己的模块资源加载器
Bittarman: 所以,如果你去创建更多这样的东西,你最终会为每个模块创建两个。
Bittarman:你会惊讶于有多少人这样做。
比特曼:s/tht/that/

4

1 回答 1

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. 前 2 个在视图脚本中工作,要在控制器中执行相同的操作,您可以使用 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() 具有相同的语法。

还有其他方法可以完成这种路由,剩下的我会让你找到,但你可以从Action Helpers实用方法视图助手开始

于 2012-05-01T06:44:20.110 回答