【PHP】フレームワーク CakePHP 17ホール目【v2.4】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2014/03/01(土) 17:03:24.57ID:8AJ9GD6ECakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう
※他フレームワークとの比較等はスレ違いです
■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
github - cakephp
http://github.com/cakephp
the Bakery
http://bakery.cakephp.org/
Issue
http://cakephp.lighthouseapp.com/dashboard
CheatSheet[1.2] (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
[2.x] http://book.cakephp.org/2.0/ja/index.html
[1.3] http://book.cakephp.org/ja
※前スレ
http://kohada.2ch.net/test/read.cgi/php/1378659370/
0337nobodyさん
2014/04/29(火) 11:19:04.21ID:???0338336
2014/04/29(火) 11:26:35.82ID:???0340nobodyさん
2014/04/29(火) 11:35:24.45ID:uHAmZpKNSecurityComponent のフォーム改竄防止機能に穴があった。
作りにもよるけど hidden で受け取る id とかを改竄されると、任意のレコードを更新可能。
Model::save() を呼ぶ時に第一引数の $data に更新したいデータだけを渡すか
第三引数の $fieldList を明示的に指定するかしてれば平気。
>>338
別のアクションでも平気。
FormHelper が作る action をセキュリティトークンに入れてるから。
ただ、JavaScript で動的に action を変更している場合はブラックホールに飲まれるかと。
0341nobodyさん
2014/04/29(火) 11:38:39.55ID:uHAmZpKNどういたしまして
0342nobodyさん
2014/04/29(火) 11:44:15.83ID:???俺が触ってたのは1.3の頃だけど使いたくないと思った
0343nobodyさん
2014/04/29(火) 11:46:59.01ID:???0345nobodyさん
2014/04/29(火) 16:06:25.97ID:???Cake純正のもの使った方が楽なんかな
0346nobodyさん
2014/04/29(火) 17:12:05.84ID:???0347nobodyさん
2014/04/29(火) 19:09:18.76ID:???それでメジャーなのかなぁと思って、手を出した
結構色々これで作っちゃったから、以後ずるずる
0348nobodyさん
2014/04/29(火) 20:08:51.90ID:???0349nobodyさん
2014/04/29(火) 22:33:23.36ID:???0350nobodyさん
2014/04/30(水) 08:44:08.14ID:???環境によっては増えたと思い、環境によっては減ったと思う
0351nobodyさん
2014/04/30(水) 13:45:58.87ID:???0352nobodyさん
2014/04/30(水) 15:08:14.56ID:???0353nobodyさん
2014/05/01(木) 00:53:29.70ID:???0354nobodyさん
2014/05/01(木) 02:19:18.51ID:???文言考えるの面倒くさいんだろうな
0355nobodyさん
2014/05/02(金) 00:08:32.26ID:???これ本当?diffをちょっとみただけだけど、post先のURLを改竄されても通ってたのが、通らなくなってよりセキュアだねってだけで、hiddenの改ざん検知とか関係なくない?
0356nobodyさん
2014/05/02(金) 00:25:59.26ID:???0357340
2014/05/02(金) 00:35:18.90ID:???本当だよ。
俺が Mark Story 氏に実際の攻撃手順を書いて送ったのが26日。
アップデートが 2.5.0-RC2 に脆弱性のアナウンスなしで反映されたのが27日。
1.3.18 と 2.4.8 にアナウンスありで反映されたのが29日。
かなり深刻な脆弱性だったからこういう日程になったんだけど、
結果的にはミスがあって 2.4.9 が出ることになった。
必ず攻撃が成功するかはサイトの作り次第だけれど、
仕事で使ってるならアップデートした方がいいよ。
0358nobodyさん
2014/05/02(金) 00:43:14.81ID:???今回の問題は、field改ざん検知のハッシュ値が、別のurlでも使えてしまう問題。
例えばForm->textでfield1,filed2を生成しPOSTされた値を保存するaction1、
Form->textでfield1のみ生成しPOSTされた値を保存するaction2があるとする。
action2でform改ざんを行って手動でfield2を追加しPOSTする場合を考える。
一緒にPOSTされるhash値の不一致でエラーとなるのが本来の仕様。
ただし以前のバージョンだと、form改ざんと併せてhash値をaction1のものを引用すると、
エラーにならずにfiled2を上書きできてしまう。
今回の修正で他のアクションのhash値を引用することができなくなり、本来の仕様を
回避する穴がふさがった。
ちなみにhiddenの改ざんの話は、どういう意図で言ったのか俺もよく関連はわからん。
0359nobodyさん
2014/05/02(金) 00:55:27.39ID:???0361nobodyさん
2014/05/02(金) 15:48:57.61ID:???階層が増えるとビューに余計なコードを書く機会が増える
だからコントローラと独自ヘルパーで何とかしているけど、
手間がかかって仕方がない。
0362nobodyさん
2014/05/02(金) 18:24:19.36ID:???ビューで表示するときはヘルパーか何か作らないといけないのでしょうか?
以下のようにしたいのですが、generateTreeListでは無理です。
・My Categories
・Fun
・Sport
・Surfing
0363nobodyさん
2014/05/02(金) 19:10:49.13ID:???Treeビヘイビアは不要
Model::find('threaded');
か、
Model::find('all');
したでーたを Hash::nest() で入れ子にする。
0364nobodyさん
2014/05/02(金) 20:12:03.57ID:???すみません、そういう事ではなくて、ビューでの表示です。
ビューで>>362みたいなリスト化して出力するには、
独自のヘルパーを作らなければいけないのか?
他に方法があれば教えてくださいっと言った質問になります。
0365nobodyさん
2014/05/02(金) 20:40:21.50ID:???なんでかって言うと、再帰処理したら簡単に表現できるからなぁ。
で、再帰処理するためには入れ子構造に組み直す必要があって、
そのためには >>363 に書いた通りって意味なんだが?
0366nobodyさん
2014/05/02(金) 20:42:16.77ID:???よく考えてみ。
0367nobodyさん
2014/05/02(金) 21:05:59.69ID:???0368367
2014/05/02(金) 21:46:37.32ID:???HtmlHelper::nestedList() に渡すには TreeBehavior だと自力で整形しないと駄目なんだね。
CakeDC の Utils プラグインにある TreeHelper::generate() なら >>362 の要求を満たせる。
0369nobodyさん
2014/05/02(金) 21:48:33.85ID:???HtmlHelper::nestedList() に渡すには
単純な入れ子構造にしておかないとだめ。
Model::find('threaded'); で取得したのはそのまま使えないと思う。
いったん Model::find('all'); で取得したデータを
Hash::extract() で階層を浅くして、それを
Hash::nest(); を使って組み直すなどの手間を掛けないと使えないんじゃないかな。
0370nobodyさん
2014/05/02(金) 21:49:26.87ID:???TreeHelper なんてあるの知らなかった。
一度見てみるわ。
0371nobodyさん
2014/05/02(金) 22:02:34.68ID:???実は俺もわりと最近知った。
0373nobodyさん
2014/05/08(木) 16:22:29.68ID:???サンプルコード漁ったらさらっと書いてあるけど動かない…
0375373
2014/05/08(木) 17:40:55.81ID:???他のバリデーションと同様にPOST前にポップアップで教えてくれるかと思ってた。
0376nobodyさん
2014/05/08(木) 21:14:06.37ID:???0377373
2014/05/08(木) 22:24:36.95ID:???http://cdn-ak.f.st-hatena.com/images/fotolife/c/cakephper/20130211/20130211223324.png
もしかして俺何か勘違いしてるかな…
0378nobodyさん
2014/05/08(木) 22:33:24.56ID:???0379nobodyさん
2014/05/09(金) 00:28:49.07ID:???0381nobodyさん
2014/05/09(金) 04:21:32.04ID:???CakePHPもFormHelperがそのための属性を出すようになったりはしてるけど。
0382nobodyさん
2014/05/09(金) 10:16:45.79ID:???悲惨なサイトが続出するような悪寒。
楽だし負荷軽減できるしで、いいことずくめなんだけど。
0383nobodyさん
2014/05/09(金) 10:59:15.63ID:???0384nobodyさん
2014/05/09(金) 11:01:33.24ID:???Modelに移動するいい傾向になるだけでないかな?
0385nobodyさん
2014/05/09(金) 13:43:36.22ID:???0386nobodyさん
2014/05/09(金) 13:51:32.25ID:???0387nobodyさん
2014/05/09(金) 14:56:57.61ID:???ちゃんと機能するようにつくれば、無通信でユーザーに間違い見せれて、
使いやすくいフォームにはなると思うけど。
0388nobodyさん
2014/05/09(金) 15:49:02.85ID:???正常系の負荷はもちろん変わらんけど。
0389nobodyさん
2014/05/09(金) 18:26:07.60ID:???モデルの使い道がよくわかんないっす。
何から何までコントローラーで処理しちゃってモデルはスッカラカンです。
どなたかモデルの使い道というか便利さを三行で説明しなさい。
0391nobodyさん
2014/05/09(金) 18:46:15.86ID:???俺も初心者だからよく分かってないが、
コントローラはモデルに作ったメソッドを呼ぶだけで、
ざっくりした条件分岐のみにとどめておくと後から非常に見やすい気がする。
0392nobodyさん
2014/05/09(金) 20:58:13.09ID:???バランスというかセンスが問われる部分
0393nobodyさん
2014/05/09(金) 21:01:03.07ID:???単に好みの問題だから好きにすればいいんじゃないかな
モデルはどこからでも使える上にシングルトンっぽくインスタンスが1つだけなので
共通っぽいメソッドやクラスを実装するのにも使える
0394nobodyさん
2014/05/09(金) 21:32:58.38ID:???ロジック処理だけのモデルがあっても良いよな
0395nobodyさん
2014/05/10(土) 01:47:38.21ID:???これは常にRORと、その派生のCakePHPに対する批判として挙げられてるね。
本来のModelとは全然違うって、激怒しているブログがあちこちにある。
なお、CakePHP3では大幅に改善されるみたいです。
0396nobodyさん
2014/05/10(土) 07:20:47.11ID:???ああ、まぁそりゃそうか。
といっても、負荷対策が必要な状況では、効果的な対策になるほどは減らないとは思うけど。
0397nobodyさん
2014/05/10(土) 10:46:10.10ID:???0398nobodyさん
2014/05/10(土) 10:53:41.99ID:???1,3は同意できるところだが
2は会社のエンジニアレベルが低いとでも言いたいのか
0399nobodyさん
2014/05/10(土) 11:01:56.24ID:???ActiveRecordの超絶劣化っぷりにびびった
Railsも似非MVC2になりがちだけどCakeはそれ以前に
オブジェクト指向設計に真っ向から喧嘩売ってるレベル
0400nobodyさん
2014/05/10(土) 12:53:17.49ID:???実際どのくらいのスキルある奴なんだろう
0401nobodyさん
2014/05/10(土) 14:23:07.62ID:???git submoduleしないとパッケージのバージョンを管理できないなんて、
なに言ってるかわからないレベルなんだが。
そんなことあるんかね?
0402nobodyさん
2014/05/10(土) 15:56:06.47ID:???ものがちゃんと作れれば別にいいわけで、正しいからどうだってのがよくわからん
0403nobodyさん
2014/05/10(土) 17:17:38.04ID:???DBから取ってきたデータがarrayになってる部分だと思われ
Cake3でようやくオブジェクトになるようだが
0404nobodyさん
2014/05/10(土) 17:24:14.35ID:???書き方が変わるだけのような気がするけど
0405nobodyさん
2014/05/10(土) 17:30:12.91ID:???特にViewがスッキリするのはもちろんだけど今までHelperやControllerに溢れがちだったロジックもEntityクラスに置けるのが結構あるしテストも楽
array+Hash・Setに比べたら開発効率やコードの読みやすさは段違いに上がる
でも2から3への移行は大変そう
0406nobodyさん
2014/05/10(土) 17:30:20.29ID:???Modelのメソッドはすべてstaticです、なんて言ったらJavaやRubyなどのオブジェクト指向に
慣れ親しんだ人たちから見れば、なにそのふざけた設計は?とキレられるレベル
0407nobodyさん
2014/05/10(土) 17:37:51.74ID:???0408nobodyさん
2014/05/10(土) 20:22:57.11ID:???さすがにPHP4でオブジェクト指向にはできなかった、と
0409nobodyさん
2014/05/10(土) 23:47:42.75ID:???修飾子やら例外やらオートローダーが無いとか
参照渡ししないとクローンになるとかいろいろあるが
ActiveRecordの足かせになりそうな制約はないな
0410nobodyさん
2014/05/11(日) 13:33:38.34ID:???0411nobodyさん
2014/05/11(日) 13:37:57.50ID:???見極めができないんかもな。
0412nobodyさん
2014/05/11(日) 15:03:25.90ID:???0413nobodyさん
2014/05/11(日) 15:07:39.63ID:???0414nobodyさん
2014/05/11(日) 15:08:05.37ID:???function hoge を _hogeにする時はあるけど。
どなたかご親切な人
わかりやすく教えてくれませんか?
0417nobodyさん
2014/05/11(日) 15:40:10.91ID:???調べたverは2.4.6
cake3ではstaticになっているってこと?言葉の使い方がヘンなだけ?
0418nobodyさん
2014/05/11(日) 18:47:27.75ID:???> つまり結局はタイミングの問題でしかなくて、言語の優劣がどうとか、フレームワークの優劣がどうとか、といった観点は殆ど無く選びました。
つまり結局は、他に行ったから、とりあえず元鞘を叩いておくかっていう3流エンジニアの日常か
0420nobodyさん
2014/05/12(月) 01:30:03.56ID:???static のメリットをひとことで言うと、状態を持たない(状態が変化しない)
振る舞いを提供することにより、インスタンス化した場合に本来であれば考慮するべき
状態変化の副作用から開放されることではないかと。
まず間違いなく、テストは超簡単になる。
一方、アクセス修飾子のメリットはひとことで言うと
安全な設計が簡単にできるってことではないかと。
その点 CakePHP はメンバー変数の修飾子に public を使いまくってて恐ろしいほどではある。
0421nobodyさん
2014/05/12(月) 01:35:05.49ID:???特にphpはランタイムが短すぎて、1回しか使わないオブジェクトが多く、
staticを変に意識すると、むしろなんでもstaticでいいんじゃないかと思えてきてしまってこわい。
逆にstaticにしないと困るような事も、あんまないから、よくわからないままで結局staticは使わないという
>>414
たとえばモデルに、とある機能を作ってたら100行を超える長いメソッドになってしまい、一部を切り出したけど、
コントローラーから直接切り出したメソッドを呼ばれるのは想定外って場合に、
protectedかprivateにしておけば、呼ばれることがない。
protectedとprivateは、コントローラーやモデルを触ってるくらいなら、
正直使い分けが活きることがほとんどない気がする。
強いて例を出すと、AppController内の処理で切り出したメソッドが、ほかのコントローラーから呼ばれるのが想定外なら、
privateにしておくと呼ばれなくなる。
0422nobodyさん
2014/05/12(月) 01:45:18.99ID:???>なんでもstaticでいいんじゃないかと
だけどオブジェクトの状態に依存しないメソッドなんて
そうそう作る機会はないと思うんだが、
もし可能なら作って問題無いと思うんだけど?
というか、むしろ作るべき。
0423nobodyさん
2014/05/12(月) 02:01:04.78ID:???もちろん、思えてきてしまうだけで、よく考えるとダメな事がほとんどなんだけどね。
クラスやメソッドを書き始めるときに、まずこれはstaticにできるか?
と考えると、問題ないような気がしてしまうんよ。
そういえば、かなり昔だけどCakePHPを使い始める前のオレオレフレームワークでは、
データベースアクセスするとこ全部staticメソッドにしちゃってたなぁ。
いわゆるCRUDに対応したメソッドがあるだけだったし、データはオブジェクトじゃなくて連想配列だったから、
インスタンスいらないなぁと思って。
あとバリデーターもstaticメソッドだったなぁ。
バリデーションはコントローラーでやってたから、CakePHPでいうバリデーションルールの配列みたいなのは、
コントローラーに書いて、AppController的な親にvalidateメソッドを作ってた。
0424nobodyさん
2014/05/12(月) 02:19:15.31ID:???0425nobodyさん
2014/05/12(月) 04:23:13.01ID:???0426nobodyさん
2014/05/12(月) 10:30:47.47ID:???言いたいことは何となく分かる
他のフレームワークだとModelのstaticメソッドがテーブル(Repository)の操作
インスタンスメソッドがレコード(Entity)ごとの操作に対応してるのが多い
CakePHP2まではEntityがないので
そういう他のFWから入ってModelのインスタンスはEntityだろと決めつけてかかると
ModelにRepositoryの要素しかなくてfindもインスタンスメソッドという点に違和感をおぼえる
CakePHP3だとEntityクラスとTableクラスがそれぞれ用意されるからギャップが減る
クラスが分かれるからfindがインスタンスメソッドなのは変わらないけど
DDDを意識した設計で個人的には好感触
というか他のFWのstaticなfindも
RepositoryないしQueryに相当するオブジェクトのインスタンスメソッドに処理放り投げてるだけだろうし
ただ単に使い勝手とどこまでFWが暗黙的に処理するかってだけの問題な気がする
0427nobodyさん
2014/05/12(月) 10:33:48.09ID:???状態依存しないメソッドなら問題ないけど
CakePHP の Model のオブジェクトって状態を持ってるから無理だよ。
たとえば同じPostクラスのオブジェクトが2個あったとして
$Post1->id = 1;
$Post2->id = 2;
ってした場合にメソッドが static なら破綻する。
0430nobodyさん
2014/05/12(月) 11:14:24.54ID:???0431427
2014/05/12(月) 11:59:05.87ID:???例えを簡単にするつもりだったが $id は関係無かったか。
要するに find が参照するプロパティのうち
状態依存のものが沢山あるってこと。
例えば
$Post1->primaryKey = sid;
$Post2->primaryKey = cid;
とか
0432nobodyさん
2014/05/12(月) 12:02:34.37ID:U9jrOtarmoveUpやmoveDownがfalseを返してきてまったく動作しません。
発行したSQLを見ると、SELECT文ばっかりでUPDATEをやっていないように見えます。
どうやったら動かすことができるのでしょうか。
0434nobodyさん
2014/05/12(月) 12:38:18.89ID:???0435nobodyさん
2014/05/12(月) 13:15:30.27ID:???DBやレコードはお客のやつなんでまずいんです。ごめんなさい。
スキーマにはちゃんと
parent_id, lft, righ の定義はしてあって、moveUp, moveDown以外のツリー動作は
問題なく動作しています。
public function moveup($id = null) {
$this->Category->id = $id;
$res = $this->Category->moveUp($this->Category->id, abs(1)) ;
debug($res);
}
0436nobodyさん
2014/05/12(月) 13:24:21.16ID:???CakePHPのモデルが状態を持ってることが、むしろ混乱の元になってる気がするけどな。
ループ内でsaveするならcreateしろ、とか。
結局find()したら連想配列を返すし、save()だってモデルにデータ持たせたりせずsave()に引数渡すことばかりじゃない?
よく使うfindとsaveで違和感を感じるだけで、インスタンスである必要な機能もあるけど。
まぁ言いたい事はたぶん >>426 と似たようなことなんだろうけど、
ほかのフレームワークをあまり触ってないから、違和感レベルでしか語れない。
■ このスレッドは過去ログ倉庫に格納されています