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

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

3

Решение

Я должен бросить 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();
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]