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

【PHP】フレームワーク CakePHP 2ホール目

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/11/14(水) 02:50:28ID:???
本家
http://www.cakephp.org/

10分で作るCakePHPアプリ for Windows
http://p4life.jp/cake/

マニュアル日本語化
http://www.cakephp.jp/doc/

日本語フォーラム
http://cakephp.jp/modules/newbb/

あとこのへんとか(初心者向けTIPS)
http://www.avatarfinancial.com/pages/cake/
0320nobodyさん2008/01/27(日) 14:20:46ID:???
>>319
さっき落とした状態の1.2でやってみたんだけど、
変数宣言していなくても時間がかかることはなかった。
きっとどこかで何かをやっているのだろうがソースは会社なのでw

そういやバリデーション部分でひとつ不満が。
たとえば、1から5までの値を受け付けるバリデーションを作ったとして、
エラーメッセージを、「1から5まで数値を指定してください。」って
表示することはできないよね?
もちろん、1から5までという数値はパラメータで変更可能。メッセージも同じく。
0321nobodyさん2008/01/28(月) 01:30:21ID:???
app/config/routes.phpで
Router::connect('/', array('controller' => 'pages', 'action' => 'display'));
て設定してる時にクッキー消して(use_trans_sid onで)
http://myapp/?CAKEPHP=e233bd9c1facda8084d8ba2f2226eb60 でアクセスすると
Error: CAKEPHPe233bd9c1facda8084d8ba2f2226eb60Controller could not be found.
そんなコントローラーねえよって怒られちゃう
Router::connectの書き方誰か教えてくらさい
0322nobodyさん2008/01/28(月) 12:43:25ID:???
Router処理に来る前に、URLからセッションID部分を削除して
クッキーを使っている場合と同様のデータの持ち方に
変換すればいいと思ったがやり方しらねw
03233212008/01/28(月) 22:42:45ID:???
googleグループに嘘英語で質問投げてみた
0324nobodyさん2008/01/28(月) 23:44:38ID:???
乙。結果頼むw
0325316とか2008/01/30(水) 12:21:18ID:???
エラー発生時にやたらと時間がかかる場所を調べた。
どうやら、デバッグ機能としてエラー発生時に
わかる範囲すべての変数を出力しているみたい。
だからモデルとかヘルパーとかいろいろ使っているほど遅くなる。

/cake/lib/debugger.php の __outputの以下の行をコメントアウトすれば
時間かからないようになる。もちろんデバッガ機能は落ちるけど。

foreach ((array)$kontext as $var => $value) {
 $context[] = "\${$var}\t=\t" . $_this->exportVar($value, 1);
}
0326nobodyさん2008/01/31(木) 03:14:54ID:???
ならデバッグ切ればよくね?
0327nobodyさん2008/01/31(木) 16:10:58ID:????2BP(3000)
なんか出力するHTMLのソースの最初に改行が入っちゃうのは俺だけ?
beta使ってるんだけど、HTMLは良くても、rssの場合だとFFでエラーが出てしまう…
0328nobodyさん2008/01/31(木) 16:32:27ID:????2BP(3000)
すまん。ソース追いかけてたら自己解決。
あるhelperの最後の?>のあとに改行が入っていたせいで、それが出力されていたみたい。
0329nobodyさん2008/01/31(木) 17:50:39ID:???
だから閉じタグは書くなとあれほど
0330nobodyさん2008/01/31(木) 19:05:13ID:???
>>326
なんのためのデバッグだよw
03313212008/02/01(金) 03:13:35ID:???
経過
最新のbranchならfixされてるよ って開発者のレスがついて
最新のbranchにしたけど解決しなかった
んでそのまま放置されてる 今のところ以上
0332nobodyさん2008/02/01(金) 17:28:50ID:???
AJAXヘルパーって使いにくいよね。
基本的にclickで動作するように作られているからmouseoverで
動作させるためにはコアに手を入れなきゃいけなくなると思うんだけど。
0333nobodyさん2008/02/01(金) 19:21:10ID:???
>>332
マウスあわせただけでサーバに問い合わせなんかしてたら高負荷になるだろ?
0334nobodyさん2008/02/01(金) 21:05:31ID:???
>>332

わざと機能を制限しているので逆に使いやすいかもしれない。
自分でライブラリ作っててわかるけどあれもこれも設定できるようにすると
逆に使いづらくなるからね。
0335nobodyさん2008/02/01(金) 22:30:33ID:???
>>333
ユーザーがブラウザ上で操作したマウスの動きを記録する
Ajaxがある時代に何いってんの?w
0336nobodyさん2008/02/02(土) 00:57:26ID:???
それだけ自由に作りたいならフレームワークじゃないほうがいいんじゃない?
簡単に一般的な大多数の開発をサポートする事を目標としてるんだろうし。

どうしてもって言うならコンポーネントとか作ればいいんじゃね
標準で対応するには一般的じゃないって事だと思うが
03373322008/02/02(土) 19:02:48ID:???
確かに>>335は特殊すぎる例だけど、マウスオーバーで何かしらの
アクションがあるというのはけっこう使うと思うけどなあ…
しょうがないから自分で作ってやってるけど。
0338nobodyさん2008/02/07(木) 12:02:24ID:???
TestSuiteのやり方説明しているページ無い?(出来れば日本語で)

良くある説明ページが
class MyTestCase extends CakeTestCase {
 var $TestObject = null;
 function setUp() {
  $this->TestObject = new 〜〜;
 }
 function tearDown() {
  unset($this->TestObject);
 }
}

ってなっているんだけど、setUpが実行されるタイミングが
いまいちつかめない。なんか想定外に実行されるし。

また、fixturesを使ったとき、テーブルが作られるタイミングが
どうも???でテーブルが無いといわれたり。


んで、ざっくり調べたところ、
startCase/endCaseとstartTest/endTestというのが見つかった。

これだと、以下のコードで次のように想定どおりに表示される。
startCase -> startTest -> endTest -> startTest -> endTest -> endCase
0339nobodyさん2008/02/07(木) 12:03:02ID:???
class MyTestCase extends CakeTestCase {
 var $TestObject = null;
 function startCase() {
  pr('startCase');
 }
 function startTest() {
  pr('startTest');
 }
 function endTest() {
  pr('endTest');
 }
 function endCase() {
  pr('endCase');
 }

 function test1() {
  $this->assertTrue(true);
  $this->assertTrue(true);
 }
 function test2() {
  $this->assertTrue(true);
  $this->assertTrue(true);
 }
}
0340nobodyさん2008/02/07(木) 12:03:45ID:Ja8AUMIG
ちなみに、この状態で、setUp、tearDownが実行されるタイミングを表示させると?になる思う。
startCase/endCaseで足りると思うんだが、setUp、tearDownは何の為に使えばいいのだろう?

で、まだ良く調べていないのが、fixturesで追加したテーブルがどうなるか。
動きを見てみると、startTestが実行する直前に毎回リセットされてるようだ。。
だからstartTest前にCREATEしてendTest後にTRUNCATEしているようだが・・・

こういうレベルでちゃんと説明しているところがほしい。
0341nobodyさん2008/02/07(木) 12:42:55ID:???
バージョン言うの忘れてた。1.2.0.6311-betaです。
0342nobodyさん2008/02/08(金) 15:28:07ID:???
勉強会瞬殺過ぎるだろ…
0343nobodyさん2008/02/08(金) 17:25:37ID:???
http://pub.studio15.jp/2008/02/08/wakuwaku-meeting/
こっちがあるよ。
0344nobodyさん2008/02/08(金) 19:11:40ID:???
CakeWebTestCaseというかsimpletestのWebTestCase便利だな。

商品をカートに入れるとカートの画面に飛ぶ。
そこからログインをクリックしてログインページへ。
ユーザー・パス入れてログイン。
そしたらカートの画面に戻っている。
そして状態でもカートに商品は残ったまま。
ログアウトボタンをクリック。
そしたらカートから商品は削除されている。
(当然この一連の処理にクッキー・セッションが使われている。)

という一連のテストを自動化できちゃったよ。
(一度書いたら何か修正しえてもそれを実行するだけ)
0345nobodyさん2008/02/09(土) 00:52:29ID:???
みんなエディタとか何使ってる?Eclipse?PHPエディタとか??
0346nobodyさん2008/02/09(土) 14:25:58ID:???
>>345
dreamweaver cs3 使ってますよ。
やっぱりこれが最強じゃないですかね。

プログラム、デザインの両方に特化していますので。
0347nobodyさん2008/02/09(土) 17:09:18ID:???
明らかになんちゃってプログラマだな。人気に伴ってCakeのレベルが落ちてきてる
0348nobodyさん2008/02/09(土) 23:16:53ID:???
cakeのレベルは落ちないだろ。
0349nobodyさん2008/02/10(日) 01:04:56ID:???
裾野が広がることがレベルが落ちるって事なのか
って事は人気のあるスポーツはどんどんレベルが落ちてるんだな
0350nobodyさん2008/02/10(日) 01:17:48ID:???
あぁ、初心者がたくさん入り込んできて
レベルが下がってるよ。スポーツは
0351nobodyさん2008/02/10(日) 01:37:18ID:???
沢山の初心者がプロの地位をより高めるだけ。
部外者からみてもピラミッドが見えるようにすればいい。
0352nobodyさん2008/02/10(日) 14:24:03ID:???
A hasMany B belongsTo C

こんなリレーションなんですが、A->findAll()すると、Bしか付いてきません。
B->findAll()とすると、Cが付いてきます。

A->findAll()でB,C一緒に持って来たいのですが、どのようにしたらよいのか分かりません。
どなたかヒントをください。
0353nobodyさん2008/02/10(日) 14:24:47ID:???
A->findAll()->findAll()
0354nobodyさん2008/02/10(日) 14:31:15ID:???
ありがとうございます!

A->findAll("","","","","",'3')

これでいけました。
0355nobodyさん2008/02/10(日) 14:37:22ID:???
>349-351
なるほど。なんか納得。
web上ではプロは目立たず素人ばっか目立つから変な感じに見えるのか。
0356nobodyさん2008/02/10(日) 15:35:17ID:???
逆にマイナーなやつだと、それを使用している人は
ごくわずかでそういうものに手を出す人は
詳しい人が多い。

実際は、使う人の問題なのに、
言語の問題といいはるRuby凶なんてのがいたな。
0357nobodyさん2008/02/11(月) 00:25:02ID:???
「プロ」は余裕が無い人が多いからね。
自分が何か情報を出すとライバルに盗まれるかも、とか足を引っ張られるかも、とか思ってるんでしょ。
もうちょっと余裕のある人はちゃんと次を育てていける。
いきなり素人が…とか言い出したりしないだろ普通。
0358nobodyさん2008/02/11(月) 00:28:41ID:???
ホントにプロなら素人と共同作業しないでしょ。

新人には仕事教える立場だし。
0359nobodyさん2008/02/11(月) 02:35:25ID:???
うーん、盗まれるってのは無いと思うけどな。
ネットに限って言えば、プロな人がいろいろ露出するのって、ほぼ趣味なんじゃないか。
PHP界隈が、趣味でやるほどの魅力がない、仕事用の言語って感じだからじゃないの?
0360nobodyさん2008/02/11(月) 02:54:33ID:???
もう作ることではなく、
言語そのものが目的だからなw
0361nobodyさん2008/02/11(月) 03:20:56ID:???
言語そのものが目的って、趣味の人だろそれ
0362nobodyさん2008/02/12(火) 08:45:57ID:???
このアソシエーションって擬似的なもん?
一括で更新とかするSql文とか作ってるわけじゃないの?
0363nobodyさん2008/02/12(火) 14:38:05ID:???
>>362
複数のテーブルを一括で更新できるか考えてみれば良い。
0364nobodyさん2008/02/13(水) 00:39:35ID:jaUT9mg5
ビューのテンプレートファイルはコントローラによってフォルダ分けされるけど、
単体で使える共用のビューを作りたい時はどうすればいいの?
app/views/common/common.ctpみたいな感じ
0365nobodyさん2008/02/13(水) 01:02:22ID:???
>>364
function common(){
$this->viewPath='common';
}

とかすれば
0366nobodyさん2008/02/13(水) 02:07:27ID:???
element使え
0367nobodyさん2008/02/13(水) 20:01:16ID:jaUT9mg5
>>365
どうもありがとうございます
0368nobodyさん2008/02/14(木) 11:30:58ID:???
ウィザード形式というか、ある項目を入れて次へ→ある項目を入れて次へ
→最後にOKで処理実行のようなページを作るにはどうしたらいいの?

ページごとにエラーチェックしたり、前の入力項目の値を元に
次のページを決めたり、想定外のページ変移に対応したりもしたい。
0369nobodyさん2008/02/14(木) 15:36:54ID:???
>>368
view1枚の中で条件分岐しまくるのはどうか
0370nobodyさん2008/02/14(木) 16:32:15ID:???
viewは一枚としてコントローラ側は?

まあ今はaction一つでやってるんだけど。

なんか一つにごちゃごちゃあって見にくいなぁと
それにページ間での値の参照・共有したいし
なんか良いやり方無いのかなぁ?
0371nobodyさん2008/02/14(木) 16:35:18ID:???
セッションでデータ保持して、ページ移動はredirectとかすればいいんじゃね
0372nobodyさん2008/02/14(木) 16:43:59ID:???
>>371
同感。
03733692008/02/14(木) 16:55:00ID:???
>>370
actionも1個でやる。controller側ではページ分割されていることを意識しない。
1ページ目のpostは、2ページ目以降の項目が未入力と見做してエラー扱い。
表示の調整をviewでやる。

まあ思い付いただけなんで上手く行くかは分かりません。
0374nobodyさん2008/02/14(木) 18:23:10ID:???
それでページの「戻る」とかちゃんと動くのかなぁ?

一ページ目入力、ニページ目入力、三ページ目入力・・・してる途中で
一ページに戻る、一ページ目訂正、
二ページ目はさっき入れたのが表示されているからそのまま次へ。
三ページ目入力

みたいな。
0375nobodyさん2008/02/14(木) 18:27:55ID:???
>>371
> セッションでデータ保持して、ページ移動はredirectとかすればいいんじゃね

汎用的過ぎて参考にならないよw

ほぼすべてのウェブアプリはセッションかデータベースにデータ保持して
ページ移動はredirectとか使っている。
0376nobodyさん2008/02/14(木) 18:33:04ID:???
じゃあそれでいいんじゃないの?
03773692008/02/14(木) 19:39:04ID:???
>>374
マイナス1ページはプラス1ページと同じだから問題ないと思うけど、
ページを飛ばすのは処理増やさんといかんなあ。

入力値でページ分岐もややこしそうだ。
あと、未入力エラーを出すか出さないかの判断も必要か。
0378nobodyさん2008/02/14(木) 21:58:46ID:???
セッション変数を使うとして、
いかに管理しやすくするかということかな。
PHP5だと普通にインスタンスをセッション保存できるから、
複数ページで1インスタンスを共有というのもありでしょう。
0379nobodyさん2008/02/15(金) 04:03:48ID:???
ていうか、CakePHPに限ったことじゃないのに悩むとか経験なさ杉だろ。
もっと普通のウェブアプリ作れ。
0380nobodyさん2008/02/15(金) 04:24:44ID:???
>>379
悩まないのならあおってないで答え書いたら?w
0381nobodyさん2008/02/15(金) 06:47:51ID:???
会員ログインID以外のデータを
セッションでデータ保持するのはバカだろ
0382nobodyさん2008/02/15(金) 06:54:30ID:???
>>368
ただの初心者だろ?普通にできるやん
0383nobodyさん2008/02/15(金) 09:08:38ID:???
やん
0384nobodyさん2008/02/15(金) 10:10:41ID:???
>379
いや、Cakeならそのケースでどうするかということで
フレームワークによってセッションの扱いは少しずつ異なるし。
0385nobodyさん2008/02/15(金) 12:21:57ID:???
>>381
んなこたーない
0386nobodyさん2008/02/15(金) 15:43:58ID:???
>>381

俺ほぼ全部を受け渡してるけどな。
だってIDのみだったら他の情報がを表示するときとかっていちいちDBから拾ってくるの?

まぁ、変更するときはDBを更新する必要があるんで接続はするだろうけど。
0387nobodyさん2008/02/15(金) 15:56:24ID:???
全部っつったって、常に表示してるのなんて、名前くらいじゃね?
そのくらいいいじゃん。
0388nobodyさん2008/02/15(金) 16:55:19ID:???
セッションはそもそも大量データを保存するものじゃない
基本的に大量データを引っ張てくるキーだけ保存するもの
0389nobodyさん2008/02/15(金) 16:59:50ID:???
>>386
いちいちDBから拾うのが基本
セッションは会員IDなど必要最小限のデータだけ入れるべき
データ大量に保存して持ちまわすものじゃない

0390nobodyさん2008/02/15(金) 17:01:59ID:???
セッションをCakePHPではじめて使う人は
セッションについて何もわかってないみたいだ
0391nobodyさん2008/02/15(金) 17:04:23ID:???
基本的にログインID以外でセッション変数を多様するのはバカ
0392nobodyさん2008/02/15(金) 17:05:37ID:???
複数のリクエストにまたがる処理の場合、セッションでデータ継続することはある。
0393nobodyさん2008/02/15(金) 17:12:24ID:???
必要最小限以外はhiddenで渡すのが基本
セキュリティ的にもやばいし
ページの前に戻ると不具合がおこりやすい
常に大量データ持ちまわすことはメモリ、CPUに負荷がかかる
0394nobodyさん2008/02/15(金) 17:14:11ID:???
セッションがダメならcookie使え!
0395nobodyさん2008/02/15(金) 17:18:54ID:???
つーかログインID以外にセッション多様することなんてないやろ?
ページまたぎ処理はパラメータで引き継げよ
0396nobodyさん2008/02/15(金) 17:27:06ID:???
>>393
>セキュリティ的にもやばいし
どういうとこが?セッション固定化とかは別の話だし

>ページの前に戻ると不具合がおこりやすい
具体的にどんな不具合?
セッションでフロー管理してるからhiddenよりも厳密にできたりするんだけど

>常に大量データ持ちまわすことはメモリ、CPUに負荷がかかる
大量っていっても、多くても数kとかだし。
何かしらのキーで毎回ストレージから取得するのも処理コストあるよね
0397nobodyさん2008/02/15(金) 17:32:39ID:???
勉強になるなぁ。

俺はセッションに入れる派。
0398nobodyさん2008/02/15(金) 17:47:48ID:???
hiddenみればわかると思うけど
yahooなどの超有名サイトほど、ログイン処理など
きわめて便利でないとこ以外はセッションを使ってない
0399nobodyさん2008/02/15(金) 17:48:37ID:???
OpenPNEもログイン処理以外はセッションを使ってない
0400nobodyさん2008/02/15(金) 18:01:38ID:???
単純に考えてもセッションが途中で切断されたとき
データの引継ぎが途中で止まる
hidddenにデータがはいってないので
最初からページ移動のやりなおし






0401nobodyさん2008/02/15(金) 18:13:03ID:???
なるほど。それは納得。

hiddenは値をいくらでも改竄できるからどうも・・・。
それすると挙動がおかしくなるサイトもあるし。
まぁ、それはそこの実装者が悪いだけなんだけど。

今のところセッションの方が生産性高いから、セッションで実装しちゃうな〜
0402nobodyさん2008/02/15(金) 18:16:11ID:???
セキュリティ的にいえば毎回DBと照らし合わせが基本
セッション多様は開発者が楽するためのもので
サイト運営者、利用者にとってセキュリティリスクでしかない
0403nobodyさん2008/02/15(金) 18:24:00ID:???
セキュリティ的にどうのこうのって、さっきから一切具体的な話がないんだよね。
0404nobodyさん2008/02/15(金) 18:49:34ID:I3wnpJfD
Not Found
0405nobodyさん2008/02/15(金) 19:08:46ID:???
毎回DBと何を照らし合わせるんだ?
リクエストされたパラメータが改竄されていないかどうかをチェックするということか?

そんなことをするならばセッションにデータを格納したほうが効率が良いだろう。
悪意あるリクエストによってサーバセッションの中身を改竄するのは、
パラメータを書き換えるよりは困難だ。

他人のセッションを乗っ取ったり、MITM攻撃などでの手法はまた違う議論。

セッションを使おうが、パラメタを使おうが、適切な処理を行わなければ
どちらもセキュリティリスクになる。

どちらの方法も処理次第では脆弱になりうる。
逆に言えば、どちらの方法でも適切な処理を行えば十分安全になる。
ここでいう*十分安全*という定義はサービスの内容によって異なる。
0406nobodyさん2008/02/15(金) 19:10:27ID:???
ページ移動にセッション使ってるやつて、どういうコード書いてるのさ
具体的に指摘してやるからコード晒してくれ
0407nobodyさん2008/02/15(金) 19:39:23ID:???
外のサイトからデータ引っ張ってきて確認画面等でページ移動するときはセッションで引き回してる
他はログインID引き回すぐらいかな
ちなみにCAKEのデフォルト通りにIPでも(自動で)チェックしてるからドコモの人はさよならな俺のサイト
0408nobodyさん2008/02/15(金) 20:04:49ID:???
>>406
具体的に?
いや、だから、あるアクションでセッションにデータ入れて関連する他のアクションで参照するっていう、ほんとそのまんま。
コード書くまでもない。
0409nobodyさん2008/02/15(金) 21:21:34ID:Q8bQtypz
セキュリティという面ならhiddenで取り回すよりもセッションの方がまだマシだと思うけど違うの?
hiddenだと改ざんされてしまうし・・・。
けど、何でもかんでもセッションにってのは確かに気持ち悪いわな。
0410nobodyさん2008/02/15(金) 21:43:28ID:???
hiddenの場合って「入力画面 -> 確認画面 -> DB登録」って時に、確認画面からhiddenでDB登録に渡すでしょ
確認画面の時にバリデートして、DB登録直前にまたバリデートって面倒じゃない?(hidden値改竄の可能性があるから)

セッションだったら確認画面でセットしたデータがDB登録の時になって変わることがないからいいんだけど
0411nobodyさん2008/02/15(金) 22:23:55ID:???
hiddenにもセッション変数にも問題はあるから、扱う情報によってケースバイケースでは?
個人的には、セッション変数を使うのが良いと思うが、
セッション変数は手軽に増やせるので、コードの質を低下させるのを気をつけたい。
例えば、index.phpですべてのリクエストを受けて、
$_SESSION['action']で場合分けみたいなコードを編集したことがあるけど、
$_SESSION['action']はsession_start()さえしておけば、コードのどこでも変更できるので、
きちんと規約を決めておかないと副作用で死ぬ。
フレームワークに期待するのは、そういう規約の部分なんだけど。
0412nobodyさん2008/02/15(金) 22:28:43ID:???
ちなみにセッションが小技的に有用だと思ったのは、
Javascriptからしか参照されないJSONで、
ユーザ固有のデータを出すときに、いちいちPOSTしなくて良い点。
遷移の上で孤立したアクションでユーザ固有のデータを使える。
0413nobodyさん2008/02/15(金) 22:30:54ID:???
セッションのサイズが大きくなったらどうするんだ?
たとえばセッションのサイズが1MBになったら、
データ読み込みに時間がかかるだろ?

反論

ページ移動するたびに、
1MBものデータをhiddenでクライアントに転送し
それをまたサーバーに送信するようなことをしたら
もっとパフォーマンス悪いだろ?
0414nobodyさん2008/02/15(金) 22:56:12ID:???
>>413
いや、そもそも、設計を見直せ、って話だろ、それ。
0415nobodyさん2008/02/15(金) 23:02:40ID:???
「設計を見直せ」というだけなら簡単
0416nobodyさん2008/02/15(金) 23:05:36ID:???
データをセッションに保存しないとしたらどこに保存するんだろうな?
セッション=ファイルなわけで、ファイルに保存するか、
データベースに保存するかの違いしかないんだが・・・
0417nobodyさん2008/02/16(土) 00:07:09ID:???
386です。

セッションIDのみでデータベースから読み出して処理するのがベストなのですか。
勉強になりました。ありがとうございます!
0418nobodyさん2008/02/16(土) 00:20:43ID:???
セッションをデータベースに保存すれば
それで終わりだなw
0419nobodyさん2008/02/16(土) 02:31:23ID:???
なんだかんだ言って、幅広い意見が聞けて有益なスレだ
■ このスレッドは過去ログ倉庫に格納されています