一般に、応答を返すことでディスパッチ プロセスを短縮します。途中でroute
、またはdispatch
通常のコード フローを停止するために応答を返し、結果を直接終了することができます。ACL チェックの場合、その応答を早期に返し、ユーザーのログイン ページにリダイレクトしたい場合がよくあります。
コントローラーで応答を作成するか、プラグインの戻り値を確認して、応答の場合はリダイレクトします。2 番目の方法は、PRG プラグインの仕組みに似ていることに注意してください。
最初の方法の例:
use Zend\Mvc\Controller\AbstractActionController;
class MyController extends AbstractActionController
{
public function fooAction()
{
if (!$this->aclAllowsAccess()) {
// Use redirect plugin to redirect
return $this->redirect('user/login');
}
// normal code flow
}
}
PRG プラグインの動作のような例:
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Http\Response;
class MyController extends AbstractActionController
{
public function fooAction()
{
$result = $this->aclCheck();
if ($result instanceof Response) {
// Use return value to short-circuit
return $result
}
// normal code flow
}
}
プラグインは次のようになります (2 番目のケース)。
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
class AclCheck extends AbstractPlugin
{
public function __invoke()
{
// Check the ACL
if (false === $result) {
$controller = $this->getController();
$redirector = $controller->getPluginManager()->get('Redirect');
$response = $redirector->toRoute('user/login');
return $response;
}
}
}
あなたの質問では、次のように言います。
[...]プラグインにはコントローラーが必要なように見えるため、機能しません。
これは、プラグインで実行したい場合、コントローラー プラグイン内で問題になる可能性があり$this->getController()
ます。ACL プラグインがコントローラーに挿入されるようにするには、拡張Zend\Mvc\Controller\Plugin\AbstractPlugin
または実装する必要があります。Zend\Mvc\Controller\Plugin\PluginInterface
これを望まない場合は、自分で作成した応答を直接返すという代替手段があります。これは少し柔軟性が低く、すでに応答オブジェクトがあるときに応答オブジェクトを作成します (両方の応答で競合が発生する可能性があります) が、プラグイン コードは次のように変更されます。
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\Http\PhpEnvironment\Response;
class AclCheck extends AbstractPlugin
{
public function __invoke()
{
// Check the ACL
if (false === $result) {
$response = new Response;
$response->setStatusCode(302);
$response->getHeaders()
->addHeaderLine('Location', '/user/login');
return $response;
}
}
}