在我的应用程序中,我为每个操作都有一个路径(文字或段)。我没有使用一条全球路线,因此路线的数量已经大大增加了44个以上的模块(以及未来更多)。
这是我的理解(从我在代码中看到的),在每个页面请求中,zend将所有这些路由抛出到数组中并搜索匹配,这可能是应用程序的瓶颈(我是对的吗?)< / p>
所以我在想为什么不在带有索引的db表中缓存匹配的路由来加速搜索?
第一个问题:这会使系统性能更好吗?
所以我的第一个问题是跳过系统路由匹配机制。这是我尝试但它不起作用:
public function onBootstrap(MvcEvent $e)
{
$em = StaticEventManager::getInstance();
$em->attach('Zend\Mvc\Application', MvcEvent::EVENT_ROUTE, array($this, 'onRoute'), 100);
}
public function onRoute(MvcEvent $e)
{
//var_dump($e->getRouteMatch());//->null routing has not been done yet
/* @var $router \Zend\Mvc\Router\Http\TreeRouteStack */
$router = $e->getRouter();
//-------------------------------------created a dummy route
$routeMatch = new \Zend\Mvc\Router\RouteMatch(array(
'controller' => 'Links\Controller\Items',
'action' => 'view',
'catId' => 0
));
$routeMatch->setMatchedRouteName('app/links');
$e->setRouteMatch($routeMatch);//set the dummy route
//--------------------------------------------PROBLEM HERE
//detach the onRoute event from routeListener
$e->getApplication()
->getServiceManager()
->get('RouteListener')
->detach($e->getApplication()->getEventManager());
}
执行detach方法但仍会执行onRoute事件并将url与正确的路由匹配。那么如何绕过(跳过|分离)路由匹配?
答案 0 :(得分:3)
您无法分离监听器的原因是您已经处于route
事件中。到那时,所有听众都被编组在一起并排队等待执行。
为什么不事先将听众排除在等式之外?
public function onBootstrap(MvcEvent $e)
{
$app = $e->getApplication();
$events = $app->getEventManager();
$shared = $events->getSharedManager();
$services = $app->getServiceManager();
$routeListener = $services->get('RouteListener');
$routeListener->detach($events);
$shared->attach('Zend\Mvc\Application', MvcEvent::EVENT_ROUTE, array($this, 'onRoute'), 100);
}