Php 派遣一名控制员';s对ZF2路由的操作未找到异常

Php 派遣一名控制员';s对ZF2路由的操作未找到异常,php,zend-framework2,Php,Zend Framework2,我想在Zf2 raise route not found异常时调度另一个控制器操作以显示我的自定义页面(我不想显示自定义错误页面)。我正在研究Zf2中数据库的动态url,只有在找不到路由时才会出现。 我在引导函数中添加了一个事件 $event->attach('route', array($this, 'loadConfiguration'), 2); 在loadConfiguration函数中,我添加了load public function loadConfiguration(Mvc

我想在Zf2 raise route not found异常时调度另一个控制器操作以显示我的自定义页面(我不想显示自定义错误页面)。我正在研究Zf2中数据库的动态url,只有在找不到路由时才会出现。 我在引导函数中添加了一个事件

$event->attach('route', array($this, 'loadConfiguration'), 2);
在loadConfiguration函数中,我添加了load

public function loadConfiguration(MvcEvent $e){
    $application   = $e->getApplication();
    $sm = $application->getServiceManager();
    $router = $sm->get('router');
    $request = $sm->get('request');
    $matchedRoute = $router->match($request);
if (null == $matchedRoute) { 
        $request_uri = $e->getRequest()->getrequestUri();
        $dbAdaptor = $e->getApplication()->getServiceManager()->get('Zend\Db\Adapter\Adapter');
        $url_table = new UrlMappingTable($dbAdaptor);
        $url_data = $url_table->find($request_uri);
        $controller = $url_data['controller'];
        $action = $url_data['action'];
        $id = $url_data['post_id'];
        $original_url = $url_data['original_url'];
        $alias = $sm->get('Application\Router\Alias');

            $alias->setNavigation($original_url);

        if(isset($url_data)){
        $url = $e->getRouter ()->assemble (array('controller' => $controller,
                                                     'action' => $action ,
                                                      'id' => $id,
                                              ), array (
                                            'name' => 'myurl'
                                            ) );
       }

 print 'no route match';
 }
}

在获得控制器和操作后,我只希望调度器转发此控制器

只是一些没有真正回答你问题的东西:

我正在研究Zf2中数据库的动态url,只有在找不到路由时才会出现

有两种方法可以更有效地实现这一目标。如果路由不多,可以在
route
事件之前加载它们。例如,您可以查询
bootstrap
所有数据库路由,并将它们注入路由堆栈

另一种方法是创建一个“全面覆盖”路由,在所有路由失败后,该路由始终匹配。然后您没有“未找到路由”,但您的默认路由已匹配。然后将查找匹配的数据库记录。如果没有找到,您只需返回404响应

在案例#1中,直接调度由数据库路由映射的控制器。在第二种情况下,您在“数据库控制器”中,想要调度由数据库路由映射的控制器,请使用forward插件:

public function matchAction()
{
    // Fetch route from db here

    if (!$match) {
        $this->getResponse()->setStatusCode(404);
        return;
    }

    return $this->forward($match->getController, array(
        'action' => $match->getAction()
    ));
}

我的项目需要类似的东西。我最后只是在module.config.php中添加了一个“catchall”规则

i、 e

“路由器”=>阵列(
“路由”=>数组(
“catchAll”=>数组(
'type'=>'regex',
“选项”=>数组(
“正则表达式”=>“/(?。+)”,
“默认值”=>数组(
'controller'=>'Project\controller\MyController',
“操作”=>“自定义页面”,
),
“规范”=>“/%page%”,
), 
),
//其他路线项目。。。
),
//其他东西。。。
)

将其作为routes数组中的第一项,使其具有最低优先级。然后你可以让你的定制动作做任何你想做的事情

好的,但是有没有一种方法可以在我使用MvcEvent的代码中使用controller->forward()插件呢
'router' => array(
    'routes' => array(
         'catchAll' => array(
            'type' => 'regex',
            'options' => array(
                'regex' => '/(?<page>.+)',
                'defaults' => array(
                    'controller' => 'Project\Controller\MyController',
                    'action' => 'customPage',
                ),
                'spec' => '/%page%',
            ), 
        ),
        //Other route items ...
    ),
    //Other stuff ...
)