Zend框架;检查控制器是否存在

时间:2012-05-16 23:34:06

标签: php zend-framework

我在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下进行注册。但看起来它不起作用。

这是我的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() {


    }


}

2 个答案:

答案 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用户路由。

相关问题