1

会社のウェブサイトを CakePHP で書き直していますが、次のことを行う方法を見つける必要があります。

  1. ユーザーは、特定のメディア広告 (雑誌、Web プロモーションなど) 用に事前に生成されたプロモーション エイリアス URL の 1 つを使用して、当社のサイトにアクセスします。
  2. URL はエイリアス URL のデータベースに対してチェックされ、エイリアスが存在する場合は、特定のトラッキング コードがセッションに書き込まれます。

いくつかのオプションを検討しましたが、この目的には適していないようです。彼らです:

  1. ルックアップ スクリプトを appcontroller の beforeFilter() に配置して、すべてのコントローラーに含まれるようにします。(一度だけ実行されるようにセッション値を書き込みます。)
    • このオプションは、既存のコントローラーに対してのみ機能し、URL が存在しない場合、Cake の「コントローラーが見つかりません」というエラーが発生します。
  2. Routes.php の各エイリアスの特定のルート - 機能しますが、管理インターフェイスを介して定期的に追加/削除される数百のエイリアス URL が存在する可能性があります。
  3. すべてのサイト URL を独自のアクションにルーティングし、ルックアップ スクリプトにマップされるエイリアス URL に対して「その他すべて」のルールを設定します。- メッシーで組み込みの Cake ルーティングが失われます。
  4. カスタム 404。 - これらの URL に対して 404 を返したくありません。実際に何にもマッピングされていない場合を除き、悪い習慣だと感じているからです。

このルックアップ/トラッキング スクリプトを配置できるアプリケーション フロー内の場所で、私は実際に行うことができました。

編集: また、say 'promo' という名前のサブフォルダーがこれを簡単に実行できることはわかっていますが、古いサイトの古い URL がたくさんあり、それらも処理する必要があります。

4

2 に答える 2

5

注:プロモーションURLは「domain.com/advert-259」などの形式(つまり「domain.com/adverts/advert-259」ではない)であると想定しています。単純すぎます :)

うまくいけば、いくつかの正規表現でルーティングを使用できます。これを/config/routes.phpに追加して、別の正規表現が役立つかどうかを知らせてください:)

$controllers = Configure::listObjects('controller');

foreach ($controllers as &$value)
{
    $value = Inflector::underscore($value);
}

Router::connect('/:promo', array('controller' => 'promos', 'action' => 'process'), array('promo' => '(?!('.implode('|', $controllers).')\W+)[a-zA-Z\-_]+/?$'));

これで、ですべてのプロモーションコードを処理できますPromosController::process()

基本的に、$ controllers配列内のプロモーションコードを除いて、URL内のプロモーションコードをチェックします(つまり、通常のルートが台無しになることはありません)。

後でConfigure::listObjects()、アプリの速度と要件に応じて、の値をキャッシュすることを検討することをお勧めします。

于 2009-06-03T07:21:36.353 に答える
1

非常に興味深い質問です。私はアイテム#3を使用すると思います。実際はそれほど面倒ではありません。結局のところ、これは通常、私のものではページ コントローラーによって処理されます。それが私がそれを処理する方法です-routes.phpでコントローラーへのルートをハードコードし、プロモーションコードで機能するmatchallルートを用意します。これにより、従来の URL を保持できるだけでなく、多くの標準的なケーキを使用することもできます (おそらく、コントローラーの各ルートを明示的に指定する必要があるだけで、面倒なことではありません...)。 404エラーのクールなもの-そこにいくつかのロジックを入れて、彼らがどこに行こうとしていたかを理解しようとすることができるので、404をスーパーパワーにすることができます.

于 2009-06-02T18:00:38.720 に答える