トップページphp
1001コメント321KB

【PHP】フレームワーク CakePHP 11ホール目【v1.3】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/02/16(水) 21:52:35ID:zCTGjUMq
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです
CakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう

※sage推奨
※質問時もsageること
※他フレームワークとの比較等はスレ違いです
テンプレは>>1-5くらい

■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
the Bakery
http://bakery.cakephp.org/
CakeQs
http://cakeqs.org/
CheatSheet (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
github - cakephp
http://github.com/cakephp

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
http://book.cakephp.org/ja
06806762011/04/25(月) 23:10:01.61ID:???
>>678
ありがとうございます。autoRedirect = falseがキモですね。
この方法でやってみます。
0681nobodyさん2011/04/26(火) 00:35:52.43ID:ITZhMk+T
会員登録画面で

登録画面→確認画面→完了画面

直接完了画面のURLを叩いた場合に
エラー画面に飛ばすみたいなのは
どのように実装するのがスタンダードでしょうか?
0682nobodyさん2011/04/26(火) 00:39:30.76ID:???
普通はセッションじゃないすか?
0683nobodyさん2011/04/26(火) 00:49:03.08ID:???
if (empty($this->data)) {
  $this->Session->setFlash('登録画面からやりなおしてください');
  $this->redirect('/xxxx/error');
}
}
06846812011/04/26(火) 01:17:51.28ID:???
すみません、完了画面でもバリデーションはやってるので
$this->dataの値はチェックしてました。

完了画面ではユニークなキーを発行してmemcachedにフォームの値を入れて
確認メールを送信するのですが、
完了画面でブラウザの更新ボタンを押すともう一度
ユニークなキーでmemcachedにフォームの値を入れて
確認メールを送信してしまうのです。

これどうしたらいいかなーと。
0685nobodyさん2011/04/26(火) 09:35:16.53ID:???
サイトで、
hogehoge.com/controller/action/

hogehoge.com/abc/controller/action/

を同じアクションにして、かつ
リンクはabcのprefixつきにしたいのですが、良い方法ありますでしょうか?

動きとしてはprefixルーティングで abc_indexを呼ぶのではなくindexを呼ぶようにしたいのです。

dispatchを書き換えていまはうまくいっていますが、スマートでないような気がして、、

0686nobodyさん2011/04/26(火) 09:49:38.99ID:???
>>684
俺はPOSTで画面毎に値を渡してチェックしてるよ。

登録
<input type="hidden" name="next" value="confirm" />
確認
<input type="hidden" name="next" value="complete" />

フォームヘルパーじゃなくて普通のHTMLで用意すれば
$this->dataの配列内で差別化できるし。
昔ながらのやり方だけど、これで良いんじゃないかな?
0687nobodyさん2011/04/26(火) 17:24:39.04ID:???
CakePHPで、コントローラにどのビューから飛んできたかを取得するには
$this->referer()しかないでしょうか?
0688nobodyさん2011/04/26(火) 18:29:04.76ID:???
コントローラにアクセスした時、セッションかクッキーで保存すれば?
0689nobodyさん2011/04/26(火) 23:17:20.63ID:???
>>685
URLが異なるならviewもcontrollerも別ファイルにして、
共通のphpを読むようにしたら?
0690nobodyさん2011/04/27(水) 00:01:18.98ID:???
2ch のスレッドとメッセージのような t hasMany m の関係で、
スレッドの一覧を取りたいんですけど、メッセージの投稿日時で
スレッドをソートしたいときは、どう書けば良いのでしょうか?
0691nobodyさん2011/04/27(水) 07:54:41.56ID:???
SQLのORDER BYに date型のcolumn DESC
でいいのでは?
06926902011/04/27(水) 19:33:54.84ID:???
>>691
レスありがとうございます。
説明不足で申し訳ありません。
$this->paginate での条件指定方法が分からないのです。
06936902011/04/27(水) 19:36:38.21ID:???
こんな感じでやってみたのですが、SQL をデバッグで見ると
FROM に message が指定されておらず・・・。

$this->paginate = array(
'contain' => array(
'Message' => array(
'fields' => array('id', 'created')
)
),
06946902011/04/27(水) 19:39:00.83ID:???
'conditions' => array(
'Thread.delete_flag <>' => 1
),
'limit' => 10,
'order' => array(
'Message.created' => 'desc' // ダメなとこ
)
);
0695nobodyさん2011/04/27(水) 22:56:05.83ID:???
test
0696nobodyさん2011/04/27(水) 22:59:12.39ID:???
>>690
$usesにMessageを追加して
$this->paginate = array('Message', array(...
とするとか
0697nobodyさん2011/04/28(木) 10:44:52.76ID:???
その場合は、Messageモデルのhasmanyの定義にorderを書く。

それが嫌な場合はページネートにjoin句を書く。

$this->paginate = array(
Thread=> array(
'conditions' => array(),
'limit' => 24,
'order' => array(),
'joins' => array(
    array(
                        'type' => 'LEFT',
                         'alias' => 'Message
                         'table' => ''messages',
'Message.created' => 'desc'
)

))
);
06986902011/04/28(木) 21:41:37.52ID:???
>>696
すみません。私が理解出来ず、うまく行きませんでした。
SQL 文を見ると "SELECT Thread.Array, ..." と訳の分からん状態に。
でも、ご助言ありがとうございました。
06996902011/04/28(木) 21:50:08.53ID:???
>>697
Thread の一覧では created DESC ですが、Thread の内容、
つまり Message の一覧では、created ASC にしたいので、
hasMany の定義に書くことに抵抗感がありました。
(あまり CakePHP のこと分かっていないのですが・・・)
07006902011/04/28(木) 21:52:25.68ID:???
冷静に SQL でやりたい事を書いていたら、DISTINCT か
GROUP BY を使うことなると今更ながら気づきました。

ただ(MySQL の仕様なのか)意図した形でソートできず、
結局 Thread の modified フィールドを Message の
挿入時に update するのが手っ取り早いのかな・・・と
諦めの段階に入っています。

レス下さった皆様、ありがとうございました。
また、何かあれば宜しくお願いします。
0701底辺2011/04/29(金) 00:48:18.72ID:???
>>700
こちらこそ、よろしくね。
0702nobodyさん2011/04/29(金) 12:03:24.33ID:???
CakePHP で共通の関数ってどこに置くのがセオリーですか?
コンポーネント、ビヘイビア、ヘルパー全部で共通で使いたいってときがあるんですけど、そういう場合どうしてますか?
0703nobodyさん2011/04/29(金) 12:12:37.08ID:???
うちはvendors/
vendors/common_function.php
0704底辺2011/04/29(金) 14:15:06.85ID:???
俺はbasic.php
0705nobodyさん2011/04/29(金) 15:04:24.70ID:???
俺は
/cake
└/common ←ここに入れてる
0706nobodyさん2011/04/29(金) 15:23:45.09ID:???
俺は/ore/←ここに入れてる
0707nobodyさん2011/04/29(金) 17:07:06.27ID:???
Cakeに合わせて/Strawberry
0708nobodyさん2011/04/29(金) 22:41:36.85ID:???
>>706
>>707
おもしろいのでコテつけてください
0709nobodyさん2011/04/29(金) 23:16:13.52ID:???
普通はapp/libsでしょ
07107072011/04/29(金) 23:54:09.93ID:???
>>708
もちろん冗談ですよ。
0711nobodyさん2011/04/30(土) 16:06:00.19ID:???
>>707
俺も頼む。
おもしろすぎるのでコテつけてください。
0712nobodyさん2011/04/30(土) 18:46:27.76ID:???
コテは重要だよね
NGにしにくいし
0713nobodyさん2011/04/30(土) 22:44:34.97ID:???
かけPHP
0714nobodyさん2011/05/02(月) 00:32:14.07ID:???
XP+XAMPPだと何故かレスポンスが悪かったcakephpだけど
Windows7に換えたらその現象がなくなった・・・気がする
0715nobodyさん2011/05/02(月) 00:50:25.96ID:???
>>714
マジ!?俺も悩んでるんだけど、7だとそんな違うのかよ・・・
0716nobodyさん2011/05/02(月) 06:49:05.23ID:???
メモリ増やしたか?
0717nobodyさん2011/05/02(月) 12:00:40.62ID:???
日付を扱ってるテーブルがあり、各曜日で一気に値を入れるにはどうしたらいいでしょうか?
今月の月曜日に全部1を挿入といったようなことをしたいです。
0718 忍法帖【Lv=9,xxxP】 2011/05/02(月) 16:38:23.84ID:???
>>717
それってSQLの話だけど、例えばDATE_FORMAT()をつかって条件指定できる。
Cake的にはupdateAll()をつかうだけ。
0719nobodyさん2011/05/02(月) 21:40:11.28ID:???
最近、ソーシャルアプリをCakePHPで作ってますという案件が増えたね。
CakePHPは大量アクセス前提のアプリも問題なく開発できるってことですね。

分かります。
0720nobodyさん2011/05/02(月) 23:48:36.39ID:???
>>719
俺が思うに、それは管理画面だけの話で、
アプリ側やアクセスが頻繁に発生する部分では、
限りなくピュアPHPで自作してると思うよ。
0721nobodyさん2011/05/03(火) 01:54:20.44ID:???
うちはアプリ側もCakeで作ったよ
0722nobodyさん2011/05/03(火) 13:16:24.74ID:???
Cakeに慣れると、簡単なPHPのプログラム作ろうとしても
いつの間にかCake風のプログラミングしてることあるよな
0723nobodyさん2011/05/03(火) 13:54:27.72ID:???
Cake風のプログラミングってどういうのだ?
0724nobodyさん2011/05/03(火) 14:06:56.07ID:???
RoR風MVCと言いたいのかな?

PHPあんまり知らないJavaはよく知ってる人が、ぱっと見で
「あ、これ分かりやすいね」と言ってた。
0725nobodyさん2011/05/05(木) 03:39:50.22ID:???
MeioUpload Behaviorを使っているんだが
確認画面で画像を確認した後、saveってできるのかな?
やっぱりそこは自作しないといけないのかな
0726nobodyさん2011/05/05(木) 10:09:53.55ID:???
2.0はいつ正式版でんのかな
Symphonyに先行されたくはないよな
0727nobodyさん2011/05/05(木) 13:07:28.09ID:???
>>726
それはあなたが参加チームに入ればいい。
あなたも参加チームに加わって、2.0のバージョンの開発スピードを速くしましょう、ボケ。
0728nobodyさん2011/05/06(金) 00:21:29.94ID:???
ちょっと気づいたんだけど、
app_controller.phpに「var $autoLayout = false」を指定してないと、
エラーページにもレイアウトが使用されるんだな。

会員専用ページとか、レイアウトに「default.ctp」を使用してたら
これが読み込まれるから大変な事になる
0729nobodyさん2011/05/06(金) 20:26:56.51ID:aIuVNDEL
コントローラに変数を書くのは
$this->set('foo', 'bar');
ってやってビューで$fooでbarが出るようにできたんですけど、
このfooを配列にしたいんですけどどう入力したらいいんでしょうか
$this->set('foo', 'bar');
$this->set('foo', 'bar2');
とやったらただ$fooが上書きされただけで配列にはなりませんでした
0730nobodyさん2011/05/06(金) 20:30:43.07ID:???
$this->set('foo', array('bar', 'bar2'));
0731nobodyさん2011/05/06(金) 20:37:08.21ID:???
>>730
あ・・・
なるほどありがとうございます
助かりました
0732nobodyさん2011/05/08(日) 16:57:22.50ID:???
http://bakery.cakephp.org/jpn/articles/category/helpers
>PEARのののの
なんで、尻取りRock'n Rollみたいなタイトルになっとるんかね?
0733nobodyさん2011/05/10(火) 22:38:37.80ID:???
7PHPフレームワーク中ぶっちぎり最下位のCakePHPは終わコン
http://www.devshed.com/c/a/PHP/7-PHP-Frameworks-Tested-For-Speed/
0734nobodyさん2011/05/11(水) 17:51:03.34ID:???
ヒマだったんでローカル鯖にエロ動画データベースみたいなのを作ってみた。
今まで使った事無かった機能とかいろいろ使ってみて勉強になるわ。
やっぱ実益を兼ねると捗るな。
0735nobodyさん2011/05/11(水) 18:08:06.21ID:???
エロサイトは技術レベル高そうだね。
みんなのDMM様とかね。
0736nobodyさん2011/05/11(水) 18:13:22.71ID:???
>>734
どんな感じ?
ぜひ公開してよ。
0737nobodyさん2011/05/12(木) 00:21:57.52ID:RDtqq4sq
CakeでModelのfind・save・delete等のDBアクセスメソッドで
エラーハンドリングするのって

$res = $this->Model->save();
if ($res === false) {
  // エラー処理
}

って感じでいいですかね?
0738nobodyさん2011/05/12(木) 01:54:00.04ID:???
if(!$this->Model->save()){
// エラー処理
}

これじゃ駄目なのか?
0739 忍法帖【Lv=14,xxxPT】 2011/05/12(木) 04:21:23.48ID:???
save()ならいいけどfind()だと空arrayをどう扱うかにもよる。
delete()は場合によっちゃgetAffectedRows()がいる。
0740nobodyさん2011/05/12(木) 08:57:26.67ID:i1t11ChC
Cakeを何年か使ってきて、結局分かってないというか、初歩的なところを
何となくスルーしてきたんだけど、
例えば、
・コントローラ内からモデルの関連モデルをとり回す
・モデルから関連モデルをとり回す
時に、$this->Post->User とか、モデル内なら $this->User とかやるけど、
これって何が嬉しいの?
関連モデルも取ってくるだけなら、$recursiveとかunbindModel, bindModel やContainableビヘイビアとか
あるわけだし、直接関連しないモデルとの突き合わせや何かに使うならClassRegistry::init('Model')でいいわけじゃないすか

$this->Post->Comment とか、 $this->Post->User とか使って美味しい場面ってどこなんですか?

初心者のつもりじゃなかったけど、この部分だけ何年もスルーしてました。
0741nobodyさん2011/05/12(木) 14:23:52.63ID:???
ClassRegistryが登場するまでは、関連モデルをたどる事が基本だったんじゃないかな。
設計として関連モデルまでのアクセスを基本とすることを良しとすることもあるのかも。
他にもシュガーシンタックスとか色々推測はできるけど、コアチームに聞いたほうが早い
かもしらんね。

こういう話題はフォーラムとかに振ったほうがいいんじゃないかなぁ。
0742nobodyさん2011/05/13(金) 00:53:55.24ID:bOFdFGkg
CakePHPのバリデーションで
ある項目で半角英数のみを許可するというチェックで
入力がされなかった場合はスルーさせたいのですが、
以下のような感じでいいでしょうか?

var $validate = array(
  'id' => array(
    'alphaNumeric' => array(
      'rule' => 'alphaNumeric',
      'message' => '半角英数で入力して下さい'
    )
  ),
  'pass' => array(
    ・・・
  )
);
0743nobodyさん2011/05/13(金) 02:15:59.81ID:???
>>742
empty = true
0744nobodyさん2011/05/13(金) 11:43:27.73ID:???
>>742
'allowEmpty'=>true,
0745nobodyさん2011/05/13(金) 20:45:10.04ID:???
Authでログインし、print_r($_SESSION)を見ると
配列のConfigに”[timeout]=>10”とあります。
これってタイムアウトの秒数じゃないですよね?

あと、セッションタイムアウトになったら自動的にログインフォームに戻りますが、
またログインするとそれまで、↑になる前のページが表示されます。
これって単にリファラをチェックしているだけなのでしょうか?
0746nobodyさん2011/05/15(日) 03:29:24.39ID:???
CakePHP使ってみたけど駄目だわー。
あぁRoR系ってこの程度の物だったのねって感じ。
全然ダメダメで安心した。
俺の作ったフレームワークの方が万倍良いわw
0747nobodyさん2011/05/15(日) 09:56:30.32ID:???
比較対照も示さずに
0748nobodyさん2011/05/15(日) 11:33:35.65ID:???
CodeIgniter移行余裕
0749nobodyさん2011/05/15(日) 11:44:06.73ID:???
使いこなせるものを使えばいい
0750nobodyさん2011/05/15(日) 13:24:31.86ID:???
CodeIgniterからまたもどってきちゃった
0751nobodyさん2011/05/15(日) 22:23:01.76ID:???
Cakeの仕様に合わせたオレオレフレームワーク作ってるけど
746もそういうことかな?
0752nobodyさん2011/05/16(月) 01:58:31.58ID:???
自分の用途に過不足なく機能があり
自分で隅から隅までわかっているライブラリのほうが良いと感じる
当たり前といえば当たり前の話です
0753nobodyさん2011/05/16(月) 02:09:10.52ID:???
Cake(RoR)から学ぶことなんか何も無かったね。
あえて言えばアンチパターンを学んだね。
ActiveRecordなんか最悪だぜ。
0754nobodyさん2011/05/16(月) 03:59:25.37ID:???
じゃ、普段どういう書き方してるの?
0755nobodyさん2011/05/16(月) 13:05:48.45ID:Buwzzl2B
>>751
Cake真似てDispacherとかなんやらかんやら複雑に創り上げた黒歴史の俺俺フレームワーク思い出すからやめろ・・・
0756nobodyさん2011/05/16(月) 13:23:10.09ID:???
みんなやるんだよ
0757nobodyさん2011/05/16(月) 16:44:54.09ID:???
$this->dataで指定配列があるか無いか調べないとエラーになるから
ifやissetばかりのコードになるんだが、みんなはどうしてる?

if (isset($this->data['User']['name'])) {
 if ($this->data['User']['name'] <> "") {
  echo $this->data['User']['name'] . 'さん';
 }
}

みたいな。画像があるか無いかのチェックならもっと複雑になる。
俺の書き方が悪いかもしれないけど、良い書き方はないかな?
ちなみにめんどくさい時は@を付けてる。
0758nobodyさん2011/05/16(月) 18:26:56.20ID:???
(isset($this->data['User']['name']) ?: '')
PHP5.3以上限定だったっけな
0759nobodyさん2011/05/16(月) 18:47:35.88ID:???
ごめん、上のじゃダメだわw
0760nobodyさん2011/05/16(月) 19:26:31.02ID:???
>>757
何もしない。そのままエラーで例外発生させて、例外処理に飛ばしてる。
0761nobodyさん2011/05/16(月) 19:36:18.98ID:???
>>760
入力されてるか否かの、この程度の動作でも例外処理に飛ばすの?
確認画面を出力する時とか困らないか?
0762nobodyさん2011/05/16(月) 19:48:08.88ID:???
>>761
普通にCakeのコードを書けば、データの入力有無に関わらず
配列の要素だけは最低限存在するんじゃない?
もしも場合によって要素が無いというケースを作ったのであれば、
そこは例外にならないようチェックを入れれば良いし。
0763nobodyさん2011/05/16(月) 20:39:43.96ID:???
CakePHPのビヘイビアの仕様にいつも引っかかる($this->ビヘイビア名->関数と書いてしまう)
第一引数の&$modelにもよく引っかかるし
なんでこんな実装になってんのよ
0764nobodyさん2011/05/16(月) 23:05:12.61ID:???
それは単に悪い癖がついてるだけだろ
まさかいつも直接ビヘイビアのメソッド呼び出してるわけじゃないよな?
0765nobodyさん2011/05/17(火) 01:45:48.69ID:p7ZABAr6
cakeでDBのUPDATEをする場合でIDの値を持っていない場合は
Model::save()使えないんだけどその場合どうしたらいいですか?

1)他のメソッドを使う
2)Model::find()等でIDを取得した後Model::save()を使う
0766nobodyさん2011/05/17(火) 02:09:58.52ID:???
普通、IDを持って更新するんじゃないか?Cakeに限らないが。
0767nobodyさん2011/05/17(火) 02:25:59.11ID:???
>>757
trueであることと、空文字列でないことをチェックするなら
isset()じゃなくて、!empty()を使えば一行で済む

<?php
$str = '';
var_dump (isset($str)); // true
var_dump (!empty($str)); // false
0768nobodyさん2011/05/17(火) 08:21:09.15ID:???
一応updateAll()で素のUPDATEステートメントに近い形で更新はできる
基本はIDを元に更新するけど、フラグや日時一括更新の場合など、場合にも拠る。
07697652011/05/17(火) 08:31:56.73ID:???
>>768
つまり2)ってことですかね。
基本UPDATEはIDを元にするけどModel::updateAll()を使えば
ID以外でもUPDATEできるということですね。
ありがとうございます!
0770nobodyさん2011/05/17(火) 09:32:19.43ID:???
>>739
findって空の場合falseが返ってくるんじゃなかったっけ?
0771 忍法帖【Lv=18,xxxPT】 2011/05/17(火) 11:42:32.89ID:???
>>739
firstとかIDベースのじゃなくてallとかlistだとarray()が返るとおもた。
0772nobodyさん2011/05/17(火) 12:30:13.80ID:???
>>767
指定配列があるかどうかって書いてるから、isset使ってるんだろ?
お前さんのは$strを最初に書いてるじゃん。
0773nobodyさん2011/05/17(火) 12:47:52.65ID:???
>>772
isset と empty の挙動の違いは頻出ネタだと思うが。
つまり、こう書けるってこと。

if (!empty($this->data['User']['name'])) {
  echo $this->data['User']['name'] . 'さん';
}
0774nobodyさん2011/05/17(火) 13:19:33.25ID:???
POSTでUser.nameが送られてこなかったら?
0775nobodyさん2011/05/17(火) 13:21:09.79ID:???
あと、0を入れたらどうするの?ってのもあるな。
名前に0を入れる奴がいないとも限らないぞw
0776nobodyさん2011/05/17(火) 13:57:44.20ID:YbRN4g9b
めんどくせーからemptyで判断してるわ
でも判断してるのは$this->dataだけだし、emptyでもよさそうだな
0777nobodyさん2011/05/17(火) 14:19:22.66ID:???
関数作るのはどうなの?

if (checkData($this->data)) {
 echo $this->data['User']['name'] . 'さん';
}

みたいな。
0778nobodyさん2011/05/17(火) 14:20:22.87ID:???
いや、Cakeだからヘルパーにするべきだな・・・
0779nobodyさん2011/05/17(火) 14:29:36.21ID:???
validateしろよ
0780nobodyさん2011/05/17(火) 17:24:54.66ID:ceh4vxWU
empty(0)ってなんでtrueにしたんだろ
empty('0')はfalseなのに

たまわらんわ
■ このスレッドは過去ログ倉庫に格納されています