1

ユーザーがコントローラーAdmin\Controller\Signとアクションにログに記録されていないすべてのリクエストに一致させたいinです。私はこのコードをファイルのonBootstrap()メソッドに記述しました:Module.php

if (!$authService->hasIdentity()) {
    $routeMatch = new RouteMatch(
        array(
            'controller' => 'Admin\Controller\Sign', 
            'action'     => 'in'
        )
    );

    $event->setRouteMatch($routeMatch);
}

エラーは発生しませんが、コードが機能しません。なぜですか?

4

2 に答える 2

4

ここでの問題は、アプリケーションルートイベント(MvcEvent :: EVENT_ROUTE)が(MvcEvent :: EVENT_BOOTSTRAP)の後にトリガーされることです。つまり、ブートストラップレベルでルート一致を設定している場合でも、アプリケーションはMvcEvent::EVENT_ROUTEの後にリクエストのルート一致でルート一致をオーバーライドします。

このオーバーライドを回避したい場合は、ルートイベントのリスナーを非常に低い優先度で追加して、オーバーライドされないようにする必要があります。

$e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, array($this, 'onRouteEvent'), -1000000);

注:onRouteEventは、ルートイベントを処理するModuleクラスのメソッドになります(コードと同様)。

ブートストラップレベルで実行されているアプリケーションを短絡させたい場合は、リダイレクトコードを含むヘッダーをクライアントに送信することができます。

//get the url of the login page (assuming it has route name 'login')
$url = $e->getRouter()->assemble(array(), array('name' => 'login'));
$response=$e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
$response->sendHeaders();
于 2012-12-26T07:44:00.333 に答える
1

adminモジュールの下のmodule.config.phpのroutesセクションに以下のようにルートエントリsign_inを追加します

'sign_in' => array(
    'type'    => 'Segment',
    'options' => array(
        'route' => '/admin/sign/in',
        'defaults' => array(
            'controller' => 'sign',
            'action'     => 'in',
        ),
    ),
),

このようにコントローラーでルートを呼び出します

$this->redirect()->toRoute('sign_in');
于 2012-12-26T06:35:25.193 に答える