2016-12-23 10 views
3

私はdocumentation on Strategiesを読んでいます。下のコードは少なくともZend Framework 2では有効です。もちろん、私はそれをテストしました。ZFC Rbac UnauthorizedStrategy and Zend Framework 3

public function onBootstrap(EventInterface $e) 
{ 
    $t = $e->getTarget(); 
    $t->getEventManager()->attach(
     $t->getServiceManager()->get('ZfcRbac\View\Strategy\UnauthorizedStrategy') 
    ); 
} 

しかし、Zend Framework 3を使用しても機能しなくなりました。以下のエラーが表示されます:

Fatal error: Uncaught TypeError: Argument 2 passed to Zend\EventManager\EventManager::attach() must be callable, object given, called in /var/www/sub.domain.tld/html/module/Application/src/Module.php on line 20

これで基本的に私は今すぐ立ち往生しています。あなたは少なくとも、正しい方向へ私を指摘したり、案内したりできますか?

答えて

0

私はUnauthorizedStrategyクラスを捨てなければなりません。基本的にはonErrorメソッドのコードをUnauthorizedStrategyクラスからコピーし、私のニーズに合わせて修正しました。

public function onBootstrap(MvcEvent $e) 
{ 
    /** @var EventManager $eventManager */ 
    $eventManager = $e->getApplication()->getEventManager(); 

    $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'onError'], 100); 
} 

public function onError(MvcEvent $event) { 
    // Do nothing if no error or if response is not HTTP response 
    if (($event->getResult() instanceof HttpResponse) 
     || !($event->getResponse() instanceof HttpResponse) 
    ) { 
     return; 
    } 

    $baseModel = new ViewModel(); 
    $baseModel->setTemplate('layout/layout'); 

    $model = new ViewModel(); 
    $model->setTemplate('error/403'); 

    switch ($event->getError()) { 
     case GuardInterface::GUARD_UNAUTHORIZED: 
      $model->setVariable('error', GuardInterface::GUARD_UNAUTHORIZED); 
      break; 

     default: 
      return; // If it is not unauthorized error, skip it so it will show the more appropriate errors. 
    } 

    $baseModel->addChild($model); 
    $baseModel->setTerminal(true); 

    $event->setViewModel($baseModel); 

    $response = $event->getResponse() ?: new HttpResponse(); 
    $response->setStatusCode(403); 

    $event->setResponse($response); 
    $event->setResult($baseModel); 

    $event->stopPropagation(); 
}