【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/
0242nobodyさん
2014/04/10(木) 14:11:17.70ID:???詳細は忘れてしまったけど、要注意だ
0243nobodyさん
2014/04/10(木) 14:21:07.20ID:???Strutsみたいのだとまた違うけれど
0244nobodyさん
2014/04/10(木) 14:33:01.94ID:???FormHelperのコードを見るとわかるけど、バリデーションのエラーメッセージの表示は、
Modelname.fieldname という構成を想定してるよ。
バリデートルールはModelに書くから、Controllerが保持する$validationErrorsも、
[Modelname][fieldname]という2次元配列で格納されている。
$this->Form->input('Modelname.fieldname') で、その$validationErrorsの中身と対になるようになってる。
例外でモデル名を省略できるケースはいくつかある。
$this->Form->create('Modelname');
$this->Form->input('fieldname');
Controllerのusesが1個の場合と、複数ある場合1個目のモデル、usesを書かずコントローラー名からモデル名がわかる場合は、
$this->Form->create();
$this->Form->input('fieldname');
でもいけたような気がする。たぶん
0246nobodyさん
2014/04/10(木) 15:58:45.85ID:???ほんとにそんなバグあるの?
0247nobodyさん
2014/04/10(木) 16:11:15.52ID:???Cake2.3.5で、Windowsのコマンドプロンプトからbakeしてます
cake bake view テーブル名 を実行しても
Welcome to CakePHP v2.3.5 Console
---------------------------------------------------------------
App : app
Path: appのパス
---------------------------------------------------------------
と出るだけで終了して何も起きない
インタラクティブでやると
Would you like to create the views for admin routing? (y/n)
[n] >
の後で終了して、何も起きない
0248nobodyさん
2014/04/10(木) 16:11:16.67ID:???詳細を書いてほしいものだ
レスがなければ嘘だと判断していいと思う
0249nobodyさん
2014/04/10(木) 16:13:07.05ID:???WHERE 1=1 でDELETE発行するバグが1.3.4まであった
http://web.archive.org/web/20110803234417/http://cakephp.lighthouseapp.com/projects/42648/tickets/250-model-delete-bug
ググれば過去スレも出てくるよ、12ホール目
0250nobodyさん
2014/04/10(木) 18:03:59.14ID:???以下のコードをコントローラのアクションに入れて実行
$this->テーブル->delete();
バージョン 1.3.2 1.2.8 1.2.0 のいずれも発生しなかった
>>249の提示した記事は英語なのであまり深くは読めていないが
ライブラリのmodel.phpを修正して$model->exists()をコメントアウトしてみたところ、
一応再現はできた
まとめると
�@モデルのexistsメソッドをidが指定されていなくてもtrueを返すように上書き
�Aモデルのdeleteメソッドを引数なしで実行
したときに DELETE FROM `テーブル` WHERE 1 = 1
が実行される(もちろん全テーブルじゃなくて1テーブルだけだが)
まあほとんどの人には縁のない現象といえるかな
もっと単純に再現できるコードがあるのなら提示してほしい
0251nobodyさん
2014/04/10(木) 18:47:46.61ID:???0252nobodyさん
2014/04/10(木) 19:06:10.92ID:???古いことなので今更調べる気にはなれない。
0253nobodyさん
2014/04/10(木) 20:45:55.49ID:???オラクルとかのトリガーでも自テーブルへの処理は参照すらできないから
記事のbeforeDeleteのような実装は単なるコーディングミスと判断していたよ
普通の処理とみなす人もいるってことね
0254nobodyさん
2014/04/10(木) 20:58:33.13ID:???その原因を突き止めるのに苦慮することが多いよね
0255nobodyさん
2014/04/10(木) 21:09:13.27ID:???0256nobodyさん
2014/04/10(木) 21:58:13.10ID:???0257nobodyさん
2014/04/11(金) 21:38:10.95ID:???どうして「01」と「1」に分かれているんですかね?
値はどちらも0が入っているのに
0258nobodyさん
2014/04/15(火) 08:59:05.93ID:eAedbEAoそういうもんなの?使えねーじゃん
0259nobodyさん
2014/04/15(火) 12:13:57.73ID:???2系(たぶん2.3〜)でCookieコンポーネントを使って
ユーザーデータ等を保存する場合、
$this->Cookie->write('Auth.User', $this->request->data['User']);
みたいにすると、
$this->Cookie->delete('Auth.User');
で削除できません。ログアウトの時にこれを入れても削除されません。
$this->Cookie->write('AuthUser'); で保存して
$this->Cookie->delete('AuthUser'); で削除はOKでした。
どうやらドット記法が原因のようです。
ログインフォームの自動ログインで上記のような書き方を
推奨しているサイトがちらほらあったので、注意してください。
ログインフォーム以外も何かしらCookieコンポーネントを
使うケースがあるかと思いますが、
出来るだけCookie名にドットを入れないほうが良いみたいです。
0261nobodyさん
2014/04/15(火) 15:56:03.67ID:???ためしてみたけど普通に使えたよ
使ったバージョンは2.4.6
App::uses('Validation', 'Utility');
debug(Validation::url('http://ほげ.com/漢字.htm'));
結果はtrue
0262nobodyさん
2014/04/15(火) 17:25:40.94ID:eAedbEAoバージョン上げてみようかな
0263nobodyさん
2014/04/15(火) 18:29:39.18ID:???$user = $this->User->read();
みたいな書き方って、あんまりやらない方が良いみたいだね。
この後にsave(更新)したら、request->dataに無いカラムも更新しようとして
空更新されて焦ったわ
0265nobodyさん
2014/04/16(水) 13:37:09.77ID:???いちいちサーバにアップしてSSHからコマンド実行して〜
というのが面倒に感じまして。簡単に実行確認出来る方法があれば教えて下さい。
0266nobodyさん
2014/04/16(水) 15:23:58.68ID:???できるけど、結構大変だろうなと予測。
というかそもそも設計がおかしんじゃない?
Shellでもブラウザでも呼び出せるタスクを切り離すべきだと思う。
0267nobodyさん
2014/04/16(水) 15:28:42.31ID:???Shell内でコントローラを読み込んでアクションを実行できるんですね。
それならブラウザ上でも確認できるので問題なさそうです。
0270nobodyさん
2014/04/16(水) 19:41:36.54ID:???書いているうえに肝心の実現方法を書いていないので不適切な回答だと思うが
>>267の結論はもっと意味不明で全く>>266と噛み合っていないので
>>268で呆れられてしまったということだろう
たぶん>>266が「できる」と書いたのは
execやpopenでcake.shやcake.batを呼び出すことじゃないかと予想してみる
OS依存なので個人的にはお勧めできないが
Shellとコントローラの両方から「標準で」使えるものはモデルだけだと思うよ
コントローラやコンポーネントやヘルパーなどをnewして使うようなやり方は
動作はするかもしれないが正しいやり方とは思えないな
0271nobodyさん
2014/04/16(水) 20:07:27.22ID:???「正しい書き方ではないけど動作する」なら、それでいいんじゃないか?
こんな事言うといつも「複数で開発する場合は迷惑だ」とか言う奴いるけど、
目的は「動作する」事であり、綺麗なソースを書くことじゃない。
それに複数人で開発するなら
「良い書き方がわからなかったから、この方法にした」
って説明すればいいだけだろ。情報共有しろよ。
0272nobodyさん
2014/04/16(水) 20:14:11.37ID:???Shell で呼び出す処理を別の Model だか Lib のクラスに移して、
ShellからもControllerからも実行できるようにすれば良い
0273nobodyさん
2014/04/16(水) 20:39:15.00ID:???よくあるメール一斉送信とかShellで作るけど、
その時の条件分岐やらModelに対する指示なんかはControllerに書くわけで。
メールの送信自体はライブラリ化しても良いと思うけど。
0274nobodyさん
2014/04/16(水) 22:05:21.32ID:???それができるとテストが便利で実装が楽でバグが減るんだっていうんだから
設計だとか綺麗かどうかとか関係ないだろ
0275nobodyさん
2014/04/16(水) 23:00:28.05ID:???0276nobodyさん
2014/04/17(木) 00:07:52.39ID:???0277nobodyさん
2014/04/17(木) 00:13:59.42ID:SXCfNI/g1行ずつステップデバッグ実行をした方が効率が良いものなのでしょうか?
cakePHPとかみたいなFWを使っている場合には
デバッガーがそこまで追い切れるのか若干気になります。
皆さんは、PHPで業務システムを作る時にはデバッガーを使っていますか?
それとも dumpで開発していますか?
0278nobodyさん
2014/04/17(木) 00:19:14.66ID:???人海戦術に頼る。クラウドソーシングとかで安く依頼できるしな。
やっぱ、システムだけで対応しようとすると、何かと抜けが出るよ。
0279nobodyさん
2014/04/17(木) 00:26:59.39ID:???ステップ実行といってもすべての行を1行ずつ実行する必要はなくて
処理を追いたいところにブレークポイントをつけておけばいいだけ
ステップ実行するまでもない場合はdebug関数で変数の中身を画面で確認してる
>>261
2.3.8で試してみたらfalseになったんでバージョンが原因みたいだね
>>263
自分もreadは使ったことなかったんで試してみたところ、再現を確認
なかなか嫌な動きだわ
0280nobodyさん
2014/04/17(木) 02:16:53.26ID:???0281nobodyさん
2014/04/17(木) 06:59:31.54ID:+GQ/cWTuどのように実現すればよいのでしょうか?
[テーブル左] 列A*、列B*、列D*、列E*
[テーブル右] 列A*、列B*、列C
(*は主キー)
のような構成で、
[テーブル左] に [テーブル右] を 列A、列Bをキーとして
列C を外部結合したいと考えています。
$virtualFields で1つにまとめて、$primaryKeyで定義しなす?
0283nobodyさん
2014/04/17(木) 12:22:28.87ID:???0284nobodyさん
2014/04/17(木) 12:35:55.72ID:???0285nobodyさん
2014/04/17(木) 14:12:21.40ID:???'joins' キーでちまちま作りこんだほうが良い。
というか、以前調べたときはそれしか無理だった。
他に方法あれば教えて欲しい。
Cake3 から複合キー対応らしいけどね。
0286nobodyさん
2014/04/17(木) 23:16:01.90ID:???親カテゴリから子カテゴリまで何階層あるか調べる方法って無いですかね?
無限にカテゴリを作れるのではなく、ある程度階層指定したいと思います。
簡単に表示する方法があるなら、エラー判定しやすいのですが
0287nobodyさん
2014/04/17(木) 23:45:58.91ID:???lft がより小さく且つrghtがより大きいので
子エンティティを $child、モデルのエイリアスを Foo 、階層を $depth とする場合
こんな風にしたら取れるはず
$childLft = $child['Foo']['lft'];
$childRght = $child['Foo']['rght'];
$conditions = array('Foo.lft <' => $childLft, 'Foo.rght >' => $childRght);
$depth = $Foo->find('count', compact('conditions')); // 親の階層数
0289286
2014/04/18(金) 10:55:29.76ID:???以下の様な階層だとして
テスト→子テスト→孫カテゴリ
287さんの方法では、「子テスト」を選ぶと1と表示され、
「孫テスト」を選ぶと2が表示されるなど、1つ上の階層番号しか表示されません。
0290286
2014/04/18(金) 10:56:34.64ID:???テスト→子テスト→孫カテゴリ
ではなく
テスト→子テスト→孫テスト
でした。
0291nobodyさん
2014/04/18(金) 13:04:19.06ID:N7yuefiZ0292nobodyさん
2014/04/18(金) 13:22:10.90ID:???0293nobodyさん
2014/04/18(金) 13:39:34.12ID:N7yuefiZ0295nobodyさん
2014/04/19(土) 16:38:03.71ID:2kVxcvEHとうとうCakePHP bake なんたら でぐぐると食べ物のケーキの記事ばかり出てくるようになってしまった
0296nobodyさん
2014/04/19(土) 17:11:08.54ID:???0297nobodyさん
2014/04/19(土) 20:27:05.90ID:???0298nobodyさん
2014/04/19(土) 20:37:49.07ID:???0299nobodyさん
2014/04/19(土) 20:39:03.09ID:???0300nobodyさん
2014/04/19(土) 20:57:23.19ID:2kVxcvEH0301nobodyさん
2014/04/19(土) 21:42:49.70ID:???どこの検索エンジンだよそれw
0302nobodyさん
2014/04/20(日) 01:46:02.06ID:???よく叩かれてる
0303nobodyさん
2014/04/20(日) 09:30:13.88ID:???やっぱり、Ruby、Perlの使われ方度合いに比べると
全然使われてないことになる
0304nobodyさん
2014/04/20(日) 09:57:55.62ID:???最終的には好みの問題みたい。
0305nobodyさん
2014/04/20(日) 10:42:30.47ID:???RailsとCakeの今が、いい意味でも悪い意味でもRubyとPHPの差の一つ
0306nobodyさん
2014/04/20(日) 11:18:10.27ID:???FWは型を提供するものだから、その型が気に入らなければ別のを使うしか無い。
無ければ作るか自分を合わせるしか無い。
明確な問題点があるんだったら、コミュニティに参加して改善を提案してみたことはあるのかな?
他を調査してより良い解決策があるんなら、具体的にその利点をここの読者に教えてあげようとしないのかな?
まぁ、自分一人で決めることも出来ないから、愚痴を言いたくなる気持ちもわかる。
0307nobodyさん
2014/04/20(日) 11:24:53.22ID:???え?
Perlは人口減って、昔から使ってた一部の会社が使ってるばかりだし、
Rubyは最近ようやく増えてきたかなって程度だろ。
0309nobodyさん
2014/04/20(日) 12:34:02.33ID:???0310nobodyさん
2014/04/20(日) 12:38:12.89ID:???Perl,Ruby
ガラパゴスFW
CakePHP
って言いたいのか
実際そうだけどな
0311nobodyさん
2014/04/20(日) 14:23:15.37ID:???(シェアじゃなくてGitHubの人気だったか?)
あと、YiiとかCIもCakePHPよりは上なんだよな確か。
でもオープンソースだからといってもシェアに関してはプロプライエタリと同じで、
必ずしも良い物が普及するとは限らないよな。
たとえばWordPressみたいに、酷いシロモノでも
マーケティングが勝利するオープンソースもあるし。
0312nobodyさん
2014/04/20(日) 15:51:49.84ID:???0313nobodyさん
2014/04/20(日) 17:08:13.64ID:???0315nobodyさん
2014/04/21(月) 09:50:09.63ID:???多いと錯覚しているだけだろ?
そら、PHPみたいに成熟された言語より
Rubyのような比較的新しくてそれほど一般化していない
技術のほうが注目を浴びるに決まってるわw
それと混同して「PHPは人気なくなった」とか目論見が甘すぎ
0316nobodyさん
2014/04/21(月) 15:57:26.42ID:???0317nobodyさん
2014/04/21(月) 18:53:01.40ID:???0318nobodyさん
2014/04/25(金) 10:49:57.10ID:???$this->referer()だと普通にリファラが表示されるだkです。
0319nobodyさん
2014/04/25(金) 13:39:29.24ID:s6GwqSqm0320nobodyさん
2014/04/25(金) 15:10:13.57ID:???何を作ろうとしてるのか知らないけど、
リファラを使って何かをする機能ってだけで、ちょっと不穏な空気を感じてしまう。
0321318
2014/04/25(金) 16:51:30.47ID:???管理画面なのですが、例えば削除(delete)する場所って
一覧(index)と詳細(detail)で出来るとします。
削除した後に全部一覧に戻せば良いだけかもしれませんが、
改ページした後に削除した場合、リファラで前の画面に戻したいのです。
つまり、要件として
・一覧から削除 → 前のページにリダイレクト
・詳細から削除 → 一覧にリダイレクト
となります。これをするために、リファラを分析して
「どこのページからのアクセスか?」がわかれば簡単と思い、質問しました。
0322nobodyさん
2014/04/25(金) 17:39:22.10ID:???その場合なら引数にリダイレクト変数をセットできる。
コントローラ側で汎用的な処理をしたいんならやっぱりリファラでやったほうが良いのかも。
URLの解析は >>320 の言ってる通りRouter::parse()メソッドがある。
ただ、リファラをそのまま渡してもダメで、
アプリケーションのルートからのパスにする必要があったかもしれない。
0323nobodyさん
2014/04/27(日) 13:54:25.75ID:???PHPばっかりの日本はガラパゴスなんかな
0324nobodyさん
2014/04/27(日) 15:43:07.45ID:???phpのほうがrubyよりは一応多いでしょ
rubyの9割以上の求人がrailsってのがすごいよな
railsだとpostgresql求人増えてるし
cakephp+mysqlのスペックだとガラパゴスになりそうだな
0325nobodyさん
2014/04/27(日) 16:13:12.62ID:???0326nobodyさん
2014/04/27(日) 17:19:21.88ID:???0327nobodyさん
2014/04/27(日) 18:49:35.25ID:???Djangoとはえらい違いだ。
0329nobodyさん
2014/04/27(日) 21:32:10.25ID:???0331nobodyさん
2014/04/27(日) 23:09:38.66ID:9dL9KMPJ結局またMySQLだよな
0332nobodyさん
2014/04/28(月) 00:46:19.25ID:???ま、CakeもRailsのパクリなんであれだが
0333nobodyさん
2014/04/29(火) 10:06:00.47ID:uHAmZpKN業務で使っている人は早めに当てておけよー。
1.3.x と 2.4.x 両方。
0334nobodyさん
2014/04/29(火) 10:12:45.43ID:???公式からしてやられてしまったのか?w
http://cakephp.org/
502 Bad Gateway
0335nobodyさん
2014/04/29(火) 10:46:44.84ID:uHAmZpKNちなみにこの脆弱性報告したのは実は俺。
0336nobodyさん
2014/04/29(火) 11:06:47.62ID:???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どういたしまして
■ このスレッドは過去ログ倉庫に格納されています