0

私は統計を持っており、そこには改善のために多くのものが存在する可能性があり、これは私の概要ページの 1 つのモデルです。私は当初、「action_editimprovementstat」のようなばかげたアクションを持つ 1 つの巨大なコントローラーとしてページを作成しました。

そこで、すべてを「[...]/controller/about」にあるのではなく、「[...]/controller/about/improvement」のようなパースペクティブ フォルダーに移動しました。 /統計」

ルートの正規表現を変更したので、コントローラーはスラッシュを受け入れるようになり、デバッガーによって判断されて機能しました。これは、コントローラーのテキストが「about/improvement/stat」として表示されるようになったためです。残念ながら、要求された URL が「見つかりません。

では、階層的なコントローラー構造を持つ最も簡単な方法は何ですか?

以下は、私が好むコントローラの URL の例です: /about /about/internal /about/external /about/improvement /about/improvement/stat

それらにもアクションがあるため、例: /about/improvement/edit/6 /about/improvement/stat/delete/7

あいまいさの問題がある場合は、喜んで妥協します。(ちなみに、単一のコントローラーを介して独自のルーティングを行った場合、方法を管理できると思いますが、より良い方法があるかどうか、またはその方法が十分に文書化されているかどうか疑問に思っています [他の人の経験から学ぶことができるように]. )

4

2 に答える 2

1

Kohana を学んで以来、私のプログラミング経験は大幅に改善されました。なぜなら、Kohana を学ぶ前は、自分の URL がどのように構築されているかについて少しも考えたことがなかったからです。MVC の世界では、Pretty URL を使用すると、自分が何をしたいのか、どのようにそれを実行するのかを本当に考えさせられます。

上記の例であなたが何をしたいのかを見ると、私の意見では、あなたは後ろ向きに考えているように思えます。あなたが好む URL は /about /about/internal /about/external /about/improvement /about/improvement/stat だとおっしゃいました

「約」は実際にはアクションであり、コントローラーではないように思えます。「/about/」という URL は、私が何についての情報を取得しているかを示していないため、かなり紛らわしいですが、おそらくサイト全般に関するものなので、スライドさせておいて構いません。「/about/internal」はかなり明確ですが、多くの点で、適切な英語で読めるように URL を記述しようとしています。実際には、/about、/internal/about、/external/about、/improvement/about、/improvement_stat/about のように記述します。

おそらくコントローラーをテンプレートコントローラーとして設定していて、それぞれに対してそれを行う必要があると思わない限り、複数のコントローラーを使用することに抵抗している理由がわかりません。あなたはそうしない。一般に、テンプレート コントローラーである「ページ」という名前のコントローラーを作成します。次に、他のすべてのコントローラーがページ コントローラーを拡張します。ページ コントローラーを拡張するすべてのコントローラーで使用できる定数やその他の変数をページ コントローラーで定義できます。

しかし、本当に複数のコントローラーを書くことに抵抗がある場合は、必要なコントローラーとアクションに到達できる特定のルートをいつでも書くことができます。たとえば、最大 4 つの ID をルートに渡す比較にルートを使用しました。そのルートを次のように書きました。

Route::set('thing_compare', 'thing/compare/<thing1>/<thing2>(/<thing3>(/<thing4>))')
    ->defaults(array(
        'controller' => 'thing',
        'action'     => 'compare'
    ));

thing3 と thing4 は括弧で囲まれていることに注意してください。これはオプションであることを意味します。次に、コントローラーで次のようにしてこれらの値を取得できます。

$thing1 = $this->request->param('thing1');

しかし、あなたが与えた例に戻って、次のようなルートを書くだけです(コントローラーの名前が「about」であると仮定します:

Route::set('about_internal', 'about/internal')
    ->defaults(array(
        'controller' => 'about',
        'action'     => 'about_internal'
    ));
Route::set('about_external', 'about/external')
    ->defaults(array(
        'controller' => 'about',
        'action'     => 'about_external'
    ))

個人的には、このようなルートを設定することは避け、賢明な設計戦略を作成するために URL をどのように設定する必要があるかを本当に再考します。

于 2012-10-24T06:19:05.167 に答える
1

住んでいる場合は、変数または定数値をルートに追加するだけです。

Kohanaのドキュメントには、ルートの前に追加のディレクトリが追加された具体的な例も示されています。これには、2 つの値のうちの 1 つしかありません。

Route::set('sections', '<directory>(/<controller>(/<action>(/<id>)))',
    array(
        'directory' => '(admin|affiliate)'
    ))
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

もちろん、前後に値を追加することもできます。唯一の要件は、ルートが常に少なくともコントローラーとアクションになることです。しかし、それらは実際には URL に存在する必要はありません。次のように、他の値と一致し、コントローラーやアクションの定数値を持つルートを指定できます。

Route::set('search', ':<query>', array('query' => '.*'))
  ->defaults(array(
    'controller' => 'search',
    'action' => 'index',
  ));

最大の落とし穴:ルートは追加された順序で一致することを理解することが重要であり、URL がルートと一致するとすぐに、ルーティングは本質的に「停止」され、残りのルートは決して試行されません。デフォルト ルートは、空の URL を含むほぼすべてのものと一致するため、新しいルートはその前に配置する必要があります。多分それは今何がうまくいかないのですか?

とにかく、スラッシュを一致させるためにトリックを追加するのではなく、多数のオプション変数を受け入れるルートを作成したいので、汎用コントローラーから「urlpart1」から「urlpartX」を読み取ることができます。つまり、必要な場合です。もちろん、セットアップは、さまざまな URL に対してさまざまなコントローラーを作成できるようにするためのものであるため、URL 部分に基づいて何をすべきかを決定する巨大なメソッドを備えた巨大なコントローラーは必要ありません。

于 2012-09-02T09:23:11.367 に答える