ZF2缓存匹配的路由

时间:2014-03-11 07:57:03

标签: events caching zend-framework2 router

在我的应用程序中,我为每个操作都有一个路径(文字或段)。我没有使用一条全球路线,因此路线的数量已经大大增加了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与正确的路由匹配。那么如何绕过(跳过|分离)路由匹配?

1 个答案:

答案 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);
}