‘CakePHP’ タグのついている投稿

Cakephp1.2: setメソッドを使うときの注意

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPでハマッた件のメモ。

// コントローラー
$hoge_fuga = 'test';
$this->set(compact('hoge_fuga'));

// ここからビューとして・・・
<?php e($hoge_fuga); // testと表示されると思ったのに、表示されない! ?>

15分くらい悩んだ…。変数名にアンダーバーつける前まではちゃんと動いていたし、アンダーバーを付けたらダメというルールもなかった気がする(ずっと使ってたし。)
ここでミソなのが、compact関数です。
compact関数を使うと、アンダースコアがキャメルケースに変更されてしまうらしいです。

参照情報:
http://www.rainorshine.asia/2008/08/10/post602.html

ですので、アンダースコアの場合、compact関数を使わずにsetしましょう。

// コントローラー
$hoge_fuga = 'test';
$this->set('hoge_fuga', $hoge_fuga);

// ここからビューとして・・・
<?php e($hoge_fuga); // testと表示されました! ?>

以上です。
て、久々の更新がメモかよっ!


CakePHPの新しい本が出るらしい

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPの新しい本が出るらしい。著者が、CakePHPガイドブックの方なので安心。それと、個人的に楽しみなのは、Webアプリケーションテスト手法を書かれた岸田さんも著者におられること。CakePHPのテスト駆動開発方法が書かれているっぽいので、これは期待大!

あと、ケータイ対応とかについてもあるらしい。早速、アマゾンで予約しました!!

最近はCakePHPやれてないけれど、CakePHP1.2でヒルクライムしようぜ!をリプレースするのが3月中の目標。ほぼスタティックなサイトを作るにしても、CakePHPのほうがケータイ対応とかが理解できながら作れるから、DB使わないようなサイトでもCakePHPでやろうかな~とか。

CakePHPによる実践Webアプリケーション開発
CakePHPによる実践Webアプリケーション開発 安藤 祐介

毎日コミュニケーションズ 2009-03-26
売り上げランキング : 798

Amazonで詳しく見る by G-Tools


CakePHP1.2 Model::validates($data)の罠

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.2の最新版である、1.2.1.8004にて、Model::validatesをオーバーライドして、モデル毎に独自のバリデーションを持たせていたのだが、いざ実験を行ってみると、全くバリデーションが効いていない。

<?php
    // コントローラー
    if ($this->Model->validates($this->data)) {
        // 検証OK
    } else {
        // 検証NG
    }
?>

上のように書いて、明らかにエラーになるような値を入力して渡しても、なぜかvalidatesをすり抜けてくる。

ちなみにモデル側は、

<?php
    // モデル
    function validates($data = array()){
        if(empty($data)){
            $data = $this->data;
        }
        parent::validates($data);
        // 独自のバリデーション

        if(count($this->validationErrors) > 0){
            return false;
        }else{
            return true;
        }
    }
?>

である。独自に定義したバリデーション自体は通っていた。問題は、フレームワークが最初から持っているバリデーションを通っていないということだ。
うーむ、俺はCakePHP1.1のときに、ずっと上記のような書き方をしていたので、全く理由がわからない。
とりあえずググると、こんな記述を発見。

注意:英語のサイトです。
http://lemoncake.wordpress.com/2007/06/26/validation-gotcha-in-cakephp-12/

どうも、$this->Model->validates($this->data)のように引数を渡したのでは、ちゃんと動いてくれないっぽい。確かに、CakePHPポケットリファレンスでも、引数を渡すのは非推奨と書いてあった。validatesをする事前に、setをする必要があるらしい。

<?php
    // コントローラー
    $this->Model->set($this->data); // 事前にsetしておく
    if ($this->Model->validates()) {
        // 検証OK
    } else {
        // 検証NG
    }
?>

こうしたら、フレームワークが最初から持っているバリデーション機能を通ってくれた。
CakePHP1.1と1.2で、こんな違いもあるのだな~。それにしても、こんなことに2時間くらい悩んでしまった…。相当ストレスがたまってしまったが、原因がわかったし、解決できたから、報われたっす。

■追記
$this->Model->create($this->data)でもよいという記事があった。
参考情報を以下に載せておく。

<?php
    // コントローラー
    // 新規作成の場合は以下でもよい
    if ($this->Model->create($this->data) && $this->Model->validates()) {
        // 検証OK
    } else {
        // 検証NG
    }
?>

Cakephp1.2でModel::findの条件指定変更だったとは!

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

愛媛ITフェアに向けて、社内でオリジナルアプリを作ろうという話になった。開発チームでは、作成するのものの大枠が決定したので、とりあえずプロトタイプを作って、社内レビューして、よさそうだったら出展という流れにしようかなと思って、開発を開始した。

使用するフレームワークはCakePHP。これは勝手に俺が決めて、作っているだけだが、まあプロトタイプ作成だし、手段はどうだっていいということだ。RedMineのWiki上に要求仕様をまとめて、制作開始。

CakePHP1.2もstableが出たし、CakePHP徹底入門も結構前に買ってたので、CakePHP1.2で作ることにした。バージョンが1.1から1.2に変わったことで、便利になった部分も多いが、1.1を覚えてしまったせいで、結構弊害もあって、なかなか難しい。

CakePHP徹底入門
CakePHP徹底入門 イージーゲート

翔泳社 2008-08-29
売り上げランキング : 120410

おすすめ平均 star
starこれから始める人にはお勧め
starがっかり

Amazonで詳しく見る by G-Tools

この本だけでは、正直CakePHPの使い方をマスターできるとは到底思えないが、CakePHP1.2からスタートする人にとっては必須になるだろうなとは思う。個人的には、CakePHPガイドブックから入った人には、CakePHPポケットリファレンスのほうが便利に感じるだろう。

CakePHP ポケットリファレンス (Pocket Reference)
CakePHP ポケットリファレンス (Pocket Reference) 株式会社ブルーオーシャン 岡田 佳典

技術評論社 2008-06-18
売り上げランキング : 16855

おすすめ平均 star
starこれだけで作れそうです。
star現状のCakePHPリファレンスでは最良
starサンプルコードがもう少し丁寧であれば5つ星

Amazonで詳しく見る by G-Tools

さて、本題に入るが、CakePHP1.1のときと同じような感覚で、Model::findメソッドの条件指定に以下のように書いたら、動かなかった。

<?php
// コントローラークラス内での記述
$conditions = array(
    'name' => '= ' . $name,
    'limitdate' => '> ' . date('Y-m-d')
);
$modelInfo = $this->Model->find($conditions); // Modelは任意のModelクラス
if (empty($modelInfo)) { // 追記:emptyを書いたら2重になった
    // 条件に合うものがなかった処理
} else {
    // 条件に合うものが見つかった処理
}
?>

動かなかったというよりは、条件に合うものがなかった処理が実行されてしまった。
確実に条件に合うものがあるのに。デバッグモードを2にしていたため、SQL文を見たところ、条件部分が明らかにおかしくなっていたので、ググってみたら、以下のサイトを見つけた。

CakePHP 1.2 RC1からfindの条件指定方法が変更となった

このページに書かれているが、CakePHP1.2RC1から、Model::findの条件指定方法が変更になり、条件は連想配列の値側ではなく、キー側に持たせるようになった。これらは書籍にはない情報だったので、非常に助かった。先ほどの条件式を新しい方式に書き直すと、以下のようになる。

<?php
// コントローラークラス内での記述
$conditions = array(
    'name =' => $name, // ココを修正
    'limitdate >' => date('Y-m-d') // ココを修正
);
$modelInfo = $this->Model->find($conditions); // Modelは任意のModelクラス
if (empty($modelInfo)) { // 追記:emptyを書いたら2重になった
    // 条件に合うものがなかった処理
} else {
    // 条件に合うものが見つかった処理
}
?>

これで、見事に動いてくれた。CakePHPの情報は本だけではなかなか難しい。一番参考になるのは、やっぱりCookbookかな~と思う。

追記:syntax-highlighterで、emptyを書いたら、2重に書かれてしまった…。plainでみたら、1つなんですけどね。syntax-highlighterのバグかな。


CakePHP:トランザクション機能をつける

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPのバージョン1.2系はトランザクション機能があるみたいだけれど、1.1系にはないようだったので、自前でつけた。といっても、そんなに難しいことはしてない。そもそもトランザクション自体、普通に

// Controller内で
$this->Model->execute(”SET AUTOCOMMIT=0″);
$this->Model->execute(”START TRANSACTION”);
:
if(…){
$this->Model->execute(”COMMIT”);
}else{
$this->Model->execute(”ROLLBACK”);
}

としてもできるので、面倒くさがらなければこれでもいいのですが、面倒です!

そこで、/cake/app_model.phpを/cake/app/以下にコピーして、これを編集。理由はモデルファイル全部でトランザクションを使えるようにするためです。ちなみに、私はMySQLしか使わないので、MySQL限定です。

class AppModel extends Model {

function __construct(){
parent::__construct();
}

/**
* トランザクション開始
*
*/
function begin(){
$this->execute(”SET AUTOCOMMIT=0″);
$this->execute(”START TRANSACTION”);
}

/**
* コミット
*
*/
function commit(){
$this->execute(”COMMIT”);
}

/**
* ロールバック
*
*/
function rollback(){
$this->execute(”ROLLBACK”);
}
}

としてみました。とりあえず、うまくいっているようです。
CakePHPは高速開発はできそうだけど、慣れるまでやはり時間かかりますね。でもかなり楽に思えます。

CakePHPガイドブックには、こういうトランザクションの情報とか載ってなかったから、できれば載せておいてほしかったなぁと思いました。


CakePHPガイドブックで躓いた点

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPを始めるために、XAMPPを初めてインストール。こんなに簡単に開発環境がインストールできるなんて…。もっと早くやっておくべきだったか?そうなると自分ちの自宅サーバ(CentOS)はいらないかもしれないとか考えてしまう。まあWikiを立ち上げているので、いるといえばいるけれど。

で、とりあえず本の通りに進めてみようと思ったら、いきなり躓いた。CakePHPガイドブックのp.45のOrderRecord用のビューを生成するところ。bake.phpでviewファイルを自動生成していたら、bake.phpがwarningを吐きまくってしまった。thtmlファイルはできるのだけれど、DBに作ったカラムの情報とかが全然反映されていないものだった。何度やっても同じ結果だったので、CakePHP自身を疑って最新のnightly buildで上書きしたら直った。CakePHP 1.1.19.63 stableのバグだったのかもしれない。でもいまだにwarningをひとつ吐いている。他のテーブルとの関連性の部分でうまくいってないみたいだから、それかなぁ〜。

まあとりあえず保留して、仕事中に7章の途中まで読み進めた(仕事で空き時間ができたので勉強してたのです)。今まで使っていた独自のフレームワークと比べると目からウロコがボロボロと落ちていっている状態です。早くもっと使えるようになりたい!ああ!しかし基本情報の勉強せんと!ちなみに申し込みました(^^)試験まではあと2ヶ月ですね。ちなみに申し込み期限は今月の27日までです。3年前に挑戦してボロボロだったので(当時はプログラマじゃなかった)、今回はリベンジしたいです。しかしまだJAVAの勉強してね〜!


CakePHPの勉強を始めようかと

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

現在、私が働いている会社でメインにしている開発の仕事はPHPが中心のシステム作り。というかもともとはネットワークエンジニアだったので、他の言語は私は使えません。その分、PEARやSmarty、AJAXやデザインパターン、オブジェクト指向の勉強などは一気にやってどうにか主戦力として働けています(^^;)。ただ、フレームワークについては、いつも独自のフレームワークを用いた開発ばっかりだったので、メジャーなフレームワークに関して学ぶ機会がほとんどなかったため、これからは個人の時間でフレームワークを勉強しようと思います。

以前は仕事で使っていた独自のフレームワークの悪い点をどんどん潰した形のフレームワークを作っていくという、プログラマー暦1年ちょっとのわりには大それたことをやっていたのだけれど(社内の他のメンバーがフレームワークの学習時間を省きながら効率のよい開発ができると思っていたので)、開発の途中で必ずといっていいほど壁にぶち当たりそれを克服してはまた壁にぶち当たり…、まあこれは普通であって楽しくもありためにもなりましたけれど、逆に他のフレームワークはどれくらい使いやすいんだろうか?と思うようになりました。

PHPはたくさんのフレームワークが乱立しているのだけれど、Ruby On Railsに似ているというCakePHPがフレームワークのシェアで一番だということだったので、早速本を買ってみました。

CakePHPガイドブック
CakePHPガイドブック 安藤 祐介 新原 雅司 堂園 俊郎

毎日コミュニケーションズ 2007-10-25
売り上げランキング : 12660

おすすめ平均 star
starもう一歩!
starよくまとまっている
star1.1系がメイン、しかし基本的な学習には充分

Amazonで詳しく見る by G-Tools

まだ完全には読めていませんが、この本の評判もよいですしじっくりと取り組んでいこうと思います。今、実は作りたいシステムがあるので、これを読みながら作れたならば最高だな〜と考えています。あ〜、でも基本情報処理試験のJAVAの勉強も始めなければ!!