何よりもまず、この質問の長さについてお詫び申し上げます。できるだけ詳しくしたかったのです。
私はCakePHPを使用してWebベースのアプリケーションを開発中です。私は過去数週間でいくつかの側面に取り組んできましたが、現在、データベーステーブルに多くの情報を入力する過程にあります。これは、美しく、ユーザーフレンドリーなURLを使用して、ユーザーが非常に簡単にアクセスできる必要があります。私Users
とACO、AROなどがすべてセットアップされていると仮定します。それはすべてこの問題とは別です。この特定の質問に関連する私のデータベースの側面は次のとおりです。
カテゴリ:包括的なカテゴリ(たとえば、「猫」)
- 各カテゴリの
hasMany
トピック
トピック:特定のトピック(たとえば、「給餌」)
- 各トピック
belongsTo
1つのカテゴリ - 各トピック
hasMany
セクション
セクション:トピック内のセクション(たとえば、「肉」)
- 各セクション
belongsTo
1トピック - 各セクション
hasMany
サブセクション
サブセクション:セクション内のサブセクション(たとえば、「調理済み」)
- 各サブセクション
belongsTo
1セクション
などなど。
/Config/routes.php
次のものを含めるようにファイルにルーティングを構成しました。
Router::connect('/KnowledgeBase', array('controller' => 'categories', 'action' => 'index'));
Router::connect('/KnowledgeBase/:category', array('controller' => 'categories', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic', array('controller' => 'topics', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic/:section', array('controller' => 'sections', 'action' => 'view'));
Router::connect('/KnowledgeBase/:category/:topic/:section/:subsection', array('controller' => 'subsections', 'action' => 'view'));
ご覧のとおり、各URL形式は特定のコントローラーにリンクしているため、ユーザーはhttp://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cookedやhttp://wwwなどのURLを入力できます。 .mysite.com / KnowledgeBase / Cats / Groomingを実行すると、正しいページに配置され、正しいコントローラーによって処理されます(これらの2つの例subsections
とtopics
それぞれ)。
これは私が少し立ち往生しているところです。このデータは検証する必要があります。将来、トピック/セクション/サブセクションが同じ名前になるように設定する可能性は十分にあります。サブセクションの単純な$params
検索を使用すると、データが再帰的に検証されない場合、理論的には問題が発生する可能性があります。
たとえば、私の犬のカテゴリ: http ://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked とは対照的に: http ://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/調理済み
私が特定のコントローラー(この場合は私の)に着陸するとき、私はタイトルが付けられたカテゴリーのトピックの下のセクションに属するSubsectionsController
タイトルが付けられたサブセクションのみを選択する必要があります(、、、または...私は逸脱しません)。Cooked
Meat
Feeding
Dogs
Cats
Leopards
Armadillos
Dolphins
これを行うための最良の方法は何ですか?これまでのところ、2つの潜在的なオプションを見ることができます。
- これらすべてのURLを1つの特定のコントローラー(全知など)にルーティングし、要求されたデータに応じて呼び出し
KnowledgeBaseController
を使用してそこからすべてを処理します。recursive => 3
- この情報を個別に処理して、データに有効な親
SubsectionsController
が設定されていることを確認します。recursive => -3
- これらのオプションを組み合わせて使用します。セントラル
KnowledgeBaseController
を使用して、検索クエリを使用してデータを検証し、recursive => X
このすべての情報を問題の個々のコントローラーに送信して表示します。
私のコードは可能な限りDRYである必要があることを認識しています。これは、URLの検証に1つの中央コントローラーのみを使用する必要があることを意味します$params
。ただし、カテゴリ、トピック、セクション、サブセクションのレイアウトは大きく異なるため、このURL形式を維持しながら、独自のコントローラーで処理することをお勧めします。これを行うための最良の方法は何ですか?「ベストプラクティス」の解決策はありますか?
ありがとう。