【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/
0437nobodyさん
2014/05/12(月) 13:36:54.55ID:???じゃぁ、verify() した結果を見たらヒントがあるかも
debug($this->Category->verify());
どこかで整合性が崩れてると実行されない可能性有り。
0438nobodyさん
2014/05/12(月) 13:49:48.47ID:???ありがとうございます。試してみました。
verify()でしばらくかかりましたが、真っ白な画面がリターンされました。
これはツリーに不整合などの異常がなかったということですよね。
0439nobodyさん
2014/05/12(月) 14:00:55.26ID:???時間かかってなおかつ白い画面ってことはタイムアウトですね。
かなり大きいんですね。
成功すれば bool(true) が返る。
Shell でやってログに書き込んで確認してみたらいいかも。
0440nobodyさん
2014/05/12(月) 14:03:28.70ID:???0441nobodyさん
2014/05/12(月) 14:04:31.37ID:???整合性グチャグチャになるから注意
0442nobodyさん
2014/05/12(月) 14:10:08.15ID:???ありがとうございます。お察しの通りノードが3万以上あるツリーなのです。
白画面はタイムアウトですか。勉強になりました。
TeraTermからサーバにログインし curl コマンドでverifyのURLにアクセスしましたが、
ブラウザから呼んだ時とは違い、瞬時にプロンプトが返ってきてしまいます。
シェルでverifyを実行とは、具体的にはどうすればいいのでしょうか?
0445nobodyさん
2014/05/12(月) 14:13:55.11ID:???Fatal error: Maximum execution time of 30 seconds exceeded in
ってでないっけ?
0447nobodyさん
2014/05/12(月) 14:27:56.28ID:???classVerifyHogeShell extends AppShell {
protected function result() {
$Hoge = ClassRegistry::init('Hoge');
return $Hoge->verify();
}
public function show() {
debug($this->result());
}
public function dump() {
//!TODO ログに書き込むロジックを記述
}
}
こんなファイルを作って
$Console/cake VerifyHoge show
とか
$Console/cake VerifyHoge dump
とか
Shell の作り方・使い方はぐぐれば幾らでも出てくる
0448nobodyさん
2014/05/12(月) 14:31:07.10ID:???cURLからアクセスしても最大実行時間は一緒だ。
コンソールからPHPプロセスを利用しなきゃ。
php のユーザーが誰かってことが抜け落ちてる。
0449447
2014/05/12(月) 14:32:38.76ID:???>Console/commant/VerifyHogeShell.php
Console/Command/VerifyHogeShell.php
0450nobodyさん
2014/05/12(月) 14:37:04.67ID:???>>448
ありがとうございます!
AppShellなるクラスが用意されていたのですね。知りませんでした。
さっそく試してみます。
0451447
2014/05/12(月) 14:41:43.59ID:???わかってるだろうけどコマンドのディレクトリセパレータは / じゃなくて \ な。
0452nobodyさん
2014/05/12(月) 15:16:40.76ID:???>>448
verify()をShellから実行した結果、180超のエラーが出力されました。
特に多いのは index missingというやつです。
recover() で回復できますでしょうか?
0453nobodyさん
2014/05/12(月) 15:22:02.02ID:???以前自分も同じようになったときは、
recover()で上手く言った場合とそうでない場合とがあった。
上手く行かなかったときは時間もなかったんで、
独自でスクリプト書いてで lft と rght を振り直した。
すまんが深く探ってないんで、それ以上詳しいことはよく分からん。
一度やってみろとしか言えない。
0454nobodyさん
2014/05/12(月) 15:24:38.22ID:???これからも同じ問題が発生するおそれがあるんで、
更新処理を全て点検したほうがいいな。
テストを良く書けているかどうかで、こういうときに大きく差が出る。
0455nobodyさん
2014/05/12(月) 15:27:51.20ID:???不特定多数のカテゴリを扱うとかなったら、
今回のような問題が起きてしまう可能性があるし
0456nobodyさん
2014/05/12(月) 15:28:47.24ID:???必ず Shell から実行すること。
更新中にタイムアウトなんかしたら(特にMySQLのMyISAMなどは)やっかいなことになる。
0458nobodyさん
2014/05/12(月) 15:38:35.35ID:???アドバイスありがとうございます。
>これからも同じ問題が発生するおそれがあるんで、
お客が不正に行ったデータのInsertなどが原因だった可能性もありますが、
プログラムのほうも確認しておきます。
recover()もShellから実行しました。案外完了が早かったように思います。
今2度目のverify()です。
0459nobodyさん
2014/05/12(月) 16:13:23.60ID:???verify()でtrueが返りました!
moveUp()をあるノードで実行して結果をdebug文で出すとtrueが返りました。
しかし、treeには何の変化もなし!ノードの位置は一切変わっていません。
なぜなのでしょうか・・・。
0460459
2014/05/12(月) 16:28:51.15ID:???bookを読むと 同じ枝の中で順番を上に上げるのがmoveUp()なのですね。
僕はそもそもmoveUp()したノードは「一つ階層を上がって、今までの親ノードと同じ階層に来る」
ということを実現するものなのかと勘違いしておりました。
申し訳ありませんでした。しかしverify, recoverをshellから実行するなどの貴重な情報が得られて
感謝です。
0461nobodyさん
2014/05/12(月) 16:30:16.90ID:???0462nobodyさん
2014/05/12(月) 16:31:48.27ID:???そうですよね。
しかしparent_idを手でいじって、lft, rghtがそのままで良いのかというのが気になる点です。
0464nobodyさん
2014/05/12(月) 16:33:45.39ID:???>parent_idを手でいじって
ちがーーーう!
TreeBehaviorが効いてるモデルでやるんだよ!!
0465nobodyさん
2014/05/12(月) 16:38:21.01ID:???3万件超あります。
>>464
もちろん、DBから直接parent_idを変えたりしませんよ。
CakephpのEdit画面(もちろんTreeのモデルのもの)から変えます。
0467nobodyさん
2014/05/12(月) 17:34:01.92ID:???>CakephpのEdit画面(もちろんTreeのモデルのもの)から変えます。
なら問題なく lft, rght 変更してくれる。
っつーか、それがTreeBehaviorの仕事だからな。
0468nobodyさん
2014/05/12(月) 17:45:37.30ID:???0469nobodyさん
2014/05/12(月) 17:54:12.62ID:???ありがとうございます。
parent_idを変更すると、思っていた階層の移動が完了できました。ご迷惑をおかけしました。
カテゴリはこれからも増えていく可能性があるので、
このままTreeBehaviorを実装していて安全なのかちょっと心配しています。
親子関係を実現するには普通にHABTMでもいいのではないかな、と思いましたが、
設計段階でTreeの採用が決まっていたので、これで作ってしまっています。
データ件数がでかくなった今、非常にデリケートなデータ構造なんだな、と改めて認識しております。
0472nobodyさん
2014/05/12(月) 19:01:06.74ID:???・categories
・articles
・category_articles(中間テーブル)
みたいなテーブルを作る
0473nobodyさん
2014/05/12(月) 19:02:02.02ID:???categories_articlesだったかな。
0474nobodyさん
2014/05/12(月) 19:42:05.93ID:???Categoryモデルの中に
public $belongsTo = array('Parent' => array('className' => 'Category',));
public $hasMany = array('Children' => array('className' => 'Category'));
と二つ記述するやりかたですかね。
それを最初に思いついたのです。
しかしTreeのほうが上ではないかという意見が出たため、そっちを採用しました。
0475nobodyさん
2014/05/12(月) 19:50:22.00ID:???だからHABTMじゃないですね。ごめんなさい。
言うならばHas Many and Belongs to Oneでしょうか。
0476nobodyさん
2014/05/13(火) 16:37:41.63ID:???なんか最近CakePHPのバージョンあがるの早い気がするけど、気のせいか?
0478nobodyさん
2014/05/13(火) 16:44:46.95ID:???さっさと3出して、2は打ち止めでいいだろ。
0479nobodyさん
2014/05/13(火) 17:43:09.45ID:???ということは存在する全モデルを常に書いてもいいってこと?
0480nobodyさん
2014/05/13(火) 18:12:50.09ID:???0482nobodyさん
2014/05/13(火) 22:43:15.01ID:???0483nobodyさん
2014/05/14(水) 00:35:48.56ID:???0484nobodyさん
2014/05/14(水) 02:38:22.28ID:???不安で死ぬやつって俺だけ?
0485nobodyさん
2014/05/14(水) 04:51:26.28ID:???まとめて動作確認してもデバッグしやすいよ。
あとはテストを書け
0486nobodyさん
2014/05/14(水) 07:02:10.89ID:???0487nobodyさん
2014/05/14(水) 10:05:36.21ID:???0488nobodyさん
2014/05/14(水) 10:09:17.84ID:???0489nobodyさん
2014/05/14(水) 11:29:01.43ID:???インターフェースのテストで、mockの使い方がわかってくるようになると、考え方が変わるかも。
0490nobodyさん
2014/05/14(水) 12:33:17.82ID:???俺も教えて欲しいんだけど
テスト書くのが面倒
テスト自体信用できない
書いてもやっぱり最初から書きたくなる
って思ってしまうんだけどそれでも書いた方がいいと思う?
できるプログラマーの人はみんな書いてるよね。
0492nobodyさん
2014/05/14(水) 12:51:30.16ID:???誰かのひどいコードを見つけた時、
テストを書いてあれば・・・と思うよ。
0493nobodyさん
2014/05/14(水) 13:38:02.11ID:???0494nobodyさん
2014/05/14(水) 14:02:28.89ID:???やるならSelenium使うんじゃない?
0495nobodyさん
2014/05/14(水) 14:08:25.34ID:???ではないんだよね?これはブラウザで確認すればいいだけだし、
大体はコード書いた後に実行して確かめているだろ。
具体的にどういう場面でテストが必要になるの?
0496nobodyさん
2014/05/14(水) 17:09:00.17ID:???0497nobodyさん
2014/05/14(水) 17:52:25.48ID:???> 大体はコード書いた後に実行して確かめているだろ。
一度書き捨てて終わらせられるなら誰も書く訳がない
改修は何度も発生する=確認も同じだけ発生する=クッソ面倒
だから面倒な確認を自動化するためにテストを作るんだ
0498nobodyさん
2014/05/14(水) 20:45:44.91ID:???まずテストコードってなんなの?
console.log()とは違うの?
0499nobodyさん
2014/05/14(水) 21:02:32.76ID:???→ 逐一人の手で実行して人間がブラウザやconsoleに表示された値やを見て想定したものかどうか確認する
自動化できてない
複数の関数やメソッドが絡むとバグの原因の特定がしづらい
他の皆の意図するテスト(単体テスト)
→ それぞれの関数やメソッドが複数の引数のパターンに対し適切な返り値を返したり
例外やエラーを吐いたりなど仕様通りの挙動をするかを確かめるコードを書く
検証する対象が小さいので比較的簡単に書けるし自動化も容易い
プログラムの小さい単位の動作をあらかじめ保証しておくことで
後の複数の関数やメソッドが絡むテストの際にもバグの原因の特定がしやすくなる
面倒だから単体テストでググれ
0500nobodyさん
2014/05/14(水) 21:19:27.30ID:???0501nobodyさん
2014/05/14(水) 21:51:05.96ID:???これは引数に例えば「1と2を入れると3が返る」というもの。
1「テストを書かないやりかた」
こんな簡単なメソッド、どうやってもミスるわけない。
とりあえず作る。最初に動くか確認する。
動いた・・・終わり
2「テストを書くやりかた」
「1と2を入力すると3が返る」というテストを書く。
開発しながらテストを走らせて正常か確認する。
テストが異常なら、異常がなくなるまでプログラムを修正する。
これをずっと繰り返す。
3「テストを先に書くやり方」
2のテストを先に書く。メソッドは空からスタート。
テストが通るまで開発を行う。
0502nobodyさん
2014/05/14(水) 21:56:32.40ID:???使うときにコメントイン/アウトしなきゃいけないし、消し忘れるとそれがそのまま出力されて大変なことになる(センシティブな情報だったら・・・)。
0503nobodyさん
2014/05/14(水) 22:52:25.27ID:???ただcakephp1が2になったりするとテストも書き直しだよね。
結局テスト書いてもそれ以上にプログラムの進歩が速いような気もするんだよね。
ちなみにヤフーとかって10年前くらいにcgiをphpに書き直したみたいなこと聞いたけど、あれ以来書き換えてないのかな。
それとも地道に書き換えまくってるのかな?
0504nobodyさん
2014/05/14(水) 23:08:58.07ID:???いきなりスパン長い話になってね?
ビジネスロジックまで全部変わるわけじゃないんだからテストコードも一部はそのまま使えるでしょ
テストコードまったくなしに書きなおすよりはいくらか書きやすいと思う
0506nobodyさん
2014/05/14(水) 23:52:50.14ID:???ありがとう。そういうメリットもあるんですね。
>>505
わからない人にとっては全くわからないんだよね。テストケースのメリット。
俺、gitもテストケースも使ったことないというか使えないので勉強します。
0507nobodyさん
2014/05/15(木) 00:48:57.49ID:???0508nobodyさん
2014/05/15(木) 01:04:25.59ID:???愚者は経験に学ぶと言うけど人間なんて全員愚者だから、がんばって経験を積もう
0509nobodyさん
2014/05/15(木) 02:16:19.81ID:???こういう >>492 時に必要になるんだよ。
例えば1日の区切りが0時じゃなく4時なサービスがあるとしよう。
DateTimeオブジェクトや日時の文字列を受けて、何日かを返すメソッドがあるんだけど、
中身を見たらこりゃひどい実装だなという時、
テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。
0510nobodyさん
2014/05/15(木) 03:48:38.98ID:???テストの話題で盛り上がりやがって
0512nobodyさん
2014/05/15(木) 10:33:38.61ID:???>中身を見たらこりゃひどい実装だなという時、
>テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。
ここが想像できないんだよ。中身(モデル?)が酷い実装っていうけど、
前は動いてたんだよな?それを変更する時に「酷い」が分かるんだろ?
なら、テストも書き直しだと思うんだよ。俺も>>503と同じ疑問を持ってる。
Cakeのバージョンアップではなくとも、仕様が変わればテストも変わるでしょ。
0513nobodyさん
2014/05/15(木) 10:45:22.44ID:???少なくとも単体テストしやすいように設計してれば
仕様を変えた部分の他に影響がないことを保証しやすいんじゃないか
テストが書いてない誰かが作ったソフトウェアを改修する時に
あっち変えたらこっち動かなくなったよみたいな経験ない?
0514nobodyさん
2014/05/15(木) 10:52:06.00ID:???0515nobodyさん
2014/05/15(木) 11:08:32.04ID:???俺も思うな。
一人で開発したことしかないからか、
前に戻したくなることなんてまず無い。
毎回、add、commitする手間の方が面倒な気がするけど。
ただ、いつでも何処にでも戻せる安心感ってのは大きいのかもしれない。
dropboxでも戻せるけどどこに戻せば良いのかすらわからない。
0516nobodyさん
2014/05/15(木) 11:14:00.56ID:???別人だけど、中身ってコードのこと言ってるんだろ。
テストが完璧な仕様を表したものだと仮定すると、
テスト通りに動く限りは、実装コードはいくら変えても構わない、という理屈。
テストコードの方も変える必要がない(というか、変えたら同一の保証ができなくなる)。
もっとも、リファクタリングの過程で、新しいクラスやインターフェースを追加、とかなることが多いから、
その場合は、テストも変えていく必要はあるけど。
0517nobodyさん
2014/05/15(木) 11:25:10.47ID:???まあ趣味で小規模のものならそれでもいいのかな…
0518nobodyさん
2014/05/15(木) 11:31:50.75ID:???一人で開発を数年やってるが仕事でも個人サービスでもgitは重宝してる
過去ログとして何をやったかが残ること。
複数同時に機能開発ができること。
gitなしにはもう生きられない。
テストはControllerのテストは書かない。
それより下位層は書いてる。
自分が書いたコードを忘れたころに重宝してる。
他の機能実装のために、さらに下位層を変更したときに重宝してる。
デプロイツールもなしには生きられんな。
0519nobodyさん
2014/05/15(木) 11:48:03.50ID:???残念ながら商用で10以上の製品を扱ってるんだ・・。
gitの前にSubversionを勉強したこともあったけど、
バージョン管理の利点があまり思いつかないんだよな。バックアップ以外で。
マイナーアップデートしてそれをgitで管理する程度ならいいだろうけど、
開発してたら頻繁に更新するわけだろ?コード間違えも多々ある。
なのに、どのタイミングでadd、commitするか分からんし、
毎回してたら515が言うように面倒だ。
0520nobodyさん
2014/05/15(木) 11:52:50.01ID:???例えばこの2ちゃんの掲示板。
名前とメールアドレスと本文入れて投稿すれば掲載される。
この一連の処理が正しく行われるかのテストを書くわけだろ?
で、そこに「画像を追加できる」という機能が加わったとする。
コントローラーとモデルとビューにコードを追加し、テストも書き直すよな?
なら、またテストのやり直しだ。
0521nobodyさん
2014/05/15(木) 12:25:34.42ID:???テストにもいろいろ種類があるが、ここで書け書け言われてるのは、
単体テストと呼ばれるやつな。
で、単体テストの場合、一連の処理をテストするんじゃなくて、
機能単位でテストする。
俺も理解は甘いから、機能単位と言い切って良いのかわからないけど。
なので >>509 のようなメソッドは、戻り値だけに着目すればよくて、テストが書きやすいんだけど、
コントローラーのテストはちょっと書きにくい。
コントローラーのメソッドはアクションで、実行されたあとの結果がいろいろあるからな。
0522nobodyさん
2014/05/15(木) 12:37:38.37ID:???あえて掲示板ということで、CommentsControllerのaddメソッドのテストで考えてみると
1 必須項目を省いてPOSTしたら、書けてない事
2 書き込み成功していいPOSTなら、書けてる事
3 名前を省略したら「nobodyさん」になる事
もっとあるとは思うけど、addメソッドのテストとして、こんなのを確認するテストを書いたとする。
「画像を追加できる」機能が必須項目じゃなければ、「画像を追加できる」を実装した後も、
このテストは3つの部分は期待通りに動いてることを確認できると思う。
で、画像を追加する投稿についてのテストをいくつか追記して、機能追加が完成できる。
この場合あくまでテストは追記だから、テストは書き直しとは言わないと思う。
画像が必須項目だったとしたら、1と2は書き直しになっちゃうだろうけど、これも微修正って範疇じゃないかと。
0523nobodyさん
2014/05/15(木) 13:17:55.24ID:???commitやマージが便利そうだな。
0524nobodyさん
2014/05/15(木) 13:33:34.19ID:???物凄く分かりやすい!参考になった。
つまり、その1〜3をこれまではブラウザでいちいち実行してたのを
テストコードさえ用意しておけば、自動で成否を出してくれるって事だよね?
それならテストを追加する意味もあるし、すごく便利だと思う。
0525nobodyさん
2014/05/15(木) 16:23:27.92ID:???伝わったようで何よりだけど、あげておとすようで悪いが、
質問してた人が言ってたようなデメリットもやっぱりあるよ。
実装が大きく変われば、さすがにテストも修正というより書き直しになるし、
あとさっきも書いたけどコントローラーはテスト書きにくい。
仕様変更で実装が大きく変わりやすい箇所でもある。
あと >>522 この例でいうと、「画像を追加できる」機能を追加した際、
ぶっちゃけテストなんてなくても1〜3は壊れないような実装になりそうな気がすごいする。
俺としては >>509 のような、ユーティリティ的なライブラリが、テストも書きやすいし恩恵も多いと思う。
実際困ったから書いたんだけど、時間というテストがめんどくさいデータで、
結局動作確認するには、4時丁度とその前後や、逆に0時丁度やその前後を引数に、呼んでみるしかないから、それってテストコードだしな。
で、ユーティリティだからサービスのいろんな箇所で呼ばれてて、ミスったときの影響範囲も広い。
なので、テストコードがないと、修正に及び腰になってしまう。
0526nobodyさん
2014/05/15(木) 16:45:41.71ID:???なんかよく分からなくなってきたな・・・。
コード書いて「こういうイメージ?」って聞こうとしたんだけど、
どう聞けばいいからすら分からず、固まってしまったよw
0527nobodyさん
2014/05/15(木) 19:50:47.49ID:???0528nobodyさん
2014/05/15(木) 19:53:03.77ID:???ちなみにCakePHPにテストという機能がちゃんと用意されてますよ?
だからその事について話し合っているんですよ?
0530nobodyさん
2014/05/15(木) 20:53:28.94ID:???http://book.cakephp.org/2.0/ja/development/testing.html
0532nobodyさん
2014/05/16(金) 13:54:12.18ID:???composerについて教えて下さい。
0533nobodyさん
2014/05/16(金) 14:02:22.96ID:???0534nobodyさん
2014/05/16(金) 14:26:46.96ID:???autoload処理までしてくれるもの
packgistに登録されているものの他に
gitやsvnとかで管理されているもの
zip等で落としてくるもの、PEARとかも管理できる
依存関係の解決や、バージョンアップの追従とかが簡単にできるのがいいね
更新時にスクリプト動かしたりもできるから、さらにいろいろ使えるよ
0535nobodyさん
2014/05/16(金) 14:41:38.71ID:???0536nobodyさん
2014/05/16(金) 21:57:48.54ID:???■ このスレッドは過去ログ倉庫に格納されています