CakePHP の Behavior の紹介、今回は Sluggable Behavior です。

slug とは SEO に有利になるように URL にキーワードを入れるようなことです。Bakery の Sluggable Bhavior は

http://bakery.cakephp.org/articles/view/sluggable-behavior

となっています。通常の CakePHP の URL だと /articles/view/1 のように数字に ID で指定します。これを上記 URL のように英数字で ID の変わりにするビヘイビアです。

このビヘイビアの便利なところは

  • title カラムから自動的にスラグを生成してくれる
  • スラグが重複する場合は末尾に数字を付加してユニークな値にしてくれる

というところです。

インストール

Cake Syrop の SVN から最新をダウンロードして app/models/behaviors に sluggable.php の名前で入れて下さい。bakery の記事にあるコードは最新の Cake では完全に動作しません。(スラグの重複処理が動作してしない)
SourceForge.net Repository – [cake-syrup] View of /trunk/app/models/behaviors/sluggable.php

ビヘイビアを使う

今回は Post モデルを作成しました。title と body があるだけの単純なものです。slug カラムを作っておくとビヘイビアがスラグを save 時に生成してくれます。

CREATE TABLE `posts` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `body` text NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY  (`id`)
);

Model

class Post extends AppModel {
    var $name = 'Post';
    var $actsAs = array("Sluggable");
}

Controller

function view($slug = null) {
    if (!$slug) {
        $this->Session->setFlash(__('Invalid Post.', true));
        $this->redirect(array('action'=>'index'));
    }
    $post = $this->Post->findBySlug($slug);
    $this->set('post', $post);
}

View

echo $html->link('View', array('action'=>'view', $post["Post"]["slug"]));

注意点

注意点は title に日本語などのマルチバイト文字を使用するときです。最初変換文字コードを指定するところがあったので、考慮されているかと思ったのですがうまく動きませんでした。ビヘイビアを少し改良したら日本語でも動作するようになったので、その方法は後日別エントリで書きたいと思います。

関連する投稿