普通のアクションとscaffoldを混在させる

たいていのウェブアプリには、管理用のインターフェースが必要になります。うちの会社ではこれまでコントローラを分けて、通常のアプリ用のコントローラと分けていたのですが、今回はscaffoldを使って一つのコントローラで簡単に共存する方法を試してみました。

使うのは、プレフィッス・ルーティング。以前のバージョンではadminルーティングと呼ばれていたんでしょうか。ドキュメントにも多少の混乱がみられますが、URLのパスの先頭に、通常のコントローラとアクションとは別の文字列を入れられる機能です。Configureでadminをプレフィックスとして認識するように指定。

config/core.phpプレフィックスとしてadminを受け付けるように指定

<?php
	Configure::write('Routing.prefixes', array('admin'));

次に、$scaffoldにプレフィックスで指定した文字列を設定すると、そのプレフィックスのみに反応するscaffoldが反応するという仕組みになってます。ここあまり触れられてなくて僕も最近まで知らなかったです。盲点でした。

app_controller.php でscaffoldはadminプレフィックス専用であることを指定

<?php
	var $scaffold = 'admin';

これで、 /users/ では通常のアプリ内部でのユーザーリスト、/admin/users/ では管理者専用のユーザーリストを出し分けることができます。app_controllerで指定しているので全てのコントローラで有効になってます。適時、必要ないところをfalseにしてつぶしていきます。まぁ、これは逆に必要なところだけ指定するのでもいいかもですね。

viewは標準のものが使われますが、views/users/scaffold.index.ctp を用意することで内容をカスタマイズすることが可能。いくら管理画面とはいえ、ノーカスタマイズですむことは皆無なので、ここは通常ファイルを作ることになるでしょう。

作りにあまり感心するところが少ないCakePHPですが、このScaffoldだけは、おー!よく実現できてるなー。どうやってんだ?!と驚いた思い出があります*1。これだけのものを使わない手はないですよね。今後は活用していきたいと思います。

*1:実際コードをのぞいてみると、驚くほど実直に実装されていて、まぁ、そうだよな、とがっくりもしましたw