CakePHP わかりずらい3点
CakePHP、クセが強いなぁ・・・、と思ったことを3点ほど。入り組んだ命名規約。コントローラーとモデルを切り離すための、$uses=null。それと、Component。
タスクを作ったときもちょっと触れましたが、命名規約が入り組んでいるので整理が必要。例を挙げてみます。
■シェルとタスクの関係
vendors/shells/myproj.php
vendors/shells/tasks/mytask.php
var $tasks = array('Mytask');
}
class MytaskTask extends Shell{
}
■コントローラとコンポーネントの関係
app/controller/myapp_controller.php
app/controller/components/mybiz.php
var $components = array("Mybiz");
function index(){
$this->Mybiz->doSomething()
}
}
class MybizComponent extends Object{
var $controller = null;
function startUp($controller){
$this->controller = $controller;
}
function doSomething(){
}
}
■モデルとビヘイビア(actAs)の関係
app/models/mymodel.php
app/models/behaviors/tree.php
var $actsAs = array('Tree');
}
class TreeBehavior extends ModelBehavior {
function setup(&$model, $config) {
}
}
関係性があるようなナイようなw
ろくなドキュメントもなくて、こんなに命名が複雑だなんて・・・
もっとも、命名が間違ってると、どでかいエラー表示(何々ファイルが見つからない)がブラウザに表示されるので、わかりやすいと言えばわかりやすいです。
CakePHPは、コントロール名とモデル名が密接すぎる関連を持っています。PostsControllerというコントロールを作ったら、必ずPostというモデルが存在しないと「モデルが見つからないエラー」になる。
ありえない!
コントロールとモデルは、そんな関係にあってはならないでしょ。
管理者向けのコントロールAdminControllerを作るなら、かならずAdminモデル、ひいてはadminsテーブルを作らなければならないわけだ(アホか)・・・と、ここでCakeを使うの辞めようかと思ったくらいの焦りを感じちゃいましたよ。
で、コントロールとモデルを切り離す方法は、
var $uses = null;
}
とすることです。これでようやく、どのモデルにも関連しなくなります。任意のモデルを利用するには、
var $uses = array('User','Entry');
function index(){
$this->Entry->findAll();
}
}
となります。$nameは使わないほうがいいかも。
app/controller/components、って??と思ったら、要はAppModel(ActiveRecord)ではないモデルを突っ込む場所のようです。
ちょうどeBayAPIを叩くモデルを作りたいと思っていたのですが、いったいどこに作ればいいのか悩んでました。これこそcomponentsの出番のようだ。
app/controller/components/ebay.php
function require_ebay($api){
require_once("vendors/EbatNs_1_0_515_0/". $api );
}
require_ebay('EbatNs_Session.php');
require_ebay('EbatNs_ServiceProxy.php');
require_ebay('GetSellerListRequestType.php');
class EbayComponent extends Object{
var $ebay;
var $controller = null;
function startUp($controller) {
$this->controller = $controller;
$sessfile = ROOT . DS . APP_DIR . DS . "config" .DS. "ebay.ini";
$sess = new EbatNs_Session($sessfile);
$this->ebay = new EbatNs_ServiceProxy($sess);
}
function getSellerList($user_id){
$req = new GetSellerListRequestType();
$req->setUserID($user_id);
$res = $this->ebay->GetSellerList($req);
return $res;
}
}
?>
このcomponentを使うControllerは、
class AdminController extends AppController{
var $uses = null;
var $components = array("Ebay");
function show_seller_list(){
$results = $this->Ebay->getSellerList('seller');
$this->set("results",$results);
}
}
?>
となる。
ここにも一つ落とし穴があって、外部ライブラリ(ここではEbatNs)はvendorsに突っ込めば、include_pathに自動的に追加されんのかと思ってたら、実はちがった。
このcomponentを作るときに参考にしたのは、cakebakerさんのOpenID componentなんだけど、そのコードでも、include_pathを無理やり書き換えてるのね。やっつけ感があって、統一感がない。
正直言って、全体的にわかりづらい。
これホントに利用者増えるのかな?自分がRoRの統一感に慣れすぎたのだろうか?CakePHPを触っていると、他のPHPフレームワークよりは格段に便利ですが、ちょっと後戻り感があります。
まだ1.2はalphaだし、もうちょっと待ってみようか・・・
Railsがここまで爆発した理由の一つは、ドキュメントが美しいからだと思います。頼む、そこを頑張ってくれ、Cake。

