CakePHPを使った事が無い人は使ってみるべき

第4回CakePHP勉強会に参加してきました。
場所を提供してくださったグリーさん、スタッフの皆様ありがとうございました。

勉強会の内容の素晴らしさについては他の人がupしてくれていますので、フレームワークについて色々思った事を独り言してみます。

PHPフレームワークが乱立しているのではなく選択肢が多いというメリットに気づくべき

PHPは簡単なことをやるには学習コストが低い言語(?)です。
そして、Webアプリを作成するために、より楽できるようにルールを決めてくれているのがPHPフレームワークの役割です。

よく聞かれる質問の1つに「何時間で使えるようになるの?」ってことなのですが、完全に使いこなすのはどれも時間がかかります。
しかし、とりあえず動作させるために必要な初期コストには違いがあります。

その中で初期学習コストが低いのはCakePHPです。セットアップなんていうほどの作業はFTPによるアップロードだけです。コマンドを叩くことは必須ではありませんし、最初はファイルが不足していればエラー画面に表示される指示に従ってファイルを用意すれば良いだけです。そして、何より日本語のフォーラムが活発です。また、勉強会の盛り上がりも国内では一番です。日本語の書籍が充実しているのも大きいですね。

それに対して初期学習コストが一番高いのはsymfonyだと思います。Jobeet(Askeet)というチュートリアルがありますが、24日分 = 24時間以上 という結構なボリュームがあることからもわかりますし、公式ドキュメント量ではダントツで一番多いのもsymfonyです。*1

そして、フレームワークを拡張をする場合ではCakePHPでもsymfonyでもフックポイントは用意されていますし、更に複雑なことをしようとすると悩むのは同じです。ただ、symfonyでは機能が多いのでがっつりと拡張するような状況はCakePHPよりは少なくなると思います。

個人的な感想としては、どちらのフレームワークも優れていますし、目指している方向が異なります。そのため、色々な要因によってフレームワークを選択できるのがPHPの良いところだと思っています。

とりあえずCakePHPを使ってみる

で、PHPフレームワークCakePHPを使った事がない人へのメッセージです。
CakePHPは簡単に導入できるフレームワークです。CakePHPしか使った事が無い人にzfやsymfonyを勧めるのは躊躇しますが、symfonyを使ったことがある場合はCakePHPを使ってみることをオススメします。

CakePHPsymfonyRoRの影響を少なからず受けていますし、MVCという基本的な考え方は共通なので、ほとんど苦労することはないでしょう。ヘルパーなんてメソッド名や引数が同じだったりするものもあります。また、簡単にざっくりと作れてしまうCakePHPの気楽さはsymfonyでアプリを作っていれば余計に実感できると思います。

そして、CakePHPの良い部分も悪い部分もsymfonyを知っているから見えてくる部分があります。

フレームワークに使われない

フレームワークを1つに絞ったほうが、ライブラリの再利用といった点でもメリットがあります。でも、無理に特定のフレームワークに拘ってしまったがためにフレームワークに振り回されてしまっていませんか?

単発のアンケートフォームの開発で共用サーバーでFTPしかできない。。なんて案件だとsymfonyだと面倒です。
CakePHPを知っていれば簡単に作れるのはすぐにわかります。

また、symfonyを知っていればその知識を活かしてCakePHPをより使いやすくすることができます。
たとえば、簡単にテストを行いたいのでlimeを使ったり、アプリの設定定数をphp内に書きたくないのでsfYamlを利用したり、CakePHPのfile.phpだと機能が乏しいのでsfFinderを持ってきて使いやすくしたりといったことは難しくないですからね。

サポート、コア開発体制には気をつける

PHPの全てのフレームワークはマイナーなものも含めると非常に多くあります。どれでも良いのかというと注意点もあります。
それは"長期でサポートされることが保証されているフレームワークでないと駄目"という点だと思います。
これは、Mojaviを使ってきた苦い経験から言えることですね。。
そういう意味ではCakePHP, symfony, Zend Frameworkは安心して使えるフレームワークです。

CakePHP勉強会とは直接関係のないような内容になってしまいましたが、PHPフレームワークというのは難しいものではなく一般的なものになったんだなと改めて実感した勉強会でした。

*1:日本語の情報をあまり見ないだけです

【戯れ言】symfonyはCakePHPよりは大規模向けです

例えば、フレームワーク比較で良く目にする違いとして「Symfonyは大規模向け、CakePHPは中小規模向け」というのがある。これはいったい何なのだろう? よく読むと、大抵は「Symfonyプラグイン機能があるため、大規模向け」という書き方がされている。これは本当にそうなのだろうか?

まず簡単なツッコミをさせていただくと、CakePHPは、既にプラグイン機能を装備している。Symfonyとほぼ同じように、一連機能を持った仕組みを簡単に入れたり抜いたり出来る。つまり、この定義でいけば、CakePHPは十分に大規模向けだ。

.. (略) ..

そしてプラグインは、私はむしろ逆の、中小規模向けのものと考える。何故なら、第三者の制作したものを、手っ取り早く自分のものに出来るというのが実質的なところであり、そういった用途のものは中小規模向けに書かれているものが多いからだ。

まず前提として、プラグインという機能はsymfonyでもCakePHPでも、大規模向けのためにある機能ではなく、再利用性を高めるための機能であり、規模は関係ないと思います。

もう1点。
symfonyプラグインはコマンドでアップグレードなど管理が行えたり、名前空間の衝突を気にしなくてよかったり、プラグインを拡張するためのフックポイントが用意されていたりと、より複雑なことができるので、単純に機能をプラグインとして切り出したというレベル以上のことができるように標準で考慮されています。

というわけで、プラグインという機能をもつこれら2つのフレームワーク使いこなせればより開発効率を上げることができるということだと思います。

そして、symfonyでもCakePHPでも大規模開発はできます。
ただし、symfonyのほうがCakePHPよりは標準で大規模開発を考慮しています。

ここでは、その理由の1つであるディレクトリ構造の違いで説明します。

それは「アプリケーション」「モジュール」という2段階構造を持つsymfonyに対してCakePHPは「コントローラー」というフラットな構造になっている点です。

CakePHPではフラットな構造なので管理画面だけ別にしたい場合などは、標準だとCAKE_ADMINを利用するのが一般的だと思います。ただし、ファイルの置き場所は他のコントローラーと同じですし、CAKE_ADMINを使うパターンしか考慮されていないとも言えます。*1

symfonyではアプリケーションで切り分けることができるのでもっと柔軟に対応できます。

他にも比較できるポイントはあると思いますが、ちゃんと違いがありますよってことで。

ただ、symfonyでもCakePHPでもやりたいことはできます。
「正しい方を選ばないとできない。失敗だ。」なんてことはありません。
どちらを選んでも、フレームワークが提供していないことをやろうとすると苦労する点は同じです。

このネタちゃんとまとめてどこかで発表するかな。。
[追記]
id:yandodさんが以前にCakePHPsymfonyの比較について発表したスライドがあるんでした。
どちらかのフレームワークを使った事があれば違いが分かると思いますのでオススメです。
http://puyo2.upper.jp/cake/files/20080627cakephpstudy_symfony.pdf

[さらに追記]
id:yandodさんからコメント頂きましたが、CakePHPでも設定を書けば、ディレクトリを分離させることができるそうです。*2
CakePHPでコントローラーを複数のディレクトリに整理する方法 - yandod's blog

*1:ちょっとしたアプリなら、これぐらい考慮されていれば十分でしょうけど

*2:名前の衝突など考慮しなくてはならない点もあるようですが

CakePHPコンソールのシェルを作るときのメモ

CakePHP1.2での話。ドキュメントにも詳しく書かれていないのでソースを見ながら使い方を探る。

シェルやタスクって何よ?&基本的な使い方

とりあえずはドキュメントを読みましょう。そうすれば、ファイルの作成方法、配置、呼び出し方については分かります。
http://book.cakephp.org/ja/view/110/Creating-Shells-Tasks

実行結果をファイルに保存するとファイルの先頭にエスケープ文字が入る

linux環境で実行するときは

$cake shellfile > log.txt

のようにリダイレクトするとファイルの先頭にエスケープ文字列が含まれる場合があります。
これは/cake/console/cakeファイルのclearコマンドが原因なので、エスケープしておきます。

* /cake/console/cake

# escape clear command
#clear

LIB=${0/%cake/}
APP=`pwd`

exec php -q ${LIB}cake.php -working "${APP}" "$@"
          
exit;    

メッセージを出力する

通常は標準出力で、エラーがあるときは標準エラー出力にしたい場合などは既に用意された以下のメソッドを利用するとよい。

<?php
// 出力する
$this->out('標準出力したいメッセージ');
$this->err('標準エラー出力したいメッセージ');

// 出力後に自動改行したくない場合は第2引数でfalseを渡す
$this->out('改行せずに標準出力したいメッセージ', false);

// 「---」の文字列で区切り線を出力したい場合
$this->hr();

シェルを終了する

<?php
// シェルを異常終了させたい場合
//  (内部的に次の_stopメソッドを呼び出してシェルを終了している)
$this->error('タイトル', 'メッセージ');

// シェルをステータスを指定して終了させたい場合
//  (アンスコで始まるメソッドなのでPHP5でいうprotectedなメソッドを意味すると思われる)
$this->_stop('ステータスコード');


symfonyほど作り込まれた機能ではないけど、最低限必要な機能は用意されている印象。

使い分けはどうしてる?

LTで、「CakePHPsymfony両方つかってます」って言ったものだから「使い分けはどうしてるの?」という質問がありました。


PHPのバージョンの縛りさえなければ、完全な使い分けの判断基準となるラインはありません。
フレームワークはツールですので、「こっちでないと駄目!」という悩みもありません。
どちらでもやりたいことはできると思います。


逆に言うと、「Cakeは駄目」とか「symfonyは駄目」とかいう不満もありません。
どちらも良くできたフレームワークです。流行るだけのことがあります。


ただ、案件の規模や開発体制によって使いやすい使いづらいという違いはでてくると思います。

重要な点は「お客さんにとってはどちらで実装されても正しく動けば違いはない」ということです。
なので、開発サイドとしてどちらで開発することが適しているかという点で考えれば分かりやすいですね。

例えば、RoRに慣れている人員が多いとかJavaの開発に慣れている人員が多いとか。。


皆さんはFWの選定はどうやって決めていますか?

CakePHPカンファレンス東京

今日、CakePHPカンファレンス東京にスタッフとして参加してきました。
http://events.php.gr.jp/events/show/55

参加された皆さん、運営者の皆さん本当におつかれさまでした。


受付担当でしたので、一番後ろから発表を見させていただきました。

その中で特にGarrettのことを中心に自分の中で印象的だったことをまとめておきます。

テスト駆動開発の実例 by 岸田さん

コントローラーのテストは大変!

  • コントローラーにはコードをほとんど書かずモデル側にコードを書くのが良い。そうすればテストも楽になる by Garrett

「Structure gives you more freedom」by Garrett

フレームワークを使うことは制約を与えるため自由がなくなると理解するのではなく、(フレームワーク)で決まっていることについてはルールに従うだけで考える必要はないので、本当に考えるべき実装部分に時間をかけることができると。それだけ自由があるんだと。なるほど。

「バグのチケットがあるままリリースしない」by Garrett

開発者本人だからこそ聞けたCakePHPのポリシーの1つだと思います。だからこそRC4まで必要になってくるんだろうし、そこが他のフレームワークと一番違うんだと。

CakePHPのロゴのCakeを満面の笑みで持つGarrettに十数人が囲んで写真をとってた件

下手な芸能人の記者会見よりもすごいと思いました。
すんごい貴重なシーンではあるのですが、状況を知らない人があれを見たら理解できないのは必死。



その他ではhaltさんのXoopsCube上で動くCakePHP ~CubeCake~ にCakePHPらしさを感じて多いに共感。
そうなんですよ。CakePHPはこういう使い方で他のアプリに組み込めてしまうんですよ。

Xoops以外のCMSでも同じようなコンセプトのブリッジがあります。

Drake(Drupal + CakePHP): http://dev.sypad.com/projects/drake/
Jake(Joomla + CakePHP): http://dev.sypad.com/projects/jake/

これらも管理画面からインストールするだけでCakePHPで画面が作れます。
過去にDrakeを検証してみたことがありましたがあっさりするぐらい簡単に導入できました。
でも、日本では圧倒的にXoopsが有名ですし、実例も多いですから、CubeCakeは待ち望まれていた機能だと思います。もちろん世界的にも。

CakePHP覚えればメジャーなCMSアプリと(苦労もあるけど)連動できちゃうよ!ってすごくないですか。



本当に充実した一日でした。
でも、ほとんどの人と話ができていなかったような。。
また今度あったときは宜しくお願いします!

CakePHPでメソッドチェーン風にヘルパーを使う

<? php echo n(h(mb_convert_kana(mb_substr($text, 0, 100), 'a'))); ?>

..(略)...

結論から言えば、このクラスを利用することで、上記の処理は以下のように記述できます。

<?php fx($text)->mb_substr(0, 100)->mb_convert_kana('a')->h()->n()->e(); ?>

括弧の数が合わないというエラーから解放されます。
マジックメソッドを多用するので場合によっては速度面でボトルネックになるかもしれませんけどね。

DEBUGが0のときのエラーロギング(CakePHP 1.1)

CakePHPではcore.phpにてDEBUGの定数を変えることで、製品版、開発版などの振る舞いを変えることができます。

これは便利なのですが、製品版(DEBUG=0)にすることで困る事がありました。
それは、error_reportingの設定が勝手に書き換えられ、error_reporting(0)になることです。
(/cake/libs/configure.php L:138)


つまり、log_errorsをONにしていても、何も書き出されないためエラーが発生しても気づかないんです。
ある意味、フレームワークであるCakePHPが不容易にエラー内容を画面に出力し、セキュリティ面から守ってくれているということなのですが、仕事として導入する上では、エラーがあった場合はログを残しておくことがいろんな意味で大切です。

なので、以下のように上書きしました。

ini_set('display_errors', 0);
error_reporting(E_ALL);

当然ですが、製品環境ではまちがえても display_errorsはONにしないように。。。