Php Zend框架;检查控制器是否存在
我在谷歌上搜索,我得到了这个代码来检查控制器是否存在Php Zend框架;检查控制器是否存在,php,zend-framework,Php,Zend Framework,我在谷歌上搜索,我得到了这个代码来检查控制器是否存在 $front = Zend_Controller_Front::getInstance(); if ($front->getDispatcher()->isDispatchable($request)) { // Controller exists } 但我不知道该把代码放在哪里。什么是$request? 我在Boostrap.php中。我有\u initRoute,我需要检查控制器是否不存在,如果不存在,那么我将添加一
$front = Zend_Controller_Front::getInstance();
if ($front->getDispatcher()->isDispatchable($request)) {
// Controller exists
}
但我不知道该把代码放在哪里。什么是$request
?我在Boostrap.php中。我有
\u 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/{anything或any controller}时,它会按照我在Boostrap上定义的方式路由。所以,我认为,我需要检查控制器是否存在,如果它不存在,则执行路由
我错了吗?在第一次回答之后,我添加了插件,并将其置于_initPlugin下进行注册。但看起来好像没用
这是我的boostrap文件:
您应该将该代码放入,因为在引导时请求对象还不存在
所讨论的$request
变量是Zend\u Controller\u request\u Http
的对象。该对象最初是在前端控制器发出请求时创建的
您可以注册一个routeStartup
插件并将代码放在那里。这将是您可以使用请求对象的最早时间点。除了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错误,那么这就是可以用于此目的的 你应该有从最具体到不太具体的路线。还要考虑在URL中是否不能有任何其他选项,如/u/:username或/user/:username,这将解决问题;)
此外,为每个控制器的每一端定义路由将解决该问题-创建:
/controller-name/
/profile-controller-name/
... with
/:username
at the end of the list
这样,任何控制器都可以更早地匹配并工作。只有未列出的控制器才会“通过”到:username路由 你正在尝试创建一个自定义404页面吗?不,我正在尝试添加一些路由,但只添加现有的控制器。是的,我知道你现在正在处理什么。在我看来,这就像是检查它是否可调度,然后设置您的路线,如果不可以的话。但我看到了你的问题,如果你创建了那些非常基本的路由,它们实际上会否决你绝对不想要的默认路由。你的方法成功了吗?经过两天的思考,我得到了答案。多亏了你的帮助。
/controller-name/
/profile-controller-name/
... with
/:username
at the end of the list