【CakePHP】「詳解CakePHP辞典(CakePHP辞典2)」を刊行しました!

大変にお待たせしました!

ご好評いただきました「Pocket詳解CakePHP辞典」の続編、「詳解CakePHP辞典(通称CakePHP辞典2)」が3/15日に無事刊行となりました。基本的に本書はCakePHPバージョン2系対応本ですが、前書でページ数の都合上なくなく削った機能の解説を追加し、より多くの情報を詰め込んだ「これぞ辞典!」と言える内容となっています。

facebookのECWorksページでも若干紹介させていただいていますが、本書が前作と比較してどのような変化があったか、また多くの方からご要望のある「電子書籍化」について、執筆時のエピソード的なものを交えてちょっと書こうと思います。

前作と変わったところ

Amazon等の書籍紹介ページをご覧になりますと、前作とあまり変化がないように見えますが、書店等で実物をご覧いただければ一目瞭然です。

  • 判型がひとまわり大きくなった
  • ページ数が増加
  • それでいて若干薄くなった
  • 紙質が柔らかなものとなりページが開きやすくなった
  • バージョン2系の現時点での全てのバージョンに対応(2.0〜2.3)
  • 前書で取り上げることが出来なかったクラスライブラリ・テスト等を収録
  • 本文中のクラスメソッドの収録順をアルファベット順にソート

…などなど

判型が大きくなった&ページ数の増加

本書ではバージョン2系から新しく搭載された、もしくは改良された機能は勿論、バージョン1系で収録できなかった機能についてもかなり盛り込んだため、結果として大幅にページ数が増加することが懸念されていました。
脱稿時に、前作換算でページ数を算定したところ、なんと1200ページ!! このままでは厚さ100%増しとなってしまいとても実用にはならなくなってしまうため、出版社側との議論の結果判型を大きくし、出来るだけページ数を増やさない方向で調整を行いました。
判型については「紙面が小さすぎ」「とてもPocketではない」とのご意見もあり、あの判型にこだわる必要もありませんでしたし、紙面が小さいことですぐに閉じてしまうなど逆に扱いにくいこともありました。なので丁度良かったのかもしれません。

それでいて若干薄くなった・柔らかい紙で開きやすくなった

ページ数はやや増加しましたが、本の厚さは若干薄くなりました。これは前作の紙が厚く硬めの紙だったため、柔らかく薄いものに変更したためです。このため開いたページが閉じにくくなりより扱いやすくなったと思います。
逆に、以前は硬い紙だったため自立が容易でしたが、本書は使い込んでくると立たなくなるかもしれません。

バージョン2系の現時点での全てのバージョンに対応

本書の発売は遅くとも3月であることが宿命づけられていた関係で、CakePHPのバージョンアップのタイミングに関してはかなり気をもんでいました。追記の可能な丁度良いタイミングで2.3がリリースされたため、本書にもその情報を盛り込むことが出来ました。本当に運が良かったです。
逆に、ページ数の都合からバージョン1系の情報はばっさりと削りました。両方の情報が載ってしまうと混乱するでしょうし。もしバージョン1系の情報が必要になりかつ前作をお持ちでない方は、是非「Pocket詳解 CakePHP辞典」の方をお求めください。しばらく併売されると思います(でも数量が減っているため入手はどんどん困難になると思われます)。

前書で取り上げることが出来なかったクラスライブラリ・テスト等を収録

前書ではページ数の都合から紹介できなかったクラスがあり、その中で「テスト」に関する仕組みを紹介できなかった経緯がありました。今回改訂版(実際には改訂どころか書き下ろしに近いのですが)ということで増ページが許され、テストをはじめとする多くの掲載できなかったクラスを盛り込みました。
テスト以外では、ファイル入出力やフォルダ管理に必要な「Fileクラス」「Folderクラス」、低レベルなネットワークアクセスを実現する「HttpSocketクラス」等、あまり情報として出回っていない仕組みについても掲載することが出来ました。

最後の最後まで悩んでいたのが「データソース」の周辺で、例えばCake標準でないデータベースにアクセスしたい場合やその他低レベルのデータ入出力インターフェースとしてデータベースの情報は必要になりますが、表面的にはモデルと似通った機能で構成されていること、解説をし出すと膨大で少々の増量では済まないこと、そもそもデータソースの利用やカスタマイズに関する情報は上級者向けのものが多い…等の理由で泣く泣く削りました。ただし、データソースのグループの中に「CakeSession」が含まれており、これだけは誰もが扱う重要な仕組みであるため、例外的に掲載しました。

また、テスト編の情報はあくまでも「Cakeで拡張された部分」のみの掲載となっています。Cakeのテストの仕組みは「PHPUnit」を オーバーライドあるいは別のクラスを利用して実現されているためPHPUnitの知識が必要になるのですが、本書でそこまでの解説をしてしまうともう1 冊分の情報量を詰め込むことになってしまいます。なので本格的なテストの記述についてはPHPUnitのマニュアルを参照していただくか、PHPUnit について書かれている別の書籍を併用していただいた方が良いと思います(PHPUnitの本はほとんど見受けられないので、誰か書いてくれないかなぁ…)。

紙の書籍ではやはり「ページ数との戦い」がどうしても発生してしまいます。これについては「完全電子書籍化」でない限りはなかなか難しいと思うのですが、紙の書籍でギリギリの情報量と実用性を考慮した上で今回の内容となりました。

本文中のクラスメソッドの収録順をアルファベット順にソート

辞典としての便利さの向上ということで「収録メソッド・プロパティ」をアルファベット順にソートしました。前書は「(頻度の高いものを除く)クラスファイル内での登場順」で掲載していました。これは「辞典で調べた後にソースコード内の該当箇所を検索しやすくする(もしくはその逆)」のためだったのですが、CakePHPをあまり知らない方にとってはソートされていた方が引きやすいだろうということで今回変更しました。

なお前書のAmazonの書評で「索引がクラス順にソートされているため、初級者だと機能を知らないので引けない」というコメントがあったのですが、最初メソッド名でソートをしてみたのですが、むしろこちらの方がわかりにくいのと、見た目的にも項目が不揃いで大変に見にくく難読であったため元に戻しました。基本的に内容が分からない場合は索引から入るのではなく本文から入っていただいて概要で判断していただいた方が分かりやすいのではないかと思います。

電子書籍版について

前書から散々に言われていて、今回もまだ未解決の事象として「電子書籍化」があります。確かにCakePHP辞典は電子書籍化された方が便利な事もあるのですが、おおむね次のような理由から実現に至っていません。

  • 出版社に電子書籍のインフラがないため
  • CakePHP辞典のそもそものコンセプトが「実務での紙で引くことの便利さ」であるため
  • CakePHPの認知度を上げるには紙媒体を優先した方が良いため

出版社に電子書籍のインフラがないため

電子書籍化ができない一番の理由は、現時点で出版社側に「インフラ」が無いためです。実は前書の時にも同様に言われ、議論もされたのですが、実現には至っていません。こればかりは出版社側の対応を待つしかありませんが、現場レベルでは十分に重要性を理解しており、電子書籍版について前向きであることは間違いありません。

コンセプトが「実務での紙で引くことの便利さ」であるため

これは私が100%オンラインで育っていない古い世代であるからかもしれませんが、やはり紙でペラペラめくることでの引きやすさは実務上で大変に役立つため、心情的に電子書籍よりも優先度が高いというのがあります。オンラインにはCookbookがありますし、ググって調べることも出来ますから、そちらで代用していただくことは出来るでしょう。
ただ、あくまでも優先度として紙の方が高いというだけで「電子書籍を出したくない」のではありません。現状出版が出来ない状況ですので、こればかりはどうしようもありません。

CakePHPの認知度を上げるには紙媒体を優先した方が良いため

ちょっと裏側の話になりますが…
電子書籍にこだわるのなら別の出版方法もありますが、やはり紙の本として出版することで書店に置いて貰うことが出来、またいろいろなオンラインストアなどでも取り扱って貰え、その結果googleの検索など多くの場所で「CakePHP」のキーワードが登場するようになるため、CakePHPの認知度を上げるためにはやはりまだ紙のほうが優勢だと思うからです。
例えば、自分の利益を優先するのであれば、出版社などを通さず個人的にKindle向けや別の電子書籍媒体を使って出版すれば、多分印税率は高く儲かると思います。ただ専門書の執筆で貰える印税はそれほど多くなく、実際のところ執筆にかける時間を別の案件などに使った方が遙かに上でして、電子書籍にしたところで大したことはないです。それよりは、CakePHPをより多くの方に使って貰いたい気持ちの方が上ですので、より効果的な方法として紙の方を優先しています。繰り返しになりますがあくまでも優先度の問題で、電子書籍「も」出せるのならそれに越したことはありません。

作業机の上の1冊に

本書はあくまでも「辞典」であり、この1冊でCakePHPの学習が出来るかどうかといわれると謎です。これは「英語の勉強を英和辞典1冊で出来るか」ということと同じで、CakePHPの学習には別の入門書を併用された方が良いと思います(例えば「CakePHP2 実践入門」のような素晴らしい本があります)。本書は、学習の過程で「より深くCakePHPの機能を知るため」あるいは学習を終え実践的な段階に入ったときに「こんな機能は無いのだろうか?」「こんな使い方は出来ないだろうか?」「この機能はどういう使い方だったっけ?」といった時に使っていただくための本で、いつも机の上に置いていただければと思います。Cake2が発表されてから1年以上立った今でもCake2の情報はネット上でもなかなか無いのが実情ですが、本書がよりCake2を便利に使っていただくための1冊になっていただければ幸いです。

詳解CakePHP辞典2.0/2.1/2.2/2.3対応

詳解CakePHP辞典2.0/2.1/2.2/2.3対応 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2013-03-14 (木)

商品カテゴリー単行本

ページ数728

ISBN479803746X

Supported by amazon Product Advertising API

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus) [書籍]

著者安藤 祐介, 岸田 健一郎, 新原 雅司, 市川 快, 渡辺 一宏, 鈴木 則夫

出版社技術評論社

出版日2012-09-29 (土)

商品カテゴリー単行本(ソフトカバー)

ページ数416

ISBN4774153249

Supported by amazon Product Advertising API

WebデザイナーのためのCakePHPビューコーディング入門

WebデザイナーのためのCakePHPビューコーディング入門 [書籍]

著者滝下 真玄 , 原 一浩

出版社秀和システム

出版日2012-03-28 (水)

商品カテゴリー単行本

ページ数424

ISBN4798033146

Supported by amazon Product Advertising API

【CakePHP】CakePHP Advent Calendar2010(day 7) : Tips for Routes

CakePHP Advent Calendar2010 の当番が回ってきました。
本来はもっとかる~い内容でいくつもりでしたが、皆さんがっつりとやられているので、慌てて秘蔵のネタ(?)を引っ張り出すことにしました。まあとはいえ実際はそんなでもないので軽く読んでいただければ(笑)。

さて、Modelにまつわる話が多いようなので今回も違う話題にしましょう。Modelは今までTipsが出にくい仕組みの一つだったのかもしれないのですが、同じくなかなか情報として出回らないRoutes関連でも取り上げてみようと思います。

CakePHPであることを隠蔽する (CakePHP Advent Calendar 2010 2日目) でも取り上げられていましたが、CakeぽくないURLを作成するためにはRouteを変更することで自由なURLにコントローラとアクションを振り分けることができます。しかし多くの場合「/:controller/:action/*」という標準のルート指定で問題がないため、修正する機会はなかなかないのではないかと思います。そこで2ステップでRoutes活用法をご紹介します。

ステップ1:パラメータチェックをRoutesで済ませてしまう

Routesの設定は上記のようにURL変更というのも活用法のひとつかもしれませんが、もう一つとても便利な使い方があります。それは、URL中にパラメータを含む場合に、そのパラメータチェックをRoutes内で行うことができる点です。
たとえば

http://www.example.com/foo/hoge/0123456789

というURLを想定するとしましょう。fooコントローラ内のhogeアクションで1つの値を入手したい場合です。この場合、デフォルトですとコントローラ内の「$this->params[‘pass’][‘0’]」に値が入ります。そこで一般的に、次のようなコントローラを書くでしょう。


class FooController extends AppController {
	var $name = 'Foo';
	var $uses = array();
	function hoge(){
		//まずパラメータチェック
		//
		if(!preg_match('/^[0-9A-Za-z]+$/', $this->params['pass'][0])){
			$this->flash('正しくないURLです', '/');
			return;
		}
		//以下、必要な処理
		//
	}
}

しかし、Routesを活用することで、コントローラにチェックを書かずにチェックを行うことができます。「app/config/routes.php」に次のように記述します。


Router::connect('/foo/hoge/:viewerId', array('controller' => 'foo', 'action' => 'hoge'), array('viewerId' => '[0-9A-Za-z]+'));
Router::connect('/foo/hoge/*', array('controller' => 'foo', 'action' => 'error'));

この場合は$this->params[‘viewerId’]にて値を受け取ることができます。条件に満たさない「/foo/hoge」はすべてerrorアクションに流れます。Router::connect()は先着順でルーティングを決定しますので、一番最後に条件を満たさない場合のルートを書いておけば、デフォルトである「/:controller/:action/*」に流れることはありません。

メリットとしては、まずアクション内でパラメータチェックが要らなくなる点で、fat controllerのスリム化に貢献できると思います。そして不要なアクションがコントローラ内に渡ってこない点にあります。そもそもURLから渡されるパラメータはコントローラに渡ってくる時点で正しいものであるべきかと思いますので、Routesでチェックすることは理にかなっていると言えます。

ステップ2:正規表現で表せないルーティングはどうするか?

上記ルーティングは、あくまでも正規表現で表される場合であり、複雑な条件分岐を伴ったりモデルを参照したい場合などはうまく表現できません。
しかしCakePHP1.3からは「カスタムルーティング」という機能が備わり、その中でチェックしたりデフォルト値を追加したりすることができます
たとえば、既にモデルに登録されている値のみをルーティングし、登録されていない値はアクセスできないようなルーティングを表現してみましょう。まず、カスタムルーティングのコードを「app/libs」に記述します。コードを置く場所はどこでもよいのですが、Cake用のコードなのでvendorsではなくlibsがいいでしょう。ここでは「app/libs/viewer_route.php」とします。


class ViewerRoute extends CakeRoute {

	//Userモデル内のviewerIdをチェックし、userIdを返す
	//
	function __checkViewerId($id){

		$model =& ClassRegistry::init('User');
		$result = $model->find('first', array(
			'conditions' => array(
				'viewerid' => $id,
			),
		));
		if(empty($result)){
			return false;
		}
		return $result[$model->alias]['id'];
	}

	//パース処理(URL => array())
	//
	function parse($url){

		//ここはお決まりの処理
		//
		$result = parent::parse($url);
		if(empty($result)){
			return false;
		}

		//viewerIdが登録されているかをチェック
		//userIdをルーティングパラメータとして追加
		//
		if(isset($result['viewerId'])){
			$userId = $this->__checkViewerId(h($result['viewerId']));
			if($userId === false){
				return false;
			}
			$result['userId'] = $userId;
		}else{
			return false;
		}

		return $result;
	}

	//マッチ処理(array() => URL)
	//
	function match($url){

		//ここに、URL生成に必要な処理を記述する(今回はなし)
		//

		//以下お決まりの処理
		//
		$result = parent::match($url);

		return $result;
	}
}

カスタムルーティングでは、parse()とmatch()を記述する事で、それぞれ正引き(Router::connect())と逆引き(Router::url())で独自の処理を行う事ができます。それ以外のコード(上記では__checkViewerId())は独自メソッドです。
ClassRegistry::init()を用いると、ルーティング処理内でもモデルを扱うことができます。ただし、parse()の段階ではまだコントローラ等は初期化が済んでいませんから、その範囲内での処理しかできないことを留意しておきます。match()は逆引きで用いられるので、タイミング的にcontrollerの初期化が終わっているのでこの限りではありません。
次に、「app/config/routes.php」にカスタムルーティングを適用します。第3引数の連想配列の中にある「routeClass」パラメータに作成したカスタムルート名を指定します。また、このクラスは自動的に読み込まれないので、事前に「App::import()」等で読み込んでおきます。


	App::import('Lib', 'ViewerRoute');
	Router::connect('/foo/hoge/:viewerId', array('controller' => 'foo', 'action' => 'hoge'), array('viewerId' => '[0-9A-Za-z]+', 'routeClass' => 'ViewerRoute'));
	Router::connect('/foo/hoge/*', array('controller' => 'foo', 'action' => 'error'));

これで、viewerIdというパラメータで特定ユーザのみを許可するルーティングが実現できます。また、「ルーティングパラメータに存在しないパラメータを後から追加できる」ことも注目したい点です。上記サンプルでは、モデルから取得したuserIdを追加しています。このパラメータはコントローラ内で「$this->params[‘userId’]」として受け取ることができます。

CakePHPは1.2でも十分に実用的ですが、1.3になってよりいろいろなことができるようになりました。今回の「カスタムルーティング」も使い方次第では大変に便利な機能といえます。また1.2を含めて、まだまだ便利な機能がCakePHPには備わっています。当方の執筆しました「Pocket詳解 CakePHP辞典」では、1.2/1.3の違いを含めコアクラス内に収録されているプロパティ・メソッドを盛りだくさんで紹介しています。こちらのほうもぜひご利用いただけますと幸いです。

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

次の担当は kanonji さんです。
どんなCake話が聞けるか楽しみですね!:D
ちょっと気が早いかもしれませんがMerry Xmas!!

【追記】(2010.12.07)
カスタムルーティングについての解説を若干足しました

【CakePHP辞典】Tips第3回:Model::read()

ModelのTipsが続いてしまいますが、今回はModel::read()についての注意事項です。

通常Modelでデータソースからのデータの読み出しはModel::find()/findBy()を用いるのが一般的だと思いますが、ほかの読み出し方法もいくつか存在しています。その中に今回取り上げます「Model::read()」がありますが、こちらは「プライマリIDを指定してレコード取得」を行うことができます。取得フィールドが指定できるため「find(‘first’, array(‘conditions’ => array(‘id’ =>$id), ‘fields’ => $fields));」に近いと思いますが、意味的にはfindById($id)のほうが近いかもしれません。

取り出し方、結果そのものについてはこれらはそれほど差がありませんが、ひとつだけread()には注意点があります。「Model::validationErrors」プロパティにはモデル保存等でバリデーションエラーが存在する場合にそのエラーメッセージが蓄えられるのですが、read()を実行すると問答無用で初期化します

「Model::validationErrors」プロパティを初期化するメソッドは、「Model::read()」のほか「Model::create()」「Model::saveAll()」の合計3メソッドです。おそらくread()はcreate()のように「モデルを初期化するためのメソッド」という位置づけなのでしょう。create()はコードで初期値を与えますが、read()は既存のレコードから初期値を与える、という感じですかね。なのでバリデーションエラーを保持して読み換えるような場合はread()は使うべきではない、ということになります。find()/findById()のほうがよいと思います。

個人的にはread()はほとんど使わないため「フーン」な仕様なのですが、bakeコマンドでコードを作り出している場合にはread()が含まれたコードを生成するそうなので、注意が必要です。@surface0さん情報ありがとうございました!

当メソッドの解説は「Pocket詳解 CakePHP辞典」の55ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【CakePHP辞典】Tips第2回:Model::save()の追加説明

Pocket詳解 CakePHP辞典」内で、Modelクラスで主要機能でもある「Model::save()」内の解説について、若干足りない部分がありましたので追加させていただきます。

【書式】

$this->save($data, $validate, $fieldList);

【引数】

変数名 初期値 説明
$data array null 保存するデータの連想配列
$validate mixed true バリデーションを行う場合はtrue。また他のオプションを与えたい場合は連想配列で指定。下記参照
$fieldList array array() 保存するフィールド名の配列。nullの場合は現在の$this->whitelistの保存指定を空にする。array()の場合は現在値で保存する

▼$validateに指定できるオプション値

キー名 初期値 説明
validate array null 保存するデータの連想配列
fieldList array array() $fieldListと同じ値を指定する
callbacks array array() コールバックメソッドを実行する場合にtrue。もしくは「before」でbeforeSave()を、「after」でafterSave()を実行する

$validateは、そのものの値はbooleanですが、連想配列を与えることもでき、一般的な$optionsと同じようにオプション値としてふるまいます。この場合は$fieldListは無視されますので、必要なら$validate内に含めます。また「callbacks」というパラメータを与えることもできます。callbacks は通常trueであり「beforeSave()」「afterSave()」コールバックを通過しますが、falseにすることで通過しません。また 「before」「after」とすることでbeforeSave()だけ、afterSave()だけ通過させることもできます。

なお、このcallbacksオプションは「Model::saveAll()」のオプション値としても有効です。何故ならsaveAll()は内部でsave()をコールしているためです。

各メソッドの解説は「Pocket詳解 CakePHP辞典」の58ページおよび61ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【CakePHP辞典】Tips第1回:TimeHelper::dayAsSQL()

不定期ではありますが、「Pocket詳解 CakePHP辞典」をより楽しく便利に使っていただけるよう、本書にて取り上げられているクラス・メソッド等で「あまり知られていないけど便利!」なもの、あるいは説明が不十分なものについてのフォローも合わせて、Tipsとしてご紹介させていただきます。
今回は第1回目として、私自身も1度も使ったことのなかった「Timeヘルパー」内で面白いメソッドがあったので、ご紹介します。

CakePHPの組み込みヘルパーの中に「Timeヘルパー」があります。これは日付に関する便利な機能をまとめたヘルパーなのですが、strtotime()/strftime()をベースにしているため日付フォーマットを選ばずに処理してくれる素晴らしいヘルパーです。1.3からは国際化に対応できるように拡張されていますので、複数ロケールを持つサイトでも大変に役立ちます。

そんなTimeヘルパーなのですが、一部「これ、ヘルパーの役目じゃないだろ??」と言うべき面白いメソッドが存在します。それが今回ご紹介する「Time::dayAsSQL()/Time::daysAsSQL()」メソッドです。メソッド名から容易に分かると思うのですが、なんとヘルパーのくせにSQLを扱います(笑)。
この2つのメソッドは「指定した日、あるいは指定した2つの日付の範囲内であるSQLを生成してくれます。例えば2010/09/29検索条件にしたい場合があると思いますが、その場合に「’conditions’ => array(‘created’ => ‘2010-09-29’)」のように書くことはできません。何故かと言いますと、このように記述した場合は2010/09/29 00:00:00と等しい場合だけしか条件に含まれなくなってしまうからです。
本メソッドは、このような挙動を避けるために、当日(daysAsSQL()の場合は開始日)の0:00:00から23:59:59まで(daysAsSQL()の場合は終了日の23:59:59まで)の範囲をSQL文で返してくれます。これを用いれば日にちで検索することが簡単になるでしょう。

しかしお気づきかと思いますが、本来ヘルパーはViewを補助するためのものですので、Modelに関してあれこれ操作するというのはMVC的に通常ありえません。そもそもTimeヘルパーの機能は汎用的のため、ヘルパーではなくコアライブラリとして存在するほうがしっくりきます。なぜヘルパーになっているのかはわかりません。

しかしなかなか有用な機能かと思いますので、この機能を「ライブラリとして」使ってみましょう。
念を押しておきますが、この手法は裏返せば「ヘルパーをどんなところでも使えてしまう」裏技です。しかし、Cakeのヘルパーは基本的にシステムとの結びつきが大変に強いため、ほとんどがまともに動作しないと思います。たとえばコールバックメソッドで初期化を行っている場合に機能することができません。あくまでも「Timeヘルパーをライブラリ的に呼び出す」用途に限定して利用したほうがいいと思います

たとえばコントローラ内でfindする場合に日付指定をしたい場合は次のようにします。


//hogeアクション
function hoge(){
  //Timeヘルパーの準備
  App::import('Helper', 'Time');
  $time = new TimeHelper();

  //find実行
  $this->data = $this->User->find('all', array(
    'conditions' => array(
      $time->dayAsSQL('2010-09-29', 'created'), 
    ), 
  ));
}

conditionsにフィールド名を指定せず、そのまま突っ込んでいますが、この書き方は有効です。findでは、「(連想)配列内にフィールドを意味するキーを持たない条件はそのままSQLに書き出す」よう作られています。

大事なことなのでもう一度書いておきますが「この使い方はTimeヘルパーのみに限定して利用したほうがいい」です。MVCの枠を飛び出たトリッキーな使い方なので、一般的にはお勧めのできない方法です(過去に私も このような 主張をしたことがあります)。しかしそれを上回ってTimeヘルパーの日時処理機能は便利なものです。このことを十分に理解してご使用ください。

個人的に、Timeヘルパーをコアライブラリにできないか、開発者側に提案してみたいと思います。
ちなみにSessionコンポーネント・Sessionヘルパーは、CakeSessionライブラリをextendsしています。なので、同じような方法ができるのではないかと思います。

なお、本メソッドの解説は「Pocket詳解 CakePHP辞典」の383~384ページに掲載されています。

ほかにも便利な機能が紹介されている「Pocket詳解 CakePHP辞典」を是非よろしくお願いします!

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【CakePHP】「Pocket詳解CakePHP辞典」刊行します!

2013年3月15日に、続編の「詳解 CakePHP辞典」が刊行されました。
詳しくは下記リンクを参照してください。
http://blog.ecworks.jp/archives/1488

今年1月から企画が始まり、いくつかのハードルを超えながら執筆したCakePHPの本が、いよいよ刊行できる運びとなりました!
前回執筆の「PHPで作る携帯サイト デベロッパーズガイド」は、どちらかというとCakePHPの解説というよりはCakePHPを用いたサイト開発手法をメインに書かせていただきましたが、今回は純粋にCakePHPの内部を徹底的に解説した、「CakePHPを使いこなすため」のリファレンスマニュアル本として書かせていただきました。

Pocket詳解CakePHP辞典
【書名】
Pocket詳解CakePHP辞典【出版社名】
秀和システム【著者名】
滝下 真玄

【価格】
2,600円(本体価格)

【ページ数】
672ページ(随一の圧倒的な情報量!!)

【ISBN】
ISBN978-4-7980-2745-6

【発売日】
2010年09月28日より順次販売

前書では600ページ弱もの大作を書いてしまい「もう厚いのは辛いのでやめよう」と思っていましたし、出版社の担当様も相当苦労されていたので、企画時にも「辞書にするのはやめましょうね!」という紳士協定(?)で始めました。しかし、いざ書いているうちにページ数はどんどん増え、気がついてみれば本のみで自立してしまう厚さに(汗)。「Pocket詳解」シリーズに加えていただける事になったのはそれから後の話なのですが、文字通りの辞典になってしまいました(笑)。

この厚さになってしまった最大の理由は「向こう3年間はいつも手元に置いていただける本」というコンセプトがあったためです。CakePHPの関連書籍は幸いな事に他のフレームワーク本と比べてかなりの数があるのですが、ほとんどが初級者向けの本であり、実用的な情報がメインとは言えない状況です。またリファレンス本は1冊存在していますが、1.1~1.2ベータ版だった頃に書かれていた本のため大変に情報が古く、またページ数も抑えられていて主要なものの一部しか解説されていないため、かゆいところに手が届かない感じです。つまり開発現場などで要求に応えられるような本が無い状況であり、この辺を何とかしたいなと思っていました。
私自身も日頃開発をしていく上で「あれっ、あのメソッド何だっけ?」とソースコードを調べ、引数やオプション値を調べて実装する事が多いのですが、この手順が大変に時間を使っていたりしまして、本を開くだけでこれらの値の意味がすぐに分かるような本を熱望していました。Cake本に限らず、ネットの情報、ましてやCookbookやAPIでもオプション値については十分な情報が載っていないため、いつも結局行き着くところはソースコードになってしまうのです。なので「とりあえず全ての引数やオプションの意味が分かるような本があれば便利だよな」と日頃思っていました。

こんな事情もあったため、まず第一にやりたかった事は「オプション値の全てが分かる」事でした。「オプション値を連想配列で渡す」というのがCake流だと思いますが、その肝心のオプションについてよく分からない…そんな事もあるかと思います。一応ソースコード内に記載されているドキュメントでも若干分かるのですが、間違いも多くかなり不正確のため、本書では執筆時に一度ソースを解析してから列挙をしました。
それから「今まであまり知られていない便利な機能の発掘」です。例えばその代表例が「Setクラス」「ClassRegistryクラス」ではないでしょうか。知らない、便利そうなんだけどよく分からないので使わない…みたいになっていませんか? 何を隠そう自分もその一人です(笑)。それだけではありません。日頃モデル・コントローラあるいはコンポーネント・ヘルパー等を作成する際に親クラスでextendsしていると思いますが、その親クラスに有用なメソッドが存在している事をご存じでしょうか。単純にextendsしているだけの方が多いのではないでしょうか? 本書ではその部分についてももれなく解説し、より便利にCakeを使ってもらいたいと考えています。
そして忘れてはならないのが「新機能の解説・従来との比較」です。もちろん本書は「1.2/1.3両対応」です! 紙面の都合上全てを十分に行う事はできませんでしたが、例えば今まで暗闇に閉ざされていた「Jsヘルパー」や「(新)prefixルーティング」「カスタムルーティング」についても理解していただけるかと思います。また、両バージョンそれぞれ固有の指定方法についてもカバーされていますので、1.3へのアップグレードにも役立つかと思います。

紙面の都合上どうしても掲載できなかった情報はやはりあります。
例えばページ数の節約のためにサンプルソースコードはかなり削ってしまいました。このため最初のとっかかりとして買う1冊としてはふさわしくないかもしれません(最低限の記述方法は各章冒頭に一応載っています)。この辺はむしろ初級者向けの本の役割ですので、本書と両方購入していただき、初級本を勉強していく上で分からない引数やオプション値について本書でひいていただくような使い方がベストだと思います。英語の学習に、英語教本と一緒に英和辞典を買うように、本書は辞書として購入していただけると間違いないです
他にも上級者向けの機能(例えばDataSource等)、使用頻度がかなり低そうな機能などについても割愛させていただきました。この辺については別の機会・形で実現できればよいと思いますが。

限られた中でギリギリまで情報を詰め込んだ価値のある1冊になったと思います。Cakeの内側についてここまで解説した本はおそらく今までなく、「世界一CakePHPのことが分かる本!」と自負しています(笑)。カバーの色も大変わかりやすいと思いますので、店頭で見かけましたら是非手にとっていただき、そしてそのままレジに直行していただけますと幸いです(笑)

※09/21時点ではまだAmazon等で予約等はできないのですが、発売情報については後日追記させていただきます

【追記】(2010/09/23)
Amazonに書籍が掲載されました。
下記よりお求めが可能です(是非このページからお願いします(^^;)

Pocket詳解 CakePHP辞典

Pocket詳解 CakePHP辞典 [書籍]

著者滝下 真玄

出版社秀和システム

出版日2010-09-27 (月)

商品カテゴリー単行本

ページ数672

ISBN4798027456

Supported by amazon Product Advertising API

【追記2】(2010/09/25)
見本誌が届きましたので写真を何枚か掲載します。

表紙写真です。見事に自立しています(笑)
本書に収められている内容。ヘルパー編とコアライブラリ編がもの凄い量です!
内容の抜粋。このページはModel::find()。指定できるオプション値が全部載っています