何も考えずにSlugRouteを生成する

SlugRouteとは

単純に、
/posts/view/127
といったURLでは見栄えがあまり良いとは言えません。
そこで、例えばブログのタイトル等を使って、
/post/何も考えずにSlugRouteを生成する
といったURLにすることによって、SEO有効性も、URLを見た時の関心の引き具合も、ぐっと引き上げることができます。
これらのURLを扱うルーティングをまとめてSlugRouteと呼ぶことにします。

※そもそものSlugの定義とは少し違いますが、他の呼び方が思いつきませんでした。誰か教えて!

忍者プラグイン

hiromi2424/ninja - GitHub

まだドキュメントが出来上がっていませんが、忍者プラグインというものを作りました。
plugins/ninjaに適当に設置してください。(プラグインの設置はプラグイン :: CakePHPによる開発 :: マニュアル :: 1.3コレクションを参考にしてください。)
この中に以下のカスタムルートクラスが二つあります。

  • AutoSlugRoute
  • MultiSlugRoute

これらのどちらかを使うことにより、今すぐSlugRouteを作ることができます。
共通の機能としては、ざっくり

  • 規約を使ったモデル、フィールドの自動決定
  • モデル探索のキャッシュ
  • キャッシュの削除

があります。

AutoSlugRoute

例えばdisplayField(titleなど)が設定されていれば、以下のようにするだけです。

これだけで、:titleにPost.titleが埋めこまれます。

また、様々な状況に対応するオプションは以下のものがあります。

MultiSlugRoute

複数のスラッグを使いたいときに用います。
基本的にAutoSlugRouteと同じですが、指定方法がいくらか変わります。

基本のモデルに紐づいたモデルも利用可能です。

オプション:

その他コールバックが実装できるなど、MultiSlugRouteはAutoSlugRouteより高機能です。

注意点

AutoSlugRouteはデフォルトで全件をキャッシュします。
これは高速に動作しますが、キャッシュ生成時に負荷が大きいため、局所的にパフォーマンスの劣化が起きる可能性があります。
MultiSlugRouteは必要な時にクエリを発行し、キャッシュをアップデートします。
これは全体的に満遍なく負荷がかかることを意味します。また、キャッシュのアップデートが頻繁にかかるため、全体的なパフォーマンスに気をつける必要があります。

以上のような問題を解決するために、細かいキャッシュコントロールを行う必要があるかもしれません。
また、1万件以上レコードのキャッシュが発生すると、キャッシュ読み込みの負荷が著しくかかります。(検証済みです)この場合、キャッシュをオフにすることも検討する必要があるでしょう。
これらパフォーマンス問題は、トレードオフな側面があります。
開発する規模によっては、コンポーネント単位での制御、またはIDによる制御をしないという設計もまた有効です。

詳細なキャッシュコントロールメソッドについては、ドキュメント、または解説をブログの記事にします。

最後に

レコードが固定、CMS、ブログなどという要件であれば、まったく支障なくSlugRouteが一瞬で作れ、堅牢です。
是非一度お試しください。
フィードバックお待ちしております。