これを行う方法を考え出しました。具体的には、ユーザーがhttp://example.com/aCategoryTitle/aTopicTitle/aSectionTitle/aSubsectionTitleのようなものを入力できるように、見栄えの良いURLを使用したかったのですが、サブセクションが確実に属するように、このデータを検証する必要があります。正しいカテゴリ、トピックなど。
$conditions = array(
'Subsection.title' => $subsectionname,
'Section.title' => $sectionname,
);
$subsection = $this->Subsection->find('all', array(
'conditions' => $conditions,
'recursive' => 2,
));
これは、すべてのサブセクションを正しいタイトルとセクションタイトルに一致させる単純な検索呼び出しです。
if (!$subsection) {
// nothing was returned
$this->redirect(array('controller' => 'KnowledgeBase', 'action' => 'index'));
}
その基準に一致するサブセクションがない場合、ユーザーはリダイレクトされます。ただし、同じセクションタイトルで複数のサブセクションが見つかる場合があります。たとえば、次のURLを考えてみましょう。
http://example.com/Cats/Feeding/Food/Meatおよびhttp://example.com/Dogs/Feeding/Food/Meat
これらの2つの例では、上記の基準に一致する複数のサブセクションが見つかります。したがって、さらに検証を実行する必要があります。
foreach ($subsection as $asubsection) {
if (($asubsection['Section']['Topic']['Category']['title'] == $categoryname) &&
($asubsection['Section']['Topic']['title'] == $topicname) &&
($asubsection['Section']['title'] == $sectionname) &&
($asubsection['Subsection']['title'] == $subsectionname)) {
// correct parameters
// this variable can now be passed to the view
$this->set('mysubsection', $asubsection);
} else {
// incorrect parameters in URL
$this->redirect(array('controller' => 'KnowledgeBase'));
}
}
これにより、見つかったすべてのサブセクションがループされ、それらのタイトル、およびそれらが属するセクション、トピック、カテゴリのタイトルがURLと一致するようになります(で指定$this->request->params
)。
おそらくそれを行うための最もきれいな方法ではありませんが、それは機能し、私のルーティングでうまく機能します。船上でさらに提案をすることは常に幸せですが、今のところこれは私にとってうまく機能しています。