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: 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 20行目

だから基本的に私は今立ち往生しています。少なくとも正しい方向に私を指摘または案内してもらえますか?

4

1 に答える 1

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();
}
于 2016-12-23T10:30:10.073 に答える