我正在使用 Zend 框架 1.12,试图提出自定义路由。
我正在尝试创建看起来像 facebook 的个人资料 URL ( http://facebook.com/username ) 的东西。所以,起初我尝试了这样的事情:
$router->addRoute(
'eventName',
new Zend_Controller_Router_Route(
'/:eventName',
array(
'module' => 'default',
'controller' => 'event',
'action' => 'detail'
)
)
);
每当我尝试运行 mydomain.com/something 时,我都会收到以下错误:
致命错误:在第 336 行的 /var/desenvolvimento/padroes/zf/ZendFramework-1.12.0/library/Zend/Controller/Plugin/Broker.php 中未捕获异常 'Zend_Controller_Router_Exception' 并带有消息 'eventName is not specified'
不仅我无法使那段代码工作,我所有的默认路由(显然)都被覆盖了。因此,例如,我有诸如“mydomain.com/admin”之类的东西应该将我发送到 Index 控制器上的“admin”模块,但现在返回相同的错误(因为它与 / 的模式相同:事件名称)。
我需要做的是创建这个自定义路由,而不覆盖默认路由并实际工作(dûh)。
我已经检查了在线文档和谷歌上的很多(很多)东西,但我没有找到与我遇到的错误或如何不覆盖默认路由相关的任何内容。我会很感激任何可以为我指明正确方向的东西。
谢谢。
编辑¹:我设法让它工作,但我根本没有使用任何路由。我刚刚用以下内容制作了一个插件:
public function preDispatch(\Zend_Controller_Request_Abstract $request) {
if (!\Zend_Controller_Front::getInstance()->getDispatcher()->isDispatchable($request)) {
$request->setModuleName($this->_eventRouter["module"]);
$request->setControllerName($this->_eventRouter["controller"]);
$request->setActionName($this->_eventRouter["action"]);
}
}
不过,这感觉像是一个丑陋的解决方法……正如Tim Fountain指出的那样,我的事件是动态的(我从数据库中加载它们),所以我无法对其进行硬编码。此外,我当前的实现使我不必对每个模块/控制器/动作组合进行硬编码。
我只想知道是否有办法避免使用插件。
EDIT²:我不再做那个糟糕的插件了。我弄清楚是什么导致了路由器错误。我的路由定义没有变量“eventName”的有效默认值。我的解决方法是:
$router->addRoute(
'eventName',
new Zend_Controller_Router_Route(
'/:eventName',
array(
'module' => 'default',
'controller' => 'event',
'action' => 'detail',
'eventName' => ''
)
)
);
我仍然无法创建具有“冲突”模式的路由,例如/admin和/:eventName。如果有办法让/admin覆盖/:eventName ...