4

Module.php で呼び出され、ブートストラップにアタッチされる ACL に取り組んでいます。

明らかに、ACL はサイトの特定の領域へのアクセスを制限するため、リダイレクトが必要になります。ただし、リダイレクトにコントローラー プラグインを使用しようとすると、プラグインがコントローラーを必要とするように見えるため、機能しません。

コントローラの外部から外部にリダイレクトする最良の方法は何ですか? 定義済みのルートを使用する必要があるため、通常の header() 関数は適していません。

どんな助けでも素晴らしいでしょう!

乾杯-

4

1 に答える 1

9

一般に、応答を返すことでディスパッチ プロセスを短縮します。途中で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;
        }
    }
}
于 2013-01-23T00:15:15.477 に答える