3

私は、既存の大きなリンクカタログを使用して既存のWebサイトを書き直すという任務を負っています。議論のために、リンクカタログを変更するようなことは何もできないと仮定しましょう。使用しているリンク構造の例を次に示します。

  1. アイテムページは次のようになります。

    www.domain.com/widgets/some-totally-awesome-large-purple-widget
    
  2. カテゴリサブページページは次のようになります。

    www.domain.com/widgets/purple-widgets
    
  3. カテゴリの親ページページは次のようになります。

    www.domain.com/widgets/
    
  4. カスタムページは次のようになります。

    www.domain.com/some-random-page
    

さまざまなページタイプが多すぎて、個々のルーターを作成できません。

Router :: connectを使用すると、次のようなものを使用して、最初と2番目のシナリオを簡単に説明できます。

Router::connect('/{:pageroot}/{:pagekey}', 'Pages::index');

次に、Pages :: indexメソッドは、「/ widgets/purple-widgets」の「キー」を持つデータベース内のエントリを検索します。

ただし、フレームワークは、3番目や4番目のようなページのデフォルトで「/ {:controller} / {:action} / {:args}」ルートになります。これがフレームワークの正しい動作であることを私は知っています。また、ベストプラクティスでは、この動作に一致するようにサイトを作成する必要があると述べています。しかし、それはここではオプションではありません。

私が必要としているのは、3番目と4番目の例が最初の例と同じように機能できるようにするルーターです。すべての例はPages::indexコントローラーに送信する必要があります。このコントローラーは、URLパスをキーとして使用してデータベースにクエリを実行します。

4

2 に答える 2

2

URLに、ページ、アイテム、カテゴリの間で何が何であるかについての規則がない場合。非常に一般的なルーターを使用します。

Router::connect('/{:category}/{:page}/{:item}', 'Pages::any');
Router::connect('/{:category}/{:page}', array('Pages::any', 'item' => null));
Router::connect('/{:category}', array('Pages::any', 'page' => null, 'item' => null));

そしてPages::any()、正しいものを探すために。category結局のところpage(例4)ですか?それpageitem(例1)ですか?

また

URLをどこかに保存し(たとえば、データベースのマッピングテーブル) 、リチウムルートpatternのバージョンを使用します。

Router::connect(new Route(array(
    'pattern' => '@^/(?<path>.+)$@',
    'params' => array('controller' => 'pages', 'action' => 'any'),
    'keys' => array('path' => 'path'),
    // extra stuff, if the path is `tata`, it skips this route and uses
    // any of the following ones that matches.
    'handler' => function($request) {
        if ($request->params['path'] == 'tata') {
            return false;
        } else {
            return $request;
        }
    }
)));

その時点から、完全なURLを取得します。

于 2012-01-04T09:32:09.947 に答える
1

おそらく、dbで定義されたルートに基づいてリクエストを処理できるスマートルーターヘルパーを作成する必要があります。

調べてみてください:net / http / Router.php

特にconnect()、parse()、match()

ある種の無名関数を書き始め、それを/extensionにあるテスト可能なクラスに進めます。

于 2012-01-04T10:03:37.980 に答える