1

我有两个模块(默认和移动)模块 mobile 是在 jquery 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($request)总是返回!true:S 并且我收到“操作foo不存在并且没有被困在 __call() 中”

我能怎么做?谢谢

4

2 回答 2

0

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

在 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

some-controllersome-action应替换为正确的控制器和操作名称。

我使用的是静态路由,如果您路由到确切的 url,这没问题,但是由于大多数应用程序在 url 中使用额外的参数来使用控制器操作,所以最好使用动态路由。
在上面的示例中,只需将路由创建类更改为Zend_Controller_Router_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 中路由的更多信息,请查看此链接

于 2013-08-01T09:09:45.810 回答
0

你有没有想过如何从应用程序的任何一侧检查 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;

也请查看详细链接

于 2013-08-01T08:40:23.537 回答