‘CakePHP’ カテゴリーのアーカイブ

俺的にRuby on RailsとCakePHPの比較(コーディングしやすさ)

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

※先に断っておきますが、おいらはPHPerであり、Rubyは勉強中の身です。CakePHPは業務で使ったことも趣味で使ったことも、人にチョロッと教えたりもしてるくらいのレベルですが、Railsでアプリをリリースしたことはないです。

ここのところ、毎日少しずつではあるのだけれど、『RailsによるアジャイルWebアプリケーション開発』を進めているんだけど、だんだんCakePHPのほうがサクサク開発できるんじゃないだろうか?と思うようになってきてる。自分がCakePHPのほうが慣れているし、なんといってもPHPerなので、Joel本で書かれているように頭が自分が慣れている言語を中心に考えてしまうというやつだわなぁ〜。

Railsはというか、Rubyがオブジェクト指向言語だから、流れが全てオブジェクトなのに対して、CakePHPはデータ関連は基本的に配列で管理するから、な〜んかシックリくる。CakePHPにおけるオブジェクトは基本的にデータを加工したりするもので、配列はデータなので、見ただけで何を表しているか大体わかるが、Railsは中身を見ないとわからないというか…。まぁ俺がRubyをまだモノにしていないヘタレというだけかもしれない…。

ただコード中の文字数だけで言えば、Railsのほうが少ないかな〜と思う。
慣れればRailsのほうがいいのかな…。

PHPerとしての言い訳していいですか?

Viewを書く時、
キーボードでphpタグの始めの<?って打ちやすいけど(左手の小指でShiftキー押して右手で<?を打つ)、erbの始めの<%って打ちにくいんじゃ〜!!(左手の小指でShiftキー押して<、次の%が…左手小指でShift押してるから左手人差し指で%が押しにくい)
erbのタグはコーディングにタイムラグが発生してイラッとする。まぁ、単なるタイピングスキルの違いだが、非常に大きな違いに感じます。

これ、賛同者がいたら嬉しいッス!


CakePHP:【解決】AU携帯でSecurityComponent

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

SecurityComponentを使うとAUケータイでブラックホールに吸い込まれるという話を昨日書いたわけですが、解決方法が見つかったので、それを書きます。
ちなみにCakePHPユーザ会のほうにも投稿しておいた。

$form->create で出力されるfieldsetを消す方法

昨日の投稿にも書きましたが、SecurityComponentを使うとAUケータイではdisplay:noneになってるfieldsetタグ内のトークンがPOSTされません。よって、fieldsetタグのみを削除すれば動くに違いないということで、fieldsetタグを削除する方法です。

参考にしたサイトは以下です(英語)。
http://cakeqs.org/eng/questions/view/disable_fieldset_around_an_hidden_form_element

CakePHPユーザ会のほうに書いた方法でもいけると思いますが、何度も使いたいので自分はKtai LibraryのKtaiヘルパーにメソッドを追加しました。

/app/views/helpers/ktai.php

/**
 * Ktai helper class for CakePHP1.2
 */
class KtaiHelper extends Helper {

	var $helpers = array('Html', 'Form'); // 'Form'を追加した

	var $_lib3gk = null;

// ... 最後に以下の2つのメソッドを追加
	function form_create($model = null, $options = array()){
		$out = $this->Form->create($model, $options);
		return strip_tags($out, '<form><input>');
	}

	function form_end($options = null){
		$out = $this->Form->end($options);
		return strip_tags($out, '<form><input>');
	}
}

View側では、以下のように使います。

<?php echo $ktai->form_create($model, $options); ?>

AUケータイで試してみましたが、結果は上々でした。


CakePHP:AU携帯とSecurityコンポーネント

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

現在、とあるアイドルグループの携帯用アンケートサイトを5営業日以内で作れという至上命令が下っており、そのために久々にCakePHP復活!Ktai Libraryを使ってどのケータイでも対応しちゃうぜ!ちなみにKtai Libraryを使うのは初。本は買ってた。

データベース設計は同僚がやってくれたので(彼はDBのスペシャリスト)、俺はBakeでソースを生成し、デザイナが作ったデザインをViewに組み込み、Modelの設定を行い、Captchaコンポーネントを使った画像認証を組み込み、コントローラーに処理をゴリゴリと書き(Fat Modelになるような仕様ではないため。まぁ汎用的なメソッドはModelに作ったけど)、FireMobileSimulatorで確認しながら開発。

一通り実装が完了したので、実機(俺のAU携帯と後輩のSoftbank携帯)とDoCoMoのシミュレータで試すとやっぱり動かなかったりした。まぁそういうことを試すためだからいいんだけど。ソースを修正しては試す。これによりDoCoMoはOK。SoftbankもOK。しかし、AUだけPOSTしたら404と言われる。なぜだ!

Ktai Libraryを使ってたら、redirectのところでURLの組み立てで変になった箇所があったので(Controller::redirect()の引数に配列形式で値を渡すと壊れる。引数をis_arrayでチェックすると直った)、また似たようなことが起こってるのかなぁ~とApacheのアクセスログを見てみると、ちゃんとPOST先のURLにアクセスしている。しかし、Content-lengthが0。0とはおかしいじゃないか!

まさかと思ってCSRF対策用に使っていたSecurityコンポーネントのBlackHoleCallback関数を設定してログを出すようにしてみたら、ビンゴ。BlackHoleに吸い込まれているじゃないか。しかも、俺はここのPOSTはデータベース更新に関係していないのでCSRF対策してない($this->Security->requireAuthに追加していない)。にもかかわらず、トークンが発行されてるのにも納得がいかない。

何がなんだかわけがわからないので、CakePHPユーザ会で検索してみたら、有力な情報を得た。

携帯のblackhole 対策

Securityコンポーネントのトークンはfieldsetタグ中に囲まれているのだが、このfieldsetタグにはdisplay:none;が設定されている。AU携帯はPOSTするときにdisplay:none;が設定されている領域の値をPOSTしないらしい。サーバ上にはトークンが設定されているにも関わらずトークンがPOSTされないから、トークン不一致でブラックホール行きという仕組みだったのか。

今思いついてる解決策は、

  • Formヘルパー自体を修正する(ライブラリ自体の修正はやりたくない)
  • $form->create(), $form->end()で取得したソースからfieldsetタグを正規表現で取り除く処理を実装する(若干難しそうだが一番意味がありそう)
  • Securityコンポーネントを使わずに独自のCSRF対策を施す(一番現実的か?)

である。まぁ時間があれば2番目で行きたいが、3番目かな。原因が突き詰められたので、Securityコンポーネントを外してAUで試したところ、普通に動いてくれた。あ~、よかったぁ~。ひとまず安堵。

まぁセキュリティ系の課題はあるものの、処理自体は2人日で実装完了。やはりCakePHPの開発効率はかなりいいなぁと思う。簡単かつ早いかつ安心。ただ、時々超ハマる…。

【解決しました!】
次の投稿でこの問題は解決したのでリンクはっておきます。
CakePHP:【解決】AU携帯でSecurityComponent


CakePHP:Security Componentでハマる(最中)

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

CakePHP1.2ガイドブック
CakePHP1.2ガイドブック
おすすめ平均
starsサンプルコードが提供されず不便
stars入門から応用まで対応

Amazonで詳しく見る by G-Tools

Security Componentを使っているのだけれど、全くわからず…。

// コントローラー
class EnqueteController extends EnqueteAppController{
  var $components = array('Security');

  function beforeFilter(){
    parent::beforeFilter();
    // CSRF&リロード対策
    $this->Security->requireAuth('post_data');
    $this->Security->blackHoleCallback = '_reload_error';
  }

  /**
   * アンケートの回答を受付
   */
  function post_data(){
    // 受付処理
  }

  function admin_add(){
    // 管理者用アンケート追加処理
  }

  function _reload_error(){
    // blackHole処理
  }
}

というふうに作っているのであるが、admin_addで、データをpostすると正常な場合は登録されるのであるが、わざとエラーを起こした場合に、validates()の結果をフォームに反映するのではなく、blackHoleCallbackで設定されている_reload_errorメソッドを実行されてしまう…。

validates()の結果がエラーになるとblackHole行きになるの???

1.2.5 SecurityComponentでハマったときに確認するポイント

を参照して、$form->create()と$form->end()を使っているのだが…。
(ちなみにtableFormヘルパーを作ってるので、$tableFrom->create()とかだけど)
$tableForm->submit(‘送信’);も使ってるけど。

だいたい$this->Security->requireAuth()にメソッド名加えてないんだから、Securityコンポーネントに関係ない処理になるんじゃないの?また、もしブラックホールに吸い込まれるんなら、この場合は正常なときも吸い込まれるんじゃないの?わけわかんないっす・・・。

とりあえず、Securityコンポーネントを外して実装してから考えようか(ガックリ…)
なんか実装がどんどん遅れていくなぁ。
フレームワーク使う目的って効率上げることなのになぁ。


CakePHP:昨日のプラグインのはバグじゃなかった

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

CakePHP1.2ガイドブック
CakePHP1.2ガイドブック
おすすめ平均
starsサンプルコードが提供されず不便
stars入門から応用まで対応

Amazonで詳しく見る by G-Tools

昨日、プラグインの$useTableが効いていないという投稿をしたけれど、あれはバグじゃなかった。なんてことはない。自分の勘違いだった。

class Enquete extends EnqueteAppModel{
  // var $hasMany = array('EnqueteAnswerList'); // ここがミス
  var $hasMany = array('Enquete.EnqueteAnswerList'); // プラグイン名.モデル名でつなげばOK

}

$useTableの問題だけかと思っていたら、明らかにモデルを見ていないような感じの処理を行ったので(画面が真っ白になったり、モデルクラスに作成したメソッドをコールしても呼ばれなかったり…)、CakePHPのCookBookのプラグインモデルのページを確認したらあっさりと答えが書いてあった。

バグ扱いしてすみません〜(T_T)

多分、昨日のもこれが原因だったんだろうな〜。


CakePHP:pluginのModelで$useTableが効かないバグ?

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

CakePHP1.2ガイドブック CakePHP1.2ガイドブック

毎日コミュニケーションズ 2009-06-27
売り上げランキング : 51427
おすすめ平均

Amazonで詳しく見る by G-Tools

(訂正)この記事でCakePHPのバグかと勘違いしていましたが、自分の設定ミスでした。
詳しくは、次の日の投稿を参照のこと。

CakePHP1.2.3を使ってたのであるが、プラグインを開発していて(といっても、1.1で開発したやつを1.2に移植してるだけ)、さて動かすかという算段でアクセスしてみたら、

Error: Database table enquetes for model Enquete was not found.

と言われた。このエラーメッセージから、アンケートプラグインを作っていたのがわかるw
それはともかく、Enqueteモデルでは、

<?php
class Enquete extends EnqueteAppModel
{
  var $name = 'Enquete';
  var $useTable = 'enquete'; // テーブル名はenquetesではなく、enqueteなのだ
}
?>

なのである。ただ、俺は掲示板プラグインも作っているのだが、掲示板プラグインではそんな事にはなってない。掲示板プラグインとアンケートプラグインの違いは、掲示板はbbsテーブルのみだが、アンケートは、enquete, enquete_answer_list, enquete_resultという3つのテーブルを使っている事だ。hasManyとかで参照しているModelの$useTableを見てないんじゃないだろうか?

googleで検索してみたら、以下を発見。
https://trac.cakephp.org/ticket/4131
チケット出てるやん。でもcloseされてるみたい。でもその後に、再現するからもう一度テストしろっていう書き込みが見られるが、スルーされてるっぽい。1.2 RC1の頃のチケットだからなぁ…。

CakePHP 1.2.5が出てたのでひょっとしたら直ってるかな〜と思ってcakeディレクトリを上書きしてみたけれど、結果は変わらず。直ってないやん。

なんか面倒だったので、テーブルを複数系にして対応してしまった。
でも、enquete_answer_listsって、リストなのに複数形ってオイ!!と自分で突っ込みたくなる。正直気持ち悪い。まあとりあえずってことで。


CakePHP: WindowsでのXAMPPが異常に遅い

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

CakePHP1.2で、ヒルクライムしようぜの開発をしているのだけど、現在停滞中。
理由は、CakeをデバッグモードにしているとXAMPPが異常に遅いから(やる気を削がれた)。
XAMPPが遅い理由は、わからない…。

MacBookにMAMPをインストールして、こちらで全く同じソースを走らせたら2秒で表示されたのに対し、Windows環境のXAMPPなら、22秒。もう遅すぎ…。1ページ修正して様子を見るのにあまりに時間がかかるため、あきらめた。解決策を探してみたものの、見つからないし。

試しに、Cakeをダウンロードしたままの状態でXAMPPで走らせてみたら、それでも3秒かかった。まっさらな状態で3秒かかるって。

まあ考えられるのは、Apacheの設定とかなんだろうと思う。Cakeのソースが同じなんだから。とりあえず、ヒルクライムしようぜの開発はMacBook側で行うことにして、ソースを移動させた。画面の大きさが小さいので開発しにくいと思ったので、以前使っていたUXGAのディスプレイにつないでデュアルディスプレイにした。
前に使っていたやつはヤフオクで買ったやつでもう古いためか、久々に電源を入れたら画面が黄色がかっててショックだった。MacBookの画面がきれいなだけに余計際立ってしまった。ソースを書くためのディスプレイだから、問題ないけど。

WindowsのXAMPPで遅いのを解決する方法をご存知の方がいらっしゃったら、ぜひ教えてください!


CakePHP1.2:cleanUpFieldsって無くなってたのか…。

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

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

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

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

Amazonで詳しく見る by G-Tools

Cake1.1のプログラムをCake1.2に移植中ってずっと言っていることなんだけど、
こいつは本当に時間がかかるかも…。
今日は$controller->cleanUpFields()がないというエラーメッセージが出てきて、なんでかな~と思ってネットで調べてもなかなか答えに行き当たらず、CakePHPポケットリファレンスで見て、無くなっていることに気付いた。Model::deconstructに変更になったらしいっすわ。そうですか。

まあね、Model側に持たせておけば、beforeValidateのときに自動的に合体させるようにしておけば、漏れがないしね~。コントローラから分離するにはそちらのほうがいいですわ。

修正箇所が多すぎて、心が折れそうになるときもあるけど、じっくりと取り組みます。
それにしても、CakePHPポケットリファレンス、情報は結構古くなってきたけど、まだ使えるなぁ。
このポケットリファレンスの最新版が出たら、即買いするんだけど。


CakePHP:schema.phpのindexesの更新でバグ

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

CakePHP1.2の話。

データベースのテーブル定義を更新しようと、schema.phpを編集してcakeコマンドでスキーマの更新をかけようとしたら、失敗した。

Can't DROP 'indexes'; check that column/key exists

indexesがDROPできないから更新できないよ~!ということらしい。
Googleで検索してみたところ、Google groupのcakephpのところに答えがあった。

http://groups.google.co.jp/group/tickets-cakephp/browse_thread/thread/84cbdf3093415923

ただ、cakeのコアを編集することになるので、
Cakeのバージョンがアップしたときに対応されてないと
またバグになってしまうので注意が必要かと思う。

// CORE/cake/libs/model/schema.phpの430行目
$tables[$table]['drop']['indexes'] = $diff['drop'];
$tables[$table]['add']['indexes'] = $diff['add'];
// を下記のように編集する

// $tables[$table]['drop']['indexes'] = $diff['drop'];
// $tables[$table]['add']['indexes'] = $diff['add'];
if(!empty($diff['drop'])) {
        $tables[$table]['drop']['indexes'] = $diff['drop'];
}
if(!empty($diff['add'])) {
        $tables[$table]['add']['indexes'] = $diff['add'];
}

この修正後、スキーマの更新を再度行ったら、indexesが正常に更新されました。
よかったよかった。


CakePHP: xdebugインストール

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

CakePHPのユニットテストを使ってみようと思って、
xdebugをインストールしたのでメモ。
インストール自体は、peclで簡単。

pecl install xdebug

ただ、上記の方法でインストールしたら、xdebug-2.0.4がインストールされた。
2.0.4だと、コードカバレッジの画面を表示したら真っ白になってしまった。

以下に、xdebug-2.0.3で動かなくて、xdebug-2.0.0にしたら動いたとあった。
http://taichino.com/?p=123

なので、xdebug-2.0.0をインストールしてみる。

pecl uninstall xdebug
pecl install xdebug-2.0.0

これで、ちゃんとコードカバレッジが動いてくれました。
よし、ユニットテストの勉強をしよう!!


Get Adobe Flash playerPlugin by wpburn.com wordpress themes