2016-12-23 7 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') 
    ); 
} 

젠드 프레임 워크 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(); 
}