2

別の URL にリダイレクトせずに、コントローラへのリクエストを特定のアクションに転送したいと考えています。

たとえば、次の URL:
/home/peter
は内部的に
/home/people/peterになる必要があります。

「init」関数でアクション名 (「peter」) をキャッチして、Controller::redirect を実行できることはわかっていますが、同じ URL にとどまりたいので、要求を内部的に「人」に転送するだけです。 ' アクション。

2 つの注意事項:

  • 「ピーター」は動的文字列なので、ルートをハードコードすることはできません
  • コントローラーの他のアクションは引き続き機能するため、いくつかの文字列のみを転送する必要があります (たとえば、'peter'、'ann' は 'people' アクションに転送されますが、'otherAction' は引き続き呼び出し可能です)。

Controller クラスで「handleAction」メソッドと「handleRequest」メソッドを既に見つけましたが、自分のタスクでそれらをどのように利用するか想像できません。

シルバーストライプのバージョン: 3.0.3

4

2 に答える 2

3

アクションへの特定のルートを定義できるように、ここstatic $url_handlersで説明したの使用をお勧めします。ユースケースは、キャッチオール URL ハンドラーを使用することで実現できます。

ただし、各ルートの順序に注意する必要があります。キャッチオール ルートは最後に定義する必要があります。他のすべてのアクションには、前に別の URL ハンドラーが必要です。

public static $url_handlers = array(
    'otherAction' => 'otherAction',
    // ...
    'people/$Name' => 'people',
    '$Name' => 'people' // catch-all
);

これはあなたの説明に合うはずです。最後のルートは、以前に処理されなかったすべての動的ルートをキャッチします。

しかし、Ingo が述べたように、どちらのルートでも同じコンテンツが配信されるため、SEO に悪影響を与える可能性があります。people/$NameURL への 301 リダイレクトのみを行う別のアクションに2 番目のルートをターゲットにすることができ$Nameます。公開コンテンツが既にあり、既存の URL を短いバージョンに置き換えたい場合は、これをお勧めします。

これで問題が解決することを願っています (一時的に)。

于 2012-11-29T22:14:53.177 に答える
1

まず第一に、重複する URL を作成する正当な理由があると思います (SEO に悪い) :)

で少し試してみましたがDirector::direct()、これが最もクリーンですが、どこにも行きませんでした。Director::test()ほとんどのリクエスト状態をリセットするため、資格もありません。handleRequest()orhandleAction()を新しいコントローラ インスタンスで呼び出すのは注意が必要です。これDirectorは、その時点までにすでに多くの状態が構築されているためです (たとえば、コントローラ スタックにプッシュされるなど)。

残念ながら、SilverStripe のルーティングはそれほど柔軟ではなく、何をしてもシステム内部に深く入り込み、次のリリースで壊れる可能性があります。

于 2012-11-29T10:08:47.843 に答える