Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend框架;检查控制器是否存在_Php_Zend Framework - Fatal编程技术网

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