我在Google上搜索过,我收到此代码以检查控制器是否存在。
$front = Zend_Controller_Front::getInstance();
if ($front->getDispatcher()->isDispatchable($request)) {
// Controller exists
}
但我不知道应该把这段代码放在哪里。什么是$request
?
我在 Boostrap.php 。我有_initRoute
,我需要检查一个控制器是否不存在,如果没有,那么我将添加一个新的路由。
第一个回答后更新。我在Boostrap.php中有一些路线
public function _initRoute() {
$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$router->addRoute(
'username',
new Zend_Controller_Router_Route(':username',
array('controller'=>'profile',
'action'=>'index')
)
);
$router->addRoute(
'username/sets',
new Zend_Controller_Router_Route(':username/sets',
array('controller'=>'profile',
'action'=>'sets')
)
);
}
此路线,将使mydomain.com/{username}显示与mydomain.com/profile/index/username/{username}相同的内容
但问题是,当我键入mydomain.com/inanything或任何控制器}时,它会按照我在Boostrap上定义的路由。因此,我认为,我需要检查控制器是否存在,如果不存在则执行路由。
我错了吗?在第一次回答之后,我添加了插件,并将其放在_initPlugin下进行注册。但看起来它不起作用。
<?php
//Zend_View_Helper_PaginationControl::setDefaultViewPartial('paginator.phtml');
class Plugin_MyX extends Zend_Controller_Plugin_Abstract {
public function routeStartup(Zend_Controller_Request_Abstract $request) {
$front = Zend_Controller_Front::getInstance();
$dispatcher = $front->getDispatcher();
if (!$dispatcher->isDispatchable($request)) {
$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$router->addRoute(
'username',
new Zend_Controller_Router_Route(':username',
array('controller'=>'profile',
'action'=>'index')
)
);
$router->addRoute(
'username/sets',
new Zend_Controller_Router_Route(':username/sets',
array('controller'=>'profile',
'action'=>'sets')
)
);
} else {
// exist
}
}
}
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initPlugin() {
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Plugin_MyX());
}
public function _initRoute() {
}
}
答案 0 :(得分:3)
您应该将该代码放在Controller Plugin中,因为请求对象在引导时尚不存在。
有问题的$request
变量是Zend_Controller_Request_Http
的对象。最初在前端控制器发送请求时创建此对象。
您可以注册routeStartup
插件并将代码放在那里。这将是您可以使用Request对象的最早点。除dispatchLoopShutdown()
之外,所有控制器插件链都会将请求对象传递给您的插件。
以下是示例插件代码:
class Application_Plugin_Example
{
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$front = Zend_Controller_Front::getInstance();
if ($front->getDispatcher()->isDispatchable($request)) {
// Controller exists
}
}
}
如果您只是尝试处理404错误,那么ErrorHandler plugin就可以用于此目的。
答案 1 :(得分:0)
您应该拥有从最具体到不具体的路线。还要考虑一下你的URL中是否还有其他选项 - 比如/ u / :username 或/ user /:username,这样可以解决问题;)
同样为每个控制器定义每个端点的路由可以解决它 - 创建:
/controller-name/
/profile-controller-name/
... with
/:username
at the end of the list
这样任何控制器都会提前匹配并且可以正常工作。并且只有未列出的控制器会“掉进”:username用户路由。