3

我在谷歌上搜索,我得到了这个代码来检查控制器是否存在。

$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/{anything or any controller} 时,它会按照我在 Boostrap 上定义的方式进行路由。所以,我认为,我需要检查控制器是否存在,如果不存在则执行路由。

我错了吗?在第一次回答后,我添加了插件,并将其放在 _initPlugin 下进行注册。但看起来它不起作用。

这是我的 boostrap 文件:

<?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() {


    }


}
4

2 回答 2

3

您应该将该代码放在控制器插件中,因为请求对象在引导时尚不存在。

有问题的$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 插件可用于此目的。

于 2012-05-17T00:13:33.093 回答
0

您应该将路线从最具体到不太具体。还要考虑在 URL 中是否不能有任何其他选项 - 例如 /u/ :username或 /user/:username,这可以解决问题;)

还为每个控制器定义每一端的路线将解决它 - 创建:

/controller-name/
/profile-controller-name/
... with
/:username
at the end of the list

这样任何控制器都可以更早地匹配并且可以工作。只有未列出的控制器才会“通过” :username 路由。

于 2012-05-18T21:30:27.093 回答