2

2つの特別な方法が必要です。

  • すべてのURLに対して実行されるもの
  • 特定のパスに対してのみ実行されるもの(/ admin

最も一般的なのはを使用することであり、 /adminbeginのメソッドはを使用すると思いました。たとえば、次の2つのCatalystコントローラーでは次のようになります。auto

package MyApp::Controller::Root;

sub begin :Private {
    my ($self, $c) = @_;

    $c->log->debug('Run for all URLs');
}

[...]

package MyApp::Controller::Admin;

sub auto :Private {
    my ($self, $c) = @_;

    $c->log->debug('Run for /admin only');
}

しかし、これは私が望むものを達成しません。正しい解決策は何ですか?

編集:問題は、/adminまたは/admin /Addmin::auto()にアクセスしたときではなく、呼び出されないことです。

さらにテストした後、autoが呼び出されることはありません。私はさまざまな場所に自動車を置いてみました、それは決して呼ばれません。

4

3 に答える 3

3

あなたが説明したことがあなたが必要とすることをしない理由は明らかではありません。それが正しい方法です。

ログには、ディスパッチパスと、リクエストがこれらのアクションを介してルーティングされたかどうかが表示されます。そうでない場合は、それがどのように処理されているかを教えてくれます。

各サブの2行目は、「;」で終了する必要があります。これは、元のコードではなく、SOのタイプミスだと思います。

于 2009-10-28T05:20:21.207 に答える
3

問題は実際には次のとおりです。両方のコントローラーに次の行がありました。

__PACKAGE__->config->{namespace} = '';

これにより、自動機能が Admin.pm でトリガーされなくなりました。

于 2009-11-02T03:34:26.983 に答える
1

Controller :: Adminに開始アクションがありますか?RETが言うように、あなたが物事を説明した方法はうまくいくはずです。「グローバル開始」に関する唯一の注意点は、他のコントローラーに開始を配置すると、アクションごとに1つの開始のみが実行され、「最も具体的な」開始であるため、グローバルコントローラーを「シャドウ」することです。プライベートパス名前空間の)。

于 2009-10-28T10:50:16.383 に答える