Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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 如何检查控制器插件preDispatch中是否存在操作_Php_Zend Framework_Zend Controller Plugin - Fatal编程技术网

Php 如何检查控制器插件preDispatch中是否存在操作

Php 如何检查控制器插件preDispatch中是否存在操作,php,zend-framework,zend-controller-plugin,Php,Zend Framework,Zend Controller Plugin,我有两个默认模块和移动模块移动模块是一个重写jquery移动默认门户,但控制器和操作要少得多! 我想写一个控制器插件,检查模块mobile中是否存在控制器和操作,如果不存在,我想将模块mobile改写为默认值。 我试试这个: public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $dispatcher = Zend_Controller_Front::getInstance()-&

我有两个默认模块和移动模块移动模块是一个重写jquery移动默认门户,但控制器和操作要少得多! 我想写一个控制器插件,检查模块mobile中是否存在控制器和操作,如果不存在,我想将模块mobile改写为默认值。 我试试这个:

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
    $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
    if ($request->getModuleName() == 'mobile') {      
        if (!$dispatcher->isDispatchable($request)) {
            // Controller or action not exists
            $request->setModuleName('default');
        }
    }
    return $request;
}
但是$dispatcher->isDispatchable$请求返回值始终为true,尽管操作不存在!:s 而我收到的行动foo并不存在,也没有被困在u____ _ _ _ _)呼叫中

我该怎么办?
谢谢

您是否想过如何从应用程序的任何一侧检查zend FM中是否存在控制器/操作?这是密码

    $front = Zend_Controller_Front::getInstance();
    $dispatcher = $front->getDispatcher();

    $test = new Zend_Controller_Request_Http();
    $test->setParams(array(
        'action' => 'index',
        'controller' => 'content',

            )
    );

    if($dispatcher->isDispatchable($test)) {
        echo "yes-its a controller";
        //$this->_forward('about-us', 'content'); // Do whatever you want
    } else {
        echo "NO- its not a Controller";
    }
编辑

这样检查

$classMethods = get_class_methods($className);
 if(!in_array("__call", $classMethods) &&
 !in_array($this->getActionMethod($request), $classMethods))
 return false;

另外请参见

我建议您通过配置资源管理器、引导或前端控制器插件进行静态或动态路由:

在Bootstrap.php中定义静态路由的示例:

public function _initRoutes()
{
    $front = Zend_Controller_Front::getInstance();
    $router = $front->getRouter(); // default Zend MVC routing will be preserved

    // create first route that will point from nonexistent action in mobile module to existing action in default module
    $route = new Zend_Controller_Router_Route_Static(
        'mobile/some-controller/some-action', // specify url to controller and action that dont exist in "mobile" module
        array(
            'module' => 'default', // redirect to "default" module
            'controller' => 'some-controller',
            'action' => 'some-action', // this action exists in "some-controller" in "default" module
        )
    );
    $router->addRoute('mobile-redirect-1', $route); // first param is the name of route, not url, this allows you to override existing routes like default route

    // repeat process for another route
}
这将有效地将/mobile/some controller/some action请求路由到/default/some controller/some action

某些控制器和某些操作应替换为正确的控制器和操作名称

我使用的是静态路由,如果路由到精确的url,这是可以的,但由于大多数应用程序在url中使用额外的参数供控制器操作使用,所以最好使用动态路由。 在上面的示例中,只需将route creation类更改为Zend_Controller_Router_route,并将route url更改为mobile/some Controller/some action/*即可动态路由每个请求,如示例所示:

/mobile/some-contoller/some-action/param1/55/param2/66 
will point to 
/default/some-controller/some-action/param1/55/param2/66

有关ZF1路由的更多信息,请检查

不工作!在我的例子中,控制器存在,但操作no和$dispatcher->isDispatchable$test始终返回true!!!感谢您的回复,但定义为$className?您是否检查了链接此策略不好,因为我必须能够理解您的要求,才能更改要设置的布局!:只是因为你不明白这并不意味着这是一个糟糕的策略;我将编辑我的答案以使其更清晰谢谢你的回复,但我不喜欢这种策略,因为如果将来我在项目中添加新股,我将被迫添加一条路线,而我想要一种适合所有季节的方法!:D查看关于ZF1路由的链接,类似的问题可以通过动态路由解决。此外,stackoverflow上还有大量的路由问题,您可以查看。