Php 派遣一名控制员';s对ZF2路由的操作未找到异常
我想在Zf2 raise route not found异常时调度另一个控制器操作以显示我的自定义页面(我不想显示自定义错误页面)。我正在研究Zf2中数据库的动态url,只有在找不到路由时才会出现。 我在引导函数中添加了一个事件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
$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 ...
)