ZFC Rbac UnauthorizedStrategy и Zend Framework 3

Я прочитал документацию по стратегиям и кажется, что приведенный ниже код действителен, по крайней мере, в Zend Framework 2. Конечно, я его тестировал.

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

Но при использовании Zend Framework 3 он больше не работает. Он покажет ошибку ниже:

Неустранимая ошибка: Uncaught TypeError: Аргумент 2, переданный в Zend\EventManager\EventManager::attach(), должен быть вызываемым, переданным объектом, вызываемым в /var/www/sub.domain.tld/html/module/Application/src/Module. php в строке 20

Так что в основном я застрял прямо сейчас. Можете ли вы хотя бы указать или направить меня в правильном направлении?


person James Lloyd Atwil    schedule 23.12.2016    source источник


Ответы (1)


Я должен бросить 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();
}
person James Lloyd Atwil    schedule 23.12.2016