Home > PHP
PHP Archive
第2回CakePHP関西勉強会も盛り上がりました&発表資料
第2回CakePHP関西勉強会が終了しました。
前回からは半年程経っているのですが、関西もまだまだアツいです。主催ということで、司会もやりつつ発表もしつつとなったのですが、開始からopening、自己紹介、自分の発表と初めの1時間ほどは喋りっぱなしになって、ちょいバテました:-D
他の勉強会でも主催の方はこういう状況になりがちなので、次回以降は順番等を練りたいですね。
今回の発表ではフックメソッドについて話しました。内容はフックメソッドの紹介と呼び出し順を見える化したデモなのですが、特に最後に触れた認証系のフックメソッドの呼び出し順を気にかけて貰えれば嬉しいです。さらに良い使い方があれば是非教えて下さい。
発表資料をアップしておきます。
以下、いつものようにつらつらとメモ書きです。
1. フックメソッドを極める
- shin1x1
- まあ早い話がslywalkerさんの前節ですよ(冗談):-D
- フックメソッドは便利なので、オススメです
- 色々とアドバイスを頂いた(嬉)ので次に生かします!
2. 究極のコントローラを目指す
- slywalkerさん
- リファクタリングの様子を発表=>これは分かりやすい
- リファクタリングでコードが消えていくエフェクトが面白い!
- ちょうど社内でもコードの見直しをしているのでタイムリーでした。
- AppControllerにアクションメソッドはさすがにやり過ぎかも:-)
3. RubyOnRailsからCakePHPへ
- yabumaruさん
- Rails to Cakeの道はかなり興味津々
- RubyとPHPの状況から
- さすがどちらも知っている人の話は参考になる
- Rails苦行w
- やっぱり手軽に使えるのがCakeの利点
- Railsの application.rb が application_controller.rb
- candycaneでもRailsコードを見ているので勉強になるシーンが多々
- まさかのCakePHP稼働案件公開!
- この事例だけで発表ネタいけますよ:-D
LT1. CakePHPでこんなの作ってみました
- msngさん
- 元先生!
- Cakeを使う経緯から、Cakeで開発したサービスの紹介を
- パパッとサービスが作れるのもCakeの特徴ですね
- 軽妙でLTらしいトークが楽しかったです:-D
LT2. CakePHPでPDFを出力してみる
- keisonさん
- PDF出力をコードを交えて
- 私は素直にPDFlib使っちゃってます:-D
- 外部ライブラリの使い方はPDFに限らずに参考になりますね
LT3. plugin の名前と URL がキモいのを何とかする
- pm11opさん
- 名前の由来がw
- PluginのURLのキモさは感じていたので共感:-D
- 端々に他の人の発表を紹介する心配りがにくいですね
- ネタ的にはもう少し掘り下げて、発表枠でやっても面白そうです!
- Core弄りは黒魔術
- Piza!Piza!
懇親会
- 関西勉強会ではお馴染みのオシャレ韓国料理屋さん
- 遅い時間からお世話になりましたm(_ _)m
- ちょろちょろうろうろしてました
- 人は意外なとこで繋がっているとか
- 実装思想のアツい話とか
- うなぎ饅頭のフリ忘れていたとか
- キャパが少なくてゴメンナサイとか
- Pieceとか
- フレームワークとの付き合い方とか
- rhacoとか
- Perlの勉強会もお邪魔します!
- 色々な方とお話できました
- とにかく盛り上がったので良かったです:-D
- ああー今日は最後の麺が無かった
次もやりましょー
実はここ数日、個人的に色々とあってなかなか大変な状況だったのですが、無事に勉強会が開催できて良かったです。
次回については詳細は未確定ですが、もう少し大きめの会場でやりたいと考えているので、ぜひ皆さん発表の準備をしておいて下さい:-D
東京から急遽参加して頂いたすずきさんのおかげで無事にust配信を行うことができました。ありがとうございました!
参加された皆さん、発表者の皆さん、運営のみんな、本当にお疲れ様でした&ありがとうございました。次回も盛り上げていきましょー!!
- コメント (Close): 0
- Trackbacks: 0
CakePHP フレームワークのソースをapp/で置き換える
こないだのCakePHP勉強会でやったネタですが、需要がありそうなんで書きます。
CakePHPは1.2Finalになって色々と改良が成されて拡張性も増えたのですが、良くなってきた分、さらに色々とやりたくなるのが人の常です。そこでフレームワークのソースをどうしても書き換えたい時にcake/を触るのではなく、せめてapp/でフレームワークソースを置き換えましょう、という話です。
[目標] ConnectionManagerをapp/に置く
デモではDispatcherの置き換えをやったのですが、cake bake diaryさんのエントリのように需要があるかもなので、ConnectionManagerをapp/に置いてフレームワークに読ませようと思います。
1. ConnectionManagerのソースをapp/以下にコピー
ConnectionManagerを一から書いても良いのですが、それも大変なので、まずフレームワークのConnectionManagerのソースをapp/以下にコピーします。
ConnectionManagerはcake/libs/model/connection_manager.phpになるので、それに倣ってapp/modles/connection_manager.phpにコピーします。
$ cp -a cake/libs/model/connection_manager.php app/models/
2. ConnectionManagerのソースを変更する
app/にコピーしたConnectionManagerを変更します。ここでは読み込まれたソースが分かりやすいように先頭にファイルパスをvar_dump()しておきます。
[app/models/connection_manager.php]
<?php var_dump(__FILE__); // <---追加 /* SVN FILE: $Id: connection_manager.php 8120 2009-03-19 20:25:10Z gwoo $ */ /** * Datasource connection manager * * Provides an interface for loading and enumerating connections defined in app/config/database.php * * PHP versions 4 and 5 [/php] <h3>3. ConnectionManagerをフレームワークに読ませる</h3> <p>最後にapp/のConnectionManagerをフレームワークに読み込ませます。これにはApp::import()のキャッシュ機能を使います。</p> <p>方法は簡単で、bootstrap.phpに以下のように書くだけでokです。</p> <p>[app/config/bootstrap.php]</p> App::import('Core', 'ConnectionManager', array('file' => '../app/models/connection_manager.php'));
ブラウザからアクセスすると下のように画面上に2.で書いたパスが表示されて、[app/models/connection_manager.php]が読み込まれているのが分かります。
あとはこのソースをガシガシ書き換えていけばokです。
いざという時使えるかも
少しトリッキーな方法ですが、フレームワークのソースを書き換える手段としては覚えておいて損は無いと思います。
ただし、この方法はApp::import()の機能を利用しているので、フレームワークがApp::import()で読まないソース(Objectとか)は残念ながら使えません。あしからず。
- コメント (Close): 0
- Trackbacks: 4
CakePHP routes.phpの確認はユニットテストで
第4回CakePHP勉強会@Tokyoでakiyanの男前な発表があったので、今後急増するであろうroutes.phpを極めていく人にオススメな確認方法をご紹介します。
routes.phpの確認にはユニットテストをオススメします。
routes.php設定でありがちなループとして、
- routes.phpを設定 -> ああ動いた
- routes.phpに設定追加 -> ああー動かない
- routes.phpを修正 -> あれ?前動いたところも動かなくなってるorz
というのがあるのですが、せっかくCakePHPにはユニットテスト機構があるのでテストを書いて動作確認をしましょう。
SimpleTestをダウンロードしていない人はダウンロードして、app/vendors/かvendors/に展開しておいて下さい。
routes.phpで設定する目標
Web2.0(最近あんまり聞かないですが。。。)なサイトではありがちなユーザIDを含めるURLを実現します。
URL | コントローラー | アクション | パラメータ |
---|---|---|---|
/ | TopController | index | none |
/shin1x1 | UserController | index | $params[‘user_id’] = ‘shin1x1’ |
/shin1x1/edit | UserController | edit | $params[‘user_id’] = ‘shin1x1’ |
それ以外 | NothingController | index | none |
routes.phpを仕様に合わせて設定しておきます。
<?php // Router::connect('/:user_id/edit', array('controller' => 'user', 'action' => 'edit')); Router::connect('/', array('controller' => 'top', 'action' => 'index')); Router::connect('/:user_id/*', array('controller' => 'user', 'action' => 'index')); // Nothing Router::connect('*', array('controller' => 'nothing')); ?>
最後はシステムが取るべきURL以外ならNot Foundを出すように設定しています。これにより想定外のコントローラーやアクションが実行されるのを防ぎます。
テストケースを作る
テストケースは何でも良いですが、とりあえず[app/tests/cases/url_routing.test.php]としておきましょう。スケルトンなソースは以下になります。
当然ながらこれはGREENでとおります。
<?php App::import('Core', 'Dispatcher'); class UrlRoutingTestCase extends CakeTestCase { } ?>
テストケースを書く [‘/:user_id/edit’]
まず[URLパターン=’/:user_id/edit’]のテストです。shin1x1がユーザIDとなっています。URLの正引き(URLからコントローラーやアクション、パラメータ等々を決定)はtest_parseParams~()に、URLの逆引き(コントローラーやアクション、パラメータ等々からURLを決定)はtest_url~()に実装しています。
URLの正引きではDispatcher#parseParams()に対象URLを与えて、その戻り値をassertで確認しています。実際の正引き処理はRouterクラスが行うのですが、戻り値の扱いやすさ、分かりやすさを考えてDispatcherを使っています。よりディープなテストをするならRouter::parse()を使った方が良いですね。
↓では[/shin1x1/edit]というURLに対してどのような正引きを行うかとテストしています。
<?php public function test_parseParams_user_edit() { $Dispatcher =& new Dispatcher(); $params = $Dispatcher->parseParams('/shin1x1/edit'); $this->assertIdentical('user', $params['controller']); $this->assertIdentical('edit', $params['action']); $this->assertIdentical('shin1x1', $params['user_id']); $this->assertIdentical(array(), $params['pass']); $this->assertIdentical(array(), $params['named']); } ?>
次は逆引きです。こちらはRouter::url()にパラメータを設定して、URLを求めています。Router::url()はパラメータからURLを生成するシーン(HelperとかController#redirect()とか)の裏で使われているメソッドなので、ここで求められるURLを確認すれば、実際のアプリケーションの挙動が確認できます。
↓では[controller=’user’、action=’edit’, ‘user_id’=shin1x1]というパラメータからどのようなURLが生成されるかをテストしています。
<?php public function test_url_user_edit() { $url = Router::url(array('controller' => 'user', 'action' => 'edit', 'user_id' => 'shin1x1')); $this->assertIdentical('/shin1x1/edit', $url); } ?>
テストケースを書く [‘/’]
以下、同様です。正引き、逆引きをテストしています。
<?php public function test_parseParams_user_top() { $Dispatcher =& new Dispatcher(); $params = $Dispatcher->parseParams('/'); $this->assertIdentical($params['controller'], 'user'); $this->assertIdentical($params['action'], 'top'); $this->assertIdentical(array(), $params['pass']); $this->assertIdentical(array(), $params['named']); } public function test_url_user_top() { $url = Router::url(array('controller' => 'user', 'action' => 'top')); $this->assertIdentical('/', $url); $url = Router::url(array('controller' => 'user', 'action' => 'top', 'user_id' => 'shin1x1')); $this->assertIdentical('/user/top/user_id:shin1x1', $url); } ?>
テストケースを書く [‘/:user_id/*’]
こちらも同様ですね。正引き、逆引きをテストしています。ここではnamedパラメータやQUERY_STRINGも簡易的にテストに入れています。
<?php public function test_parseParams_user_index() { $Dispatcher =& new Dispatcher(); $params = $Dispatcher->parseParams('/shin1x1'); $this->assertIdentical('user', $params['controller']); $this->assertIdentical('index', $params['action']); $this->assertIdentical('shin1x1', $params['user_id']); $this->assertIdentical(array(), $params['pass']); $this->assertIdentical(array(), $params['named']); $Dispatcher =& new Dispatcher(); $params = $Dispatcher->parseParams('/shin1x1/'); $this->assertIdentical($params['controller'], 'user'); $this->assertIdentical($params['action'], 'index'); $this->assertIdentical('shin1x1', $params['user_id']); $this->assertIdentical(array(), $params['pass']); $this->assertIdentical(array(), $params['named']); $Dispatcher =& new Dispatcher(); $params = $Dispatcher->parseParams('/shin1x1/a'); $this->assertIdentical($params['controller'], 'user'); $this->assertIdentical($params['action'], 'index'); $this->assertIdentical('shin1x1', $params['user_id']); $this->assertIdentical(array('a'), $params['pass']); $this->assertIdentical(array(), $params['named']); // namedパラメータ $Dispatcher =& new Dispatcher(); $params = $Dispatcher->parseParams('/shin1x1/page:1'); $this->assertIdentical($params['controller'], 'user'); $this->assertIdentical($params['action'], 'index'); $this->assertIdentical('shin1x1', $params['user_id']); $this->assertIdentical(array(), $params['pass']); $this->assertIdentical(array('page' => '1'), $params['named']); } public function test_url_user_index() { $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1')); $this->assertIdentical('/shin1x1', $url); $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1', 'page' => 1)); $this->assertIdentical('/shin1x1/page:1', $url); $url = Router::url(array('controller' => 'user', 'action' => 'index', 'user_id' => 'shin1x1', 'page' => 1, '?' => array('mode' => 'hoge'))); $this->assertIdentical('/shin1x1/page:1?mode=hoge', $url); } ?>
ユニットテストで楽々確認
というわけでユニットテストでroutes.phpをテストしてみました。
routes.phpの設定は凝っていくと色々な事ができて楽しいのですが、複雑にしていくとハマリがちです。特に条件が複雑になると意図せぬルーティングにマッチしてしまうことがままあります。
そんな時にテストを書いておけば、手軽に動作が確認できます。また、設定変更等に伴うデグレも簡単に判別することができます。例えば、冒頭にあるroutes.phpの内容も順番を入れ替えるとルーティングが変わるのですが、こういった事もテストを実行すれば、どのような挙動になっているかをすぐに判別がつきます。
URLルーティングのテストは書きやすいですし、書いていくと病みつきになりますよ。来月の自分のためにもバンバンテストを書いておきましょ-。
- コメント (Close): 0
- Trackbacks: 2
第4回CakePHP勉強会@Tokyoが終了しました&発表資料
第4回CakePHP勉強会@Tokyoが無事に終了しました。
私自身は司会やりつつLTもありつつで相変わらずバタバタしていましたが、東京でのCakePHP勉強会は久しぶりだっただけに盛り上がりましたね。
LTではApp::import()について発表しました。何気なく使っても動くのですが、少し内容をおさえておくとより便利に使えますよ:-D。
発表資料をアップしておきます。
以下、つらつらとメモ書きです。
1. candycane
- エバンジェリストで今回ももろもろお疲れ様なyandodさん
- Cakeまんじゅうは意外と旨い
- BTSの概要から、candycaneへ
- アルファテスト開始!
- いちおう名前は入れて貰ってますが、貢献はわずかですorz
- pushします!
2. Ktai Library
- MASA-Pさん
- Ktai Libraryの概要
- まずは衝撃の事実からw(頑張って下さい!)
- 携帯は細かなケアが大変なので、ライブラリは嬉しい人が多いですね
- 一つのビューで3キャリア対応
- タイムリーなdocomo新機種仕様
- さらに今後に期待ですね
3. 極めるroutes.php
- akiyanさん
- routes.phpの解説を具体例を交えて
- paramsルーティング
- 怖がらずにroutes.phpを使おう!
- 丁寧な解説は勉強になった人も多いかと。
- さらにPrefix Routingを使うとハマりポイントがあったりで楽しいですよw
- ウチはホワイトリスト的に通過するURLは全て設定して、それ以外は404出すようにしてます
LT1. CakePHP1.3
- cakephperさん
- CakePHP1.3について
- bakeでFixtureの項目は出るのに、まだ操作できないとか
- 1.2 to 1.3なマイグレーションとか
- deployとか
- 今のところ、1.3は1.2の熟成バージョンな印象
LT2. phpUnderControl + CakePHP
- miauさん
- ツールも話し方もまさにLT!
- ツールが知りたいです。。。
- CakeでCIなアプローチをマジメにやっているのは面白いですね。
- phpUnderControlは本当に触ってみたい
- ただphpUnderControlはphpUnit前提なので、SimpleTestなCakeではXML変換など細工が必要
- さらにノウハウが公開されるのに期待!
LT3. CakePHPにPEARのImage_Graphを入れてみた
- s_yo_koさん
- ImageGraphの紹介
- 簡単にグラフ作成
- 日本語もok
- 一番苦労したのはPEARのインストールw
- 最近、私はグラフはJavaScriptのライブラリ使ったりしてます
LT4. ビヘイビアの紹介と使い方
- matsuuraさん
- Sun Limited Mt.の中の人!
- 便利なビヘイビアの紹介
- $behaviorsは一度はやりますねー
- メ○チを論理削除w
- 野球ファンにはこれほど分かりやすい例は無いw
- ビヘイビアはホントに便利!
- 特に自作するとその便利さが実感できます
LT5. プラグイン三段活用
- slywalkerさん
- ここから第2部(懇親会)での発表
- くだけた雰囲気で異様な盛り上がりw
- とても東京発表デビューとは思えない落ち着いた発表&ネタw
- 笑いだけでなく、内容もキッチリあるのがさすが。
- プラグインを使いこなしているslywalkerさんならではの視点ですね
- 修復しながら建築メソッドw
- 来月(関西勉強会)もよろしくお願いしますー
LT6. 10分で分かるApp::import()
- shin1x1
- 突っ込んで頂いた皆さんありがとうございました!
- 楽しかったです!
- こんなにゆるく発表したのはさすがに初めてだったw
- この雰囲気だと話しやすい人多いでしょうねー
- 懇親会->勉強会とかも良いかも
- 妙にハイテンションだったので、五月蠅く思われた方スミマセン。。。
懇親会
- 色々とお話しました
- 自社フレームワーク、とか
- iPhoneアプリ、とか
- 勉強会について、とか
- 勉強会に遠征する、とか
- インフル、とか
- 皆さん盛り上がっている様子で嬉しかったり
- 日本のイベントに海外から来てくれるのに、日本からほとんど行かないのはどうよ。
- チケットでもTips書くでも何でももっと英語圏にも情報発信すべきでは?
- ↑二つは耳が痛い。。。頑張らないと!
お疲れ様でした!
発表を詰め込んだので落ち着かない雰囲気でしたが、参加された皆さんが楽しんで頂けたのなら嬉しいです。(私は楽しかったです:-D)
発表者の皆さん、せっかくの発表なのにせかしてスミマセンでした。これは全く持って、自分の時間調整の問題なので、申し訳無かったです。
最後になりますが、会場・機材提供頂いたグリーさん、そしてサポート頂いたいちいさん、本当にありがとうございました!おかげで快適に会が運営できました。
参加された皆さん、発表者の皆さん、運営チームのみんな、本当にお疲れ様でした!!
- コメント (Close): 2
- Trackbacks: 3
勉強会を楽しむなら発表しよう!
せっかく勉強会に参加するなら発表してみましょう!という話です。
演台に立って、プロジェクタに資料を写しながら発表をする。
勉強会に良くある発表の風景ですね。あなたもこの登場人物になってみませんか?
発表のメリット
勉強会で発表するとこんな良いことがあります。
1. より深くテーマを学ぶことができる
発表するとなると、内容を考え、資料を作るでしょう。となると発表内容について、調べ、考え、まとめるわけです。この過程でより深く学ぶことができるわけです。特に初めての発表なら、失敗したくはないでしょうから(失敗しても良いんですけどね)、必死のぱっちでやるでしょう。明確な目的を持った学習は効果が高いのはあなたも経験済みだと思います。
2. 勉強会への予習ができる
1.のおまけですが、そうやって勉強会のテーマについて少しでも学習して行くと、他の方の発表もより楽しむことができます。
3. 数十人(数百人?)が自分の話を聞いてくれる
もちろん緊張しまくるのですが、これって冷静に考えるとすごいことではないでしょうか。同じ興味を持った数十人(数百人)が自分の話をちゃんと聞いてくれるわけです。路上で弾き語りしても、この人数は簡単には集まらないでしょう。まして路上でCakePHPについて語り出したら、色んな意味で大変です。
4. 懇親会が楽しくなる
懇親会まで参加する人は基本そのテーマの話をしたい、聞きたいわけなんです。ただ知らない人同士だとなかなか話しづらいし、会話も弾まない。という時にまず共通のテーマになるのが勉強会の発表なんです。さらに発表した人のことは参加者は知っているので話しやすいわけです。
というわけで発表した人は懇親会でモテモテ、は言い過ぎでも、確実に話しかけられます。「発表良かったですよ」「あそこを教えて下さい」「blogとか書いてないんですか?」等々。自分から話すのが苦手な人はいっそのこと発表してしまえば良いんです。
5. 発表のフィードバックがある
勉強会以後にも楽しみがあります。参加者からの勉強会レポです。「良かった」「悪かった(これはあまり書かれないけど)」「ためになった」なども感想だけでも嬉しいですが、わりと具体的な内容に踏み込んだレポも多いです。間違っていたところがあれば指摘もして貰えるし、その人なりの意見が聞けたりもします。
勉強会から数日は「○○勉強会」をググりまくること請け合いです。
発表をためらう理由
どうでしょう、「発表してみようかな」という想いが芽生えてきましたか?
心の中に少なからず「発表してみたい」「あんな風に前に立って話してみたい」という想いがあるのに、なぜ発表することをためらうのでしょうか。
自分の経験から考えると、以下のような理由からではないでしょうか。
話すネタないよ。。。
例えばCakePHPの勉強会なら、普段から何かしらCakePHPに触れていればきっと話すネタはあります。発表する内容は、何も小難しいことや、斬新な切り口でなくても良いのです。あなたがCakePHPを触っていて、普段やっていること、感じていること、疑問、悩みを発表にしてしまえば良いのです。
「君の当たり前に僕らは感嘆させられるんだ」
人前で話すのが恥ずかしい。。。
全然大丈夫です。何が大丈夫だと言うと、緊張して、顔が真っ赤になって、汗が出て、かんで、頭が真っ白になって「普通」なんです。
もちろん仕事でも勉強会でも発表を見ているとプレゼン慣れされていて、とても上手い発表をされる方はいらっしゃいます。でもそういう方を良く観察してみると、実は緊張してたりするのです。発表中はそんな素振りはなくても、発表前はそわそわしてたり、顔色が悪かったりします。そんなスゴイ人でも緊張するのです。
緊張の度合いは人それぞれですが、上手い人が緊張するのですから、初めての人が緊張するのは当たり前のことです。
さらに「緊張している」ことは勉強会の発表では大した問題ではありません。聞いている側は緊張していることは分かりますが、そんな事は全く気にしません。「頑張れ!」「大丈夫!」と思っているだけです。そんなことよりあなたの話が聞きたいのです。
「君の話が聞きたいんだ」
人前で話すことなんか無いし。。。
本当に無いですか?数十人、数百人の前で話す機会は無くとも、数人の前で話すことなら、学校でも会社でもあるのではないでしょうか。自分の考えをまとめて、それを発表する、というのはこういったプレゼンテーションの場だけに限らず、打ち合わせや報告の場ではよくあることです。
何ならここで練習してしまえば良いのです。そして、その成果を本業で生かせば良いのです。
「うまく生かすどうかは君次第」
発表してみよう!
ここまで読んだあなたなら発表したくて、ウズウズしてきたんじゃないですか?
ご心配なく。5/22に第4回CakePHP勉強会@Tokyo、6/5に第2回CakePHP関西勉強会がありますよ。
どちらもLT枠がまだ空いてます。
CakePHPを触っている方ならきっと話すネタがあります。例えば、以下の内容なんかは話しやすいのではないでしょうか。
- CakePHPとの出会い(前はSmarty使ってたけど。。。、Railsから、etc)
- CakePHPで開発してみて(ここに詰まった、ここは便利!etc)
- こうやってCakePHPで開発してる(まず画面を作って、DB設計して、bakeを使って、、、etc)
- ○○とCakePHPを比べて(symfonyとかCodeIgniterとか、etc)
@東京で発表したい方は第4回CakePHP勉強会@Tokyoからyandoさんにメールを送ってみて下さい。
関西勉強会で発表したい方は、メール(shin1x1[at]gmail.com)でも、このblogのコメントでも、是非、手を挙げてみて下さい。お待ちしてます-。
(関西勉強会は、参加申込出来なかった方もLT発表されるなら参加できます!)
@see 懇親会を楽しむ5つの方法
- コメント (Close): 2
- Trackbacks: 2
CakePHP cache()はCache::write()に
CakePHPにはキャッシュを行う関数cache()があるのですが、1.2.2のソースを見るとdeprectatedになってました。
[cake/basics.php]
<?php /** * Reads/writes temporary data to cache files or session. * * @param string $path File path within /tmp to save the file. * @param mixed $data The data to save to the temporary file. * @param mixed $expires A valid strtotime string when the data expires. * @param string $target The target of the cached data; either 'cache' or 'public'. * @return mixed The contents of the temporary file. * @deprecated Please use Cache::write() instead <---ココ */ function cache($path, $data = null, $expires = '+1 day', $target = 'cache') { ?>
代わりにCache::write()を使えとのことなので、cache()とCache::write()との違いを見てみました。
1. キャッシュエンジンが選べる
これが一番の違いかと。
cache()ではキャッシュの保存先にはファイルしか選べません。おかげで単純な実装で分かり易いという利点もあるのですが、APCやmemcachedなどにキャッシュを保存できません。
Cache::write()では[app/config/core.php]で設定を行えば、APC/XCache/Memcacheと色々なキャッシュエンジンを選ぶことができます。特にMemcacheではサーバを分散させた時にキャッシュをサーバ間で共有できるので、これは良いです。
パフォーマンスもファイルよりAPC等の方が良いです。
2. 連想配列やオブジェクトがそのままキャッシュできる
cache()ではキャッシュの保存にfile_put_contents()を使っているので、連想配列やオブジェクトをキャッシュする際はserialize()が必要でした。(逆に取得したキャッシュを使うにはunserialize()が必要。)
Cache::write()では連想配列でもオブジェクトでもそのままキャッシュしてくれます。これもちょっとしたことですが、便利です。
3. キャッシュ有効期限が手軽に変更できなくなった
cache()では第3引数がキャッシュ有効期限となっているので、cache()の呼び出し毎にキャッシュ有効期限を設定することが簡単でした。
Cache::write()では引数でキャッシュ有効期限を渡すことができないようで、[app/config/core.php]等にCache::config()を使って、あらかじめ有効期限を設定しておく必要があります。
<?php Cache::config('default', array( 'engine' => 'Apc', //[required] 'duration'=> 10, //[optional] <----キャッシュ有効期間(秒) 'probability'=> 100, //[optional] 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string )); Cache::config('app', array( 'engine' => 'Apc', //[required] 'duration'=> 360, //[optional] <----キャッシュ有効期間(秒) 'probability'=> 100, //[optional] 'prefix' => Inflector::slug(APP_DIR) . '_', //[optional] prefix every cache file with this string )); ?>
上記例なら’default’なら10秒、’app’なら360秒がキャッシュの有効期間となります。
ビューキャッシュはcache()のまま
キャッシュと言えばビューの出力をキャッシュするビューキャッシュがあるのですが、こちらは1.2.2でもキャッシュの保存にcache()を利用しています。つまり、キャッシュエンジンをAPC等に変更してもビューキャッシュだけはファイルに保存されます。
複数サーバでビューキャッシュを共有したい時はビューの出力をフックしてCache::write()でキャッシュするなど、一工夫が要りそうです。
deprecatedとするなら、まずフレームワークで実行するビューキャッシュCache::write()にすべきだとは思うのですが、これはいずれは実装されるのでしょう。
- コメント (Close): 1
- Trackbacks: 3
第2回CakePHP関西勉強会を開催します
6/5(金)に第2回CakePHP関西勉強会を大阪で開催します。
■内容
CakePHPに関する発表(Tipsや事例紹介等)と質疑応答を行います。■概要
日時: 2009年06月05日(金) 19:00~
会場: 扇町インキュベーションプラザ(メビック扇町)
URL: http://www.mebic.com/outline/
MAP: http://www.mebic.com/access/
費用: 200円~500円程度(会場・機材費を参加者で頭割り)
events.php.gr.jp – 第2回CakePHP関西勉強会
前回から半年近くご無沙汰ですが、ぎりぎり春の終わりくらいに開催となります。
今回も前回と同じスタイルで自己紹介、発表、LT、懇親会という流れです。
発表者には、Rails使いの方がいらっしゃったり、pluginな方がいらっしゃったりと、となかなか楽しみな内容になりそうです。(私も発表する予定です)
今回もLT枠があります。「オレ(わたし)に話させろ」な方も、「初めてだけどせっかくだし話してみたい」な方も、是非この機会に発表してみませんか?発表希望な方は、このblogのコメントでも、メール(shin1x1[at]gmail.com)でもお気軽にご連絡下さい。
なお参加にはevents.php.gr.jpにて申込が必要となります。申込開始は5/11 0:00からとなります。申込を受け付けています。
関西のbaker、PHPer同士交流を持てる良い機会ですので、是非ご参加下さい!
- コメント (Close): 0
- Trackbacks: 0
第2回CakePHP関西勉強会@大阪を6月に開催したい
毎月のようにいろいろなイベントをやっていて忘れがちですが、約半年ぶりのCakePHP関西勉強会を6/5か6/5に開催できればと思って相談を進めています。発表内容などもこれから調整していく段階です。
いまのところ出てきそうな内容としては、、、って何にも決まってません:-P
アイデアや発表希望がある方はお気軽にご連絡ください。
ネタッぽいですが、ホントにやります。いや、ホント。
- コメント (Close): 0
- Trackbacks: 0
CakePHP勉強会@福岡に参加しました&発表資料
CakePHP勉強会@福岡に参加してきました。
最近は専ら仕事仕事でイベントに参加する余裕が無かったのですが、福岡開催かつCakePHP+PostgreSQLイベントということでむりくり時間を作って参加してきました。:-)
あとLTながら発表もちょろっとしてきましたので、資料を上げておきます。
以下、つらつらと。
1. CakePHPでPostgreSQLを使おう
- 清末さん
- 世のCake本は全部MySQL。PostgreSQLは?
- PostgreSQLでセットアップ。
- 落ち着いたプレゼンで勉強になります。
- デモで問題発生!=> デモの保険は大事。
- PostgreSQL勉強会@九州との合同開催なので、Cakeが発行したSQL文を解説。
2. cakeを焼い(bake)てみよう!
- 藤田さん
- bakeの手順を言葉で説明していくのは結構大変><
- デモで問題発生2!=> デモの保険は大事2。
3. CakePHP+PostgreSQLでの失敗談と解決策?
- 安元さん
- 複雑な参照クエリをどう表現するか?
- ViewTableを使う!=> 同じく:-D
- SQLは積極的に使って良いと思う。ただしコントローラには書かない。モデルのメソッドに閉じ込めておく。
- SQL分かる人はSQLを活用したいですよね。
4. 今こそプラグイン
- 安藤さん
- Paginate脆弱性の告知から
- Component/Behavior/Helperの役割からPluginの立ち位置を説明
- debug_kit:symfonyからインスパイアw。CakeInfoもここまでやるべきだったかなー。
- api_generator:APIドキュメントを即席で作るプラグイン。これは良いなー。
- 時間があるのでgit講習会
- 画面を持てる拡張ならプラグイン
- cakephp.orgでプラグイン公開できるようになるらしい
LT1. CakePHP Console Application 拡張Tips
- k1LoWさん
- bakeとi18nシェルの解説
- デモで問題発生3!=> LTは時間との勝負。。。。
- i18nはcakeコマンドを活用する場面ですね。
LT2. pgpool-IIとSlony-IでCakePHP
- shin1x1
- どう考えても5分では足りないネタ。
- ガーと勢いで話しました。
- いちおうミッションは達成できたのでヨシとします:-)
LT3. CakePHPをもっと便利
- ichikawaさん
- あのcakephperさんだ!
- debug_kitネタが安藤さんとかぶる:-D
- ExplainSqlComponentの機能がdebug_kitに加わると良いなー。
LT4. TDDひとりでできるもん
- rytichさん
- 実はTwitter関連で交流があったので楽しみでした。
- テストネタは「実践本」にもありますよ:-D
懇親会
- 炉端なお店で総勢30名がお鍋を囲んで。
- 名刺をホテルに置き忘れる失態っぷり><
名刺を下さった皆さんスミマセンでした。。。 - 色々な話で盛り上がりました。
- 懇親会エントリが良かったよーと言って頂けて嬉しかったり。
- 福岡はノリが良い!やっぱ好きだ。
- Cakeバッジは安藤さんから預かったので関西勉強会で配ります-。
- 注目の象さんは熾烈なじゃんけん大会の結果rytichさんの手に!
2009年初参加のイベントだったのですが、やはり楽しいです。福岡のコミュニティはノリが良くて元気出ました。
参加された皆さん、発表・運営を行ったみなさん、本当にありがとうございました!
- コメント (Close): 0
- Trackbacks: 0
「CakePHPによる実践Webアプリケーション開発」が出ます
執筆に関わった「CakePHPによる実践Webアプリケーション開発」が今月末に発売されます。
私は「Chapter 4機能を拡張する」を担当しました。
本書全体では一つのシステムを構築していく流れを解説しているのですが、私の章ではそのシステムの拡張を通して、メインでは触れていないフレームワークの機能を解説しています。
「メール送信」「携帯対応」「CSV出力」といった現場ではよくある機能をいかにCakePHPの機能を使って実装するかについて書いてるので、実際の開発に取り入れやすい内容だと思います。活用して頂ければ嬉しいです。
ちなみに個人的には本書の目玉はChapter 3のユニットテスト解説だと思ってます。
フレームワークに即したユニットテスト解説がしっかりと書かれているのはCakePHPに限らずわりと珍しいように思います。しかも書かれているのが、CakePHPカンファレンスや勉強会でテストについて講演されているきしださんなのでこれは間違い無いです。
テストを書いた方が良いのは分かるけど、どう書けば良いか分からないという方には是非手に取って貰いたい本です。
もちろん安藤さんの導入も見逃せないところですよ:-D
というわけで発売までしばし時間がありますが、よろしくお願いします!
- コメント (Close): 9
- Trackbacks: 0
ホーム > PHP
- 検索
- フィード
- メタ情報