1

何よりもまず、この質問の長さについてお詫び申し上げます。できるだけ詳しくしたかったのです。

私はCakePHPを使用してWebベースのアプリケーションを開発中です。私は過去数週間でいくつかの側面に取り組んできましたが、現在、データベーステーブルに多くの情報を入力する過程にあります。これは、美しく、ユーザーフレンドリーなURLを使用して、ユーザーが非常に簡単にアクセスできる必要があります。私UsersとACO、AROなどがすべてセットアップされていると仮定します。それはすべてこの問題とは別です。この特定の質問に関連する私のデータベースの側面は次のとおりです。

カテゴリ:包括的なカテゴリ(たとえば、「猫」)

  • 各カテゴリのhasManyトピック

トピック:特定のトピック(たとえば、「給餌」)

  • 各トピックbelongsTo1つのカテゴリ
  • 各トピックhasManyセクション

セクション:トピック内のセクション(たとえば、「肉」)

  • 各セクションbelongsTo1トピック
  • 各セクションhasManyサブセクション

サブセクション:セクション内のサブセクション(たとえば、「調理済み」)

  • 各サブセクションbelongsTo1セクション

などなど。

/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/Cookedhttp://wwwなどのURLを入力できます。 .mysite.com / KnowledgeBase / Cats / Groomingを実行すると、正しいページに配置され、正しいコントローラーによって処理されます(これらの2つの例subsectionstopicsそれぞれ)。

これは私が少し立ち往生しているところです。このデータは検証する必要があります。将来、トピック/セクション/サブセクションが同じ名前になるように設定する可能性は十分にあります。サブセクションの単純な$params検索を使用すると、データが再帰的に検証されない場合、理論的には問題が発生する可能性があります。

たとえば、私の犬のカテゴリ: http ://www.mysite.com/KnowledgeBase/Cats/Feeding/Meat/Cooked とは対照的に: http ://www.mysite.com/KnowledgeBase/Dogs/Feeding/Meat/調理済み

私が特定のコントローラー(この場合は私の)に着陸するとき、私はタイトルが付けられたカテゴリーのトピックの下のセクションに属するSubsectionsControllerタイトルが付けられたサブセクションのみを選択する必要があります(、、、または...私は逸脱しません)。CookedMeatFeedingDogsCatsLeopardsArmadillosDolphins

これを行うための最良の方法は何ですか?これまでのところ、2つの潜在的なオプションを見ることができます。

  1. これらすべてのURLを1つの特定のコントローラー(全知など)にルーティングし、要求されたデータに応じて呼び出しKnowledgeBaseControllerを使用してそこからすべてを処理します。recursive => 3
  2. この情報を個別に処理して、データに有効な親SubsectionsControllerが設定されていることを確認します。recursive => -3
  3. これらのオプションを組み合わせて使用​​します。セントラルKnowledgeBaseControllerを使用して、検索クエリを使用してデータを検証し、recursive => Xこのすべての情報を問題の個々のコントローラーに送信して表示します。

私のコードは可能な限りDRYである必要があることを認識しています。これは、URLの検証に1つの中央コントローラーのみを使用する必要があることを意味します$params。ただし、カテゴリ、トピック、セクション、サブセクションのレイアウトは大きく異なるため、このURL形式を維持しながら、独自のコントローラーで処理することをお勧めします。これを行うための最良の方法は何ですか?「ベストプラクティス」の解決策はありますか?

ありがとう。

4

1 に答える 1

2

まず、リストしたルートは逆の順序である必要があります。上部が最も具体的なルートで、下部が最も一般的なルートです。

オプション#2を使用する必要があります。階層の各レベルは、独自のコントローラーによって管理されます。だから例えばを取る。階層の最下位レベルのSubSectionsには、SubSectionsControllerがあり、適切な再帰値を使用してそのSubSectionモデルを検索し、関連するセクション、セクションのトピックなどを取得します(ただし、再帰= 3のままですが、再帰=-3)のようなものはありません。したがって、このようにして、階層のすべてのレコードがあり、階層の関連レコードを使用して各URLフラグメントを検証できます。$this->request->paramsルートの各ルート要素のキーが含まれます。

于 2013-01-23T21:02:59.057 に答える