1

phalcon mvc アプリケーションをセットアップする方法を試しています。

現在、テスト用に 2 つのモジュールをセットアップしています。「フロントエンド」と「管理者」。

各モジュールに到達していることを確認できるように、さまざまなビューを設定しています。を変更するdefaultnamespaceと、defaultmodule実際に両方のモジュールが正常にアクセスされ、正常にロードされていることがわかります。これを変更すると、管理コントローラーが正しくアクセスされ、フロントエンド コントローラーがアクセスされていることがわかります。

私が現在抱えている問題は、ユーザーを認証してセッションを開始しようとすると、リクエストを「フロントエンド」から「管理者」に転送することです。

return $this->dispatcher->forward(array(
                'namespace' => 'Qcm\Admin\Controllers',
                'action' => 'index',
                'controller' => 'index'
            ));

繰り返しますが、これらの名前空間が正常に機能することを確認しました。問題は、新しい名前空間に転送すると、管理者インデックス コントローラーが見つからなくなることです。

"Qcm\Admin\Controllers\IndexController handler class cannot be loaded"

defaultnamespaceただし、 /を変更することでモジュールを切り替えることができることは既に確認していますdefaultmodule。これは、別のモジュールに転送できないディスパッチャ内の制限ですか?

明確にするために、同じURLも使用しているため、たとえばログイン後に「/」(ルート)に戻りたいのですが、管理モジュールに転送されているため、これは正常に機能するはずですか?

4

4 に答える 4

2

phalcon ディスパッチャは、同じモジュール内のアクションにのみ転送できます。現在のモジュールの外に転送することはできません。この制限は、ディスパッチャが宣言されているモジュールのみを認識しているためです。

別のモジュールに転送するには、代わりにコントローラー アクションからリダイレクト応答を返す必要があります。私の場合、プラグインの beforeDispatch() メソッドの ACL パーミッションに基づいて、ユーザーをログイン画面または 404 エラー ページに転送したいと考えました。ディスパッチャーはこのメソッドにネイティブですが、ユーザーを現在のモジュールの外に転送することはできません。代わりに、リダイレクトを実行するカスタム アクションを持つ同じモジュール内のコントローラーに、ディスパッチャーにユーザーを転送させます。

// hack to redirect across modules
$dispatcher->forward(
    array(
        'controller'   => 'security',
        'action'       => 'redirect',
        'params'       => array(
            'redirect' => '/home/index/login'
        ),
    )
);
return false; // stop progress and forward to redirect action

これは、各モジュールがそのコントローラーの 1 つにこのカスタム リダイレクト アクションのコピーを持つ必要があることを意味します。これは、すべてのコントローラーの拡張元であるベース コントローラーにアクションを配置することで実現しました。

/**
 * the phalcon dispatcher cannot forward across modules
 * instead, forward to this shared action which can then redirect across modules
 * */
public function redirectAction(){
    $this->view->disable();
    $params = $this->dispatcher->getParams();
    $redirect = '/';
    if( ! empty( $params['redirect'] ) ){
        $redirect = $params['redirect'];
    }
    return $this->response->redirect( $redirect );
}
于 2014-10-14T06:11:17.610 に答える
1

phalcon はすべてのモジュールをグローバル ローダーに追加しなかったため、名前空間は登録されません。現在のモジュールのブートストラップ ファイルに別のモジュールを登録する必要があります。Module.php を次のように変更します。

class Module
{
    public function registerAutoloaders()
    {
        $loader = new \Phalcon\Loader();

        $loader->registerNamespaces(array(
             //Your current module namespaces here
             ....
             //Another module  namespaces here
             'Qcm\Admin\Controllers' => 'controller path',
        ));

        $loader->register();
    }
}
于 2014-07-27T06:32:11.340 に答える