11

Cart という名前のモジュールがあり、何らかの条件が満たされた場合にユーザーをリダイレクトしたいとしましょう。アプリケーションがコントローラーに到達する前に、モジュールのブートストラップ段階でリダイレクトを配置したいと考えています。

したがって、モジュールコードは次のとおりです。

<?php
namespace Cart;

class Module
{
    function onBootstrap() {
        if (somethingIsTrue()) {
            // redirect
        }
    }
}
?>

Url コントローラー プラグインを使用したかったのですが、この段階ではコントローラー インスタンスが利用できないようです。少なくとも、取得方法がわかりません。

前もって感謝します

4

4 に答える 4

31

これにより、必要な作業が実行されます。

<?php
namespace Cart;

use Zend\Mvc\MvcEvent;

class Module
{
    function onBootstrap(MvcEvent $e) {
        if (somethingIsTrue()) {
            //  Assuming your login route has a name 'login', this will do the assembly
            // (you can also use directly $url=/path/to/login)
            $url = $e->getRouter()->assemble(array(), array('name' => 'login'));
            $response=$e->getResponse();
            $response->getHeaders()->addHeaderLine('Location', $url);
            $response->setStatusCode(302);
            $response->sendHeaders();
            // When an MvcEvent Listener returns a Response object,
            // It automatically short-circuit the Application running 
            // -> true only for Route Event propagation see Zend\Mvc\Application::run

            // To avoid additional processing
            // we can attach a listener for Event Route with a high priority
            $stopCallBack = function($event) use ($response){
                $event->stopPropagation();
                return $response;
            };
            //Attach the "break" as a listener with a high priority
            $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, $stopCallBack,-10000);
            return $response;
        }
    }
}
?>
于 2013-01-05T10:33:03.103 に答える
7

もちろん、リスナーをイベントにアタッチする必要があるため、エラーが発生します。次の例では、SharedManager を使用し、リスナーを にアタッチしAbstractActionControllerます。

もちろん、リスナーを別のイベントにアタッチすることもできます。以下は、それがどのように機能するかを示すための実際の例です。詳しくはhttp://framework.zend.com/manual/2.1/en/modules/zend.event-manager.event-manager.htmlをご覧ください。

public function onBootstrap($e)
{
    $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
        $controller = $e->getTarget();
        if (something.....) {
            $controller->plugin('redirect')->toRoute('yourroute');
        }
    }, 100);
}
于 2013-05-18T07:56:34.370 に答える
-1

ページがエラーで正しくリダイレ​​クトされない

public function onBootstrap($e) {

        $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
        if(someCondition==true) {
           $controller->plugin('redirect')->toRoute('myroute');        
        }
}
于 2014-01-06T11:40:23.903 に答える
-4

これを試していただけますか。

$front = Zend_Controller_Front::getInstance();
$response = new Zend_Controller_Response_Http();
$response->setRedirect('/profile');
$front->setResponse($response);
于 2013-01-05T08:52:33.017 に答える