首页 > 解决方案 > 调度错误事件未连接到 AbstractController 上的共享事件

问题描述

我的错误页面没有按计划工作。我有一个事件,我使用处理填充我的设计资产Application Module的方法在我的内部创建。它适用于除路由不匹配的页面之外的所有页面onBootstrapZend\Mvc\Controller\AbstractController

这是我的设计事件的事件附件代码:

  public function attach(EventManagerInterface $events,$priority=10) {
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'initiateAssets'],1000);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'changeLayout'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'loadJsAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'loadCssAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'loadMetatagAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH,[$this,'setupNavigation'],30);
  }

Application Module Bootstrap Function当路线不匹配时,这是我在 for 中的事件附件。

      $eventManager->attach(
          \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR,
          function ($e) {
              $application    = $e->getApplication();
              $serviceLocator = $application->getServiceManager();
              $match          = $application->getMvcEvent()->getRouteMatch();
              if (null === $match) {
                  $uri = $e->getRequest()->getUri();
                  $params     = [
                      '__NAMESPACE__' => 'Application\Controller',
                      'controller'    => 'Application\Controller\IndexController',
                      'action'        => 'not-found',
                      'locale'        => 'en_US'
                      // Here you can add common params for your application routes
                  ];
                  $routeMatch = new \Zend\Router\Http\RouteMatch($params);
                  $routeMatch->setMatchedRouteName('notFound');
                  $application->getMvcEvent()->setRouteMatch(
                      $routeMatch
                  );
              }
          }

我相当确定这个问题与我将设计事件附加到共享事件管理器有关,在针对单独控制器的调度事件错误期间必须覆盖该事件管理器,尽管我不太确定

我确实记得我的设计资产与特定的模块、控制器和操作相关联。我的数据库中有错误路线,因为application module, index controller, and not-found action这可能是不正确的,并且设计事件只是无法识别映射的路线(基本上,正确的路线信息是什么?)

它似乎也产生了与一般错误相同的结果,因为它显示了错误/索引文件模板,但我的设计事件没有填充设计资产。

标签: eventszend-frameworkzend-framework3

解决方案


您是否尝试附加 EVENT_DISPATCH_ERROR:

  public function attach(EventManagerInterface $events,$priority=10) {
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH_ERROR,[$this,'initiateAssets'],1000);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH_ERROR,[$this,'changeLayout'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH_ERROR,[$this,'loadJsAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH_ERROR,[$this,'loadCssAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH_ERROR,[$this,'loadMetatagAssets'],30);
      $events->getSharedManager()->attach('Zend\Mvc\Controller\AbstractController',
          MvcEvent::EVENT_DISPATCH_ERROR,[$this,'setupNavigation'],30);
  }

推荐阅读