【PHP】フレームワーク CakePHP 17ホール目【v2.4】at PHP
【PHP】フレームワーク CakePHP 17ホール目【v2.4】 - 暇つぶし2ch175:nobodyさん
14/03/31 21:19:58.42
汎用性はあまり考え過ぎない方がいい事のが多いけどね。
クラス名やメソッド名をBusinessLogicとかexecuteとかにしてあとあと泣くのは自分。

176:nobodyさん
14/03/31 21:29:42.21
>>174
規則については書いてないかな。
もっといえば、命名についてだけ書いてあるわけじゃない。
けど、読みやすいコードに、よく考えられた変数名は重要だし、
4部のうちの1部は命名に関してだよ。

URLリンク(kadoppe.com)

自分は読み途中だからてきとうに見つけた感想文でもはっとく。

自分が読んだとこまでの感想としては、
読んだところで悩まずに書けるようにはならないかな。
けど、納期に追われておざなりになるところだし、
読めばちょっと自分で気を使っただけだと、
気を配りきれない要素を拾えるんじゃないかなと思っている。
あくまでリーダブルコード。設計については書いてないよ。

177:nobodyさん
14/03/31 23:45:02.75
ストアドプロシージャとか実行するにはどうすれば良いの?

178:nobodyさん
14/04/01 00:05:45.77
>>175-176
Cakeの場合、ある程度の決まり事があるのでだいぶ楽なのですが、
やはり、自分で納得行かないコードのまま進むことがあります。
かといって、他人のコード見ても分かりやすいとは思わないし。
(有名所のOSSのソースしか見てませんが

とりあえず質問した件は、inquiry_repliesにしてみます。

179:nobodyさん
14/04/01 00:36:15.98
>>177
ベタ書きして Model::query()


すまん、本当は俺もよく分からん

180:nobodyさん
14/04/01 00:50:20.63 lnxBtai1
うんごぶりぶりんこ!!!!ドビュビュビュビュドバババババブッ!!!
ドリュルリュルウリュリィブブブブブブッッ!!!!あへあへうんこまん!!!ぶりっちょ!!!
ケツの穴からドババババババババッバwwwwwwwwwwwwWWWW
wwwwwwwwwwww
WWWwwwwwwwwwww??? ? ? ? ? ? ? ?????     ????????wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
なお、まにあわんもよう

181:nobodyさん
14/04/01 07:10:33.33
只働きだろうと持ち出しだろうと、働かなきゃ空白期間だよ
それをちゃんと理解しているなら浪人生活なり語学留学なり存分に楽しんだらいい

182:nobodyさん
14/04/01 09:58:54.32
なぜこのスレなんだw

183:nobodyさん
14/04/02 05:14:01.71
↓の方法で、ControllerからModelにアクセスすると
public function hoge() {
 $this->loadModel('Hoge');
 $Users = $this->Hoge->find('all');
}

このようなエラーが表示されてしまいます。
Missing Datasource
Error: Datasource class Mysql could not be found.
Datasource is not found in Model/Datasource package.

↓の中には"empty"というファイルしか入っていないのですが、
cakephp\app\Model\Datasource

やはり何かファイルが足りないのでしょうか?

184:nobodyさん
14/04/02 06:25:25.12
>>183
cakephp/lib/Cake/Model/Datasourceにあるっしょ。

Missing Datasourceになる理由は、情報不足でよくわからんけど。

185:nobodyさん
14/04/02 11:09:44.80
フォームヘルパーのnameが
data[Post][test1]
のラジオボタンがあるとします。

idが、PostTest10、PostTest11、PostTest12となってしまうのですが、
これをPostTest1_0、PostTest1_1、PostTest1_2
みたいにする事って出来ないのでしょうか?

186:nobodyさん
14/04/02 13:11:18.07
2、3人での小規模開発では使う必要無いですよね?自分でライブラリ作った方が

187:nobodyさん
14/04/02 13:32:26.95
1人だけどCake使ってるよ。
自分でも作れるけど、車輪の再発明みたいな感じで面倒だし。

188:nobodyさん
14/04/02 13:53:48.92
必要かと聞かれればその人次第だけど、
1人でも3人でもCakePHP使うよ。
3人のうち2人がほかのフレームワークに慣れてるなら、それに合わせるけど。

189:nobodyさん
14/04/02 15:43:50.23
>>187
色んなもの開発して行くうちにそれなりにライブラリは出来て行くから再発明にはならないでしょ
自分で同コストで出来ることをフレームワーク習得にさらに時間費やすならその理由が無いと

少人数小規模すぎると効率化のメリットよりも、処理の重さや習得の手間、細かい所に手を入れ出すと途端にコストが増す、無駄にシステムが大きくなるとかのデメリットのが目立つよね

190:nobodyさん
14/04/02 16:12:41.55
>>185
自動で振られるIDは制御不可能です。
FormHelper をオーバーライドしてカスタマイズするしか無い。
個別に指定するなら第二引数のidキーで指定できます。

191:nobodyさん
14/04/02 16:16:36.30
>>189
Zendみたいなライブラリの寄せ集め的なFWだと
他のプロダクトでも流用できたりするけど、
CakePHPとかはFWに拘束されてしまうからな。
もっと結合度の低い構成にしてほしいとは思う。

192:nobodyさん
14/04/02 16:21:34.23
>>186
人数は関係ないと思うよ
理解程度と何を作るかによる

一部分しか使わないときにはCakeは使わないな

193:nobodyさん
14/04/02 17:26:18.77
>>189
後半2行はCakeだろうとオレオレだろうと一緒じゃね?
開発人数や規模が変われば冗長化するのは当然じゃん。
なら、みんなで共有・共通事項で合わせられる、
Cakeのような既存のFW使うほうが、よっぽど効率がいい

194:nobodyさん
14/04/02 17:33:22.17
ファイル数個で済むようなちょっとしたアプリなのにcake使ったら、久々にソース読んだ時とかに絶対無駄に分かりづらくなる

195:nobodyさん
14/04/02 18:00:04.95
全くのPHP初心者がCakeはじめるならそうなるだろうけど、
経験者ならFW使う前に自作ライブラリ作ってるだろうし、
ファイル数個で済む程度のアプリなら、それ使えば良いと思うが。

196:nobodyさん
14/04/02 21:01:45.37
少人数だからとオレオレでやってたとこに途中参加する人のことを考えてあげてください。
CakePHPは完璧でもないし、すこし合わないプロジェクトな事もあるけど、
CakePHPであると言うだけで、それに慣れてる人を探すことができるよ。
オレオレに慣れてる人は、今いるメンバーだけだよ。

本当にちょっとしたものなら、自作ライブラリでもいいけど、
今ならComposerでライブラリとってきて、必要なとこだけ自分で書くのがいいと思うよ。

197:nobodyさん
14/04/02 21:31:51.71
cake使っててテーブルの値勝手に全部消去された事あるんだけど
あれなんなの仕様?

198:nobodyさん
14/04/02 21:37:35.82
cakeは遅いからな。下手なものには使えない

199:nobodyさん
14/04/02 22:21:06.03
>>184
あ、そっちにおいてあるんですね。
Datasource class Mysql could not be found.
って書いてあるから、てっきりファイルが何か足りないのでは?と思っていました。
もう少しソースを見なおしてみます。

>>186
1人だけど使ってます。MVCを楽にやりたかったから。

200:nobodyさん
14/04/02 22:34:26.36
>>197
それだけじゃ分からん

多対多のリレーションテーブルの属性値が消されたとか?

201:nobodyさん
14/04/03 00:25:42.94
>>198
これよく分かんない。
CakePHPがボトルネックになって要求満たせなかったことが無いんだよねぇ。

202:nobodyさん
14/04/03 00:46:56.03
>>201
お前の会社がオーバースペックのサーバ納品してボッてるだけだろ

203:nobodyさん
14/04/03 02:21:11.20
>>202
サーバー安いしねぇ。
運用コストも含めて、要求以内だよ。
チューニングの余地は、アプリケーションのコードにもインフラ構成にも、普通に残ってると思うけど。
サーバー代が1割2割減ったところでたいした額じゃない。
それより、開発・保守開発が効率よくできるほうが、開発費がかからなくてありがたいね。

204:nobodyさん
14/04/03 08:59:09.29
cakeは開発工数の少なさ、技術者の安さはトップクラスだから開発費は安いんだよな。
前も上がってたけど、ソーシャル系は厳しいな。用途次第ってことだ。
ボトルネックの経験がないところには発注するのは怖いな。ネックになった時に投げ出される可能性が高いってことだろ?

205:nobodyさん
14/04/03 10:11:20.11
なのに、市場ではボトルネックを一切無視して、価格競争してるからな

206:nobodyさん
14/04/03 14:48:37.49
それでいいんじゃね。
パフォーマンスとかうるさく言うんなら、FWやORMはおろか動的言語使うこと自体が要件に合ってないだろ。

207:nobodyさん
14/04/03 15:13:32.96
>>203
インフラ代がいくらのレンジの話よ?

208:nobodyさん
14/04/03 15:28:38.04
1000円以下

209:nobodyさん
14/04/03 16:46:48.77
>>204
ボトルネックの経験って?

210:nobodyさん
14/04/03 19:56:07.66
>>197
俺も前なった
1.3のいくつかの時までのバグだったから
今はもう起きないんじゃないか?

211:nobodyさん
14/04/03 20:11:13.79
関係ない話で申し訳ないが、
2ch乗っとられたってマジらしいな

2chドットsc に移行するらしいが、
'2ch' . '.sc' ってのをNGワードにしているらしい

212:nobodyさん
14/04/03 23:37:19.01
>>207
数万~数十万/月
ってところだね。

213:nobodyさん
14/04/03 23:41:04.71
どれどれと思ってやってみたら

ERROR:さくらが咲いてますよ。

ってなって書き込みできんかった。
どうでもよかったけど、サーバー側でNGワードとかされると引くわ・・・

214:nobodyさん
14/04/04 15:29:28.73
>>212
人件費込み?

215:nobodyさん
14/04/04 19:02:20.90
そうだよ

216:nobodyさん
14/04/05 00:43:47.97
>>214
人件費は入ってないよ。
インフラが得意でインフラ方面のタスクをよくやってる人はいるけど、
インフラだけやってるって人はいないからね。
ただ、自分たちで何でもやらないとなものもあれば、
ある程度は作業を依頼できるインフラ屋さんに頼んでるのもあったから、
そういう場合は一部入ってると言えるかもしれない。

217:nobodyさん
14/04/05 16:20:54.14
>>214
数万で込とかw

218:nobodyさん
14/04/05 23:26:04.89
開発費は人件費だから
込みじゃないと比較できんな

219:nobodyさん
14/04/06 01:43:29.71 Iec7CVL5
Cake3 触った人いる?

さっきちょっと見てみたんだけどさ、Model の扱いがぜんぜん違うんだな。

これ Cake2 から移行するのって最初から作るのと同じぐらい大変かもしれないな。

というか、それ以上に苦労するかもしれないな。

220:nobodyさん
14/04/06 03:31:19.46
>>218


221:nobodyさん
14/04/06 04:05:49.26
>>219
> さっきちょっと見てみたんだけどさ、Model の扱いがぜんぜん違うんだな。
やっとあるべき姿になったという感じだよね
元々Railsにインスパイアされてできたはずなのに、配列で返ってくるところは絶対変だったよな
まぁ、PHP4に引きずられたんだろうけど…

222:nobodyさん
14/04/06 10:13:55.10
人件費込みのインフラ費が
一人月超えてくると
開発費との比較が必要になってくるな

それまではcakephpで悩まんな

223:nobodyさん
14/04/06 20:45:00.75
今日は寒いな
まだストーブが要るとは思わんかった、灯油がもうないよ…

224:nobodyさん
14/04/07 10:47:00.11
フォームのidを手動でCake式に変換する方法(関数)ってありますか?
test_hogeというnameならTestHogeにするみたいな

225:nobodyさん
14/04/07 18:57:19.67 LGjnvRjr
>>224
FormHelper::domId()

226:nobodyさん
14/04/07 19:46:25.07
>>225
思い通り出来ました!ありがとうございました。

227:nobodyさん
14/04/08 11:37:39.61
チェックボックスを使ったバリデーションで質問です。
ルールを以下のようにしているのですが、
'rule' => array('multiple')
チェックボックの値に0がある場合、1つ選択しただけではfalseになります。
0という値を許可するには、独自バリデーションを作る必要があるのでしょうか?

228:nobodyさん
14/04/08 14:29:13.60 DFrq8Phr
>>227
Validation::multiple() を見たら、

$check = array_filter((array)$check);
if (empty($check)) { return false; }

ってなってるから、ここで弾かれちゃうんだね。
フィールドの値を変更するか、自作するしか無いね。

コールバック渡せるように作ってくれれば良いのになぁ。
Cakeは、この辺の中途半端な不自由さが結構あるんだよな。

229:nobodyさん
14/04/08 14:55:21.04
>>228
わかりました。自作します。

半角英数字のチェックを配列対応してなかったり、
確かに不自由さは多いですね。

230:nobodyさん
14/04/08 22:23:04.86
>>229
checkboxは他のtypeと違って1個もチェックしないと、空文字列すら送らないんだよね。
なのでFormHelperでチェックボックスを生成した場合、hidden value="0"がチェックボックスと一緒に用意される。
だからバリデーションもそれにあわせて、0は真偽でいうと偽の値になってるんだ。
オレオレフレームワークからCakePHPに乗り換えたときは、そういうところに押し付けがましさを感じていたけど、
慣れてしまえばまぁ合理的かなと思うよ。
チェックボックスをDBにあるマスターテーブルから生成するような場合(割とよくあると思う)、
valueはそのテーブルのidにするのが自然だし、idは1から始まるのが基本的だからね。

なので、CakePHPで開発していくなら、バリデーションを自作するより、
チェックボックスのvalue="0"は未選択とするように、変更するのをお勧めするよ。

231:nobodyさん
14/04/09 10:48:16.40
バリデーションで便乗質問ですが、
名前の姓・名のように、1つの項目で2つの入力箇所がある場合、
バリデーションはどうすればいいのでしょうか?

フォームのnameが
姓:data[User][name][sei]
名:data[User][name][,mei]

として、これ自体のバリデーションは独自関数を作れば出来ますが、
個別にエラーを出力することって出来ませんよね?
例えば「姓が未入力です」「名を日本語で入力してください」
とか出力したいのですが、validateのルール指定では
名前(name)に対する指定で、その下の連想配列に対する
姓(sei)や名(mei)には指定できないです。

232:nobodyさん
14/04/09 11:56:22.61
cakeでも2.4.7でauthコンポーネント利用して認証入れてますが、
f5連打でセッション切れ起こしませんか?
ググって調べてでてきた情報で

Config/core.php最下部に

Configure::write('Security.cookie', 'cakephpfdebackend');
Configure::write('Session.checkAgent', false);
Configure::write('Security.level', 'low');

を追記してますが効果無し。
IE、FireFox、Chrome全てでセッション切れます。
2.3時代からcomposerでアップデートして現在最新ですが
2.3時代でも起きていたように思います。

開発途上段階でaclを入れようと、
alaxos/aclプラグインを導入しましたが、
設定画面で全てのアクションに対するRoleごとの権限をajaxで取りにいく部分があって、
既存のアクションが50はあるので、Role3つ*50で150回のajaxリクエストが走りますが
この途中で確実にセッション切れを起こしてしまい、困ってます。
セッション切れが起こるタイミングはまちまちで、リクエスト回数によるものではなさそうです。
$this->Auth->allow()を置いて認証を使わないようにしないと設定できない状況です。

何か手がかりになりそうな情報はないでしょうか?

233:nobodyさん
14/04/09 12:49:01.33
>>231
バリデーションもだけど、その構造だとsave()できなくないか?

姓:data[User][sei]
名:data[User][mei]

どういうテーブルスキーマか知らんけど、普通にこれでいいんじゃないの?

234:nobodyさん
14/04/09 13:22:45.53
>>233
beforeSaveで1つのnameにするので大丈夫かと思います。

単純にsei、meiを分ける方法が一番簡単だと思うのですが、
日付のフォームとか、Cakeは連想配列で管理しているので
同じように[name][sei]と出来れば良いなと思っています。

235:nobodyさん
14/04/09 21:52:21.95
>>232
どう?
URLリンク(www.matomater.com)

236:nobodyさん
14/04/10 06:44:41.50
>>234
でも日付って、年月日で別個にバリデーションできたっけ?
日付としてひとまとまりだったような気がしたけど。
日付はそのままsave()出来るような気がしたけど、これって特殊だよね。
日付で出来る事だからといっても、その辺CakePHP内であまり汎化されてないような気がする。

まぁdata[User][name][sei] でポストするのはうまくいくとしたとしても、
バリデーションはすっきりとは行かないんじゃないか?

237:nobodyさん
14/04/10 09:24:25.58
>>236
確かにそうですね。
それに年月日の場合、個別にバリデーションする必要無い気もします。
単に「日付が正しくありません」というメッセージを出せば
年が抜けてるのか月が抜けているのか関係無いような。

でも、この辺がもう少し柔軟性あればいいですよね
やっぱりフォーム側を[name_sei]のように変えるしか無いんですかね・・・

238:nobodyさん
14/04/10 10:57:39.51 ekNccxsF
>>237
バリデーションしてから beforeSave 出来るわけだから、
スキーマを name にして、ルールを sei, mei の2つにする。
んで、 beforeSave で値を結合すれば良いんじゃない?

ただ、バーチャルフィールドを使わない理由は?
name を1フィールドにしなくてはならない要件があるの?

239:nobodyさん
14/04/10 11:10:48.64 ekNccxsF
え、dateフィールド見たいにフォームで name の下に作ってるのか!

>>236 の言うように date や datetime は
Model で各要素を個別に扱えるようには作られてない。

240:nobodyさん
14/04/10 11:12:27.99
あ、 何も考えずに age てた。sage にした方が良かったんかな

241:nobodyさん
14/04/10 12:41:05.32
>>235
情報ありがとうございます。
if(!isset($_SESSION)) session_start();
を試したところ、セッションは切れないのですが
CAKEのセッション機構の設定が全部死んでしまいました。
これで解決させるとまずそうです。

最初からやっとけという話ですが、
CakeSessionを追ってみたところ、Session.autoRegenerateがtrueの場合
ある一定数のリクエストがあるごとにセッションIDを変更しており、
その変更のタイミングで同時リクエストが走ると
そこからセッション切れが発生する事がわかり、
autoRegenerateをfalseにして解決しました。

242:nobodyさん
14/04/10 14:11:17.70
Cakeのセッション周りは昔から謎の挙動をするよな
詳細は忘れてしまったけど、要注意だ

243:nobodyさん
14/04/10 14:21:07.20
そういうのがあるからフレームワークは怖い
Strutsみたいのだとまた違うけれど

244:nobodyさん
14/04/10 14:33:01.94
>>237
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');
でもいけたような気がする。たぶん

245:nobodyさん
14/04/10 14:37:55.60
Cakeで一番困ったのは>>197のバグでテーブル全部消されたこと

246:nobodyさん
14/04/10 15:58:45.85
てか、そんなこと1回もなったことないけど、
ほんとにそんなバグあるの?

247:nobodyさん
14/04/10 16:11:15.52
bakeしてんだけどviewだけが何故か生成されない
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] >

の後で終了して、何も起きない

248:nobodyさん
14/04/10 16:11:16.67
本当なら使用しているバージョン、どんなコードで再現したかなど
詳細を書いてほしいものだ
レスがなければ嘘だと判断していいと思う

249:nobodyさん
14/04/10 16:13:07.05
>>246
WHERE 1=1 でDELETE発行するバグが1.3.4まであった
URLリンク(web.archive.org)
ググれば過去スレも出てくるよ、12ホール目

250:nobodyさん
14/04/10 18:03:59.14
興味あったんで本当にテーブル削除されることがあるのか試してみた
以下のコードをコントローラのアクションに入れて実行
$this->テーブル->delete();

バージョン 1.3.2 1.2.8 1.2.0 のいずれも発生しなかった
>>249の提示した記事は英語なのであまり深くは読めていないが
ライブラリのmodel.phpを修正して$model->exists()をコメントアウトしてみたところ、
一応再現はできた

まとめると
①モデルのexistsメソッドをidが指定されていなくてもtrueを返すように上書き
②モデルのdeleteメソッドを引数なしで実行
したときに DELETE FROM `テーブル` WHERE 1 = 1
が実行される(もちろん全テーブルじゃなくて1テーブルだけだが)
まあほとんどの人には縁のない現象といえるかな
もっと単純に再現できるコードがあるのなら提示してほしい

251:nobodyさん
14/04/10 18:47:46.61
beforeDeleteはどこいった

252:nobodyさん
14/04/10 19:06:10.92
普通に使ってるだけで起きたんだよなあ。
古いことなので今更調べる気にはなれない。

253:nobodyさん
14/04/10 20:45:55.49
なるほどね、よくわかった
オラクルとかのトリガーでも自テーブルへの処理は参照すらできないから
記事のbeforeDeleteのような実装は単なるコーディングミスと判断していたよ
普通の処理とみなす人もいるってことね

254:nobodyさん
14/04/10 20:58:33.13
Cakeに限らずだが、FMって問題が起きた時に
その原因を突き止めるのに苦慮することが多いよね

255:nobodyさん
14/04/10 21:09:13.27
そんなことよりbakeできなくて困ってるんですが

256:nobodyさん
14/04/10 21:58:13.10
FMってなんだ

257:nobodyさん
14/04/11 21:38:10.95
フォームヘルパーの月(month)とday(day)って
どうして「01」と「1」に分かれているんですかね?
値はどちらも0が入っているのに

258:nobodyさん
14/04/15 08:59:05.93 eAedbEAo
バリデーションルールで「url」を使うと、日本語が通らない?
そういうもんなの?使えねーじゃん

259:nobodyさん
14/04/15 12:13:57.73
ちょっとハマったので情報投稿します。

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名にドットを入れないほうが良いみたいです。

260:nobodyさん
14/04/15 14:27:17.30
>>258
そもそもURL中のマルチバイトはURLエンコードしないとRFC的にだめなんじゃない?
違ったっけ?

261:nobodyさん
14/04/15 15:56:03.67
>>258
ためしてみたけど普通に使えたよ
使ったバージョンは2.4.6
App::uses('Validation', 'Utility');
debug(Validation::url('http://ほげ.com/漢字.htm'));
結果はtrue

262:nobodyさん
14/04/15 17:25:40.94 eAedbEAo
まじ?こっちは2.3.8でダメだった
バージョン上げてみようかな

263:nobodyさん
14/04/15 18:29:39.18
$this->User->id = $id;
$user = $this->User->read();

みたいな書き方って、あんまりやらない方が良いみたいだね。
この後にsave(更新)したら、request->dataに無いカラムも更新しようとして
空更新されて焦ったわ

264:nobodyさん
14/04/15 23:31:53.92
>>263
readなんて使ったことないなー。

265:nobodyさん
14/04/16 13:37:09.77
Shellファイルをブラウザ上から確認する方法って無いですかね?
いちいちサーバにアップしてSSHからコマンド実行して~
というのが面倒に感じまして。簡単に実行確認出来る方法があれば教えて下さい。

266:nobodyさん
14/04/16 15:23:58.68
>>265
できるけど、結構大変だろうなと予測。
というかそもそも設計がおかしんじゃない?
Shellでもブラウザでも呼び出せるタスクを切り離すべきだと思う。

267:nobodyさん
14/04/16 15:28:42.31
>>266
Shell内でコントローラを読み込んでアクションを実行できるんですね。
それならブラウザ上でも確認できるので問題なさそうです。

268:nobodyさん
14/04/16 16:33:30.72
>>267
え、何でそういう方向に行くの?
まぁ、好きにすればいいけど

269:nobodyさん
14/04/16 18:28:16.11
>>268
すまん。何が言いたいか分からん

270:nobodyさん
14/04/16 19:41:36.54
>>266は設計がおかしいんじゃないかとか質問内容からは読み取れないことを
書いているうえに肝心の実現方法を書いていないので不適切な回答だと思うが
>>267の結論はもっと意味不明で全く>>266と噛み合っていないので
>>268で呆れられてしまったということだろう

たぶん>>266が「できる」と書いたのは
execやpopenでcake.shやcake.batを呼び出すことじゃないかと予想してみる
OS依存なので個人的にはお勧めできないが

Shellとコントローラの両方から「標準で」使えるものはモデルだけだと思うよ
コントローラやコンポーネントやヘルパーなどをnewして使うようなやり方は
動作はするかもしれないが正しいやり方とは思えないな

271:nobodyさん
14/04/16 20:07:27.22
横だけど、正しい・正しくないは関係ないと思うけどな。
「正しい書き方ではないけど動作する」なら、それでいいんじゃないか?

こんな事言うといつも「複数で開発する場合は迷惑だ」とか言う奴いるけど、
目的は「動作する」事であり、綺麗なソースを書くことじゃない。

それに複数人で開発するなら
「良い書き方がわからなかったから、この方法にした」
って説明すればいいだけだろ。情報共有しろよ。

272:nobodyさん
14/04/16 20:14:11.37
小難しい話は置いといて、 >>265
Shell で呼び出す処理を別の Model だか Lib のクラスに移して、
ShellからもControllerからも実行できるようにすれば良い

273:nobodyさん
14/04/16 20:39:15.00
Shell使う処理で、Modelだけで済む事って無いと思うんだけどなぁ
よくあるメール一斉送信とかShellで作るけど、
その時の条件分岐やらModelに対する指示なんかはControllerに書くわけで。
メールの送信自体はライブラリ化しても良いと思うけど。

274:nobodyさん
14/04/16 22:05:21.32
テストのためにそういうのが出来ないかって話なんだから正しい必要はないだろ
それができるとテストが便利で実装が楽でバグが減るんだっていうんだから

設計だとか綺麗かどうかとか関係ないだろ

275:nobodyさん
14/04/16 23:00:28.05
いつからテストの話になったんだ

276:nobodyさん
14/04/17 00:07:52.39
テスト機能の事じゃなくて、「試す」って意味の「テスト」じゃないか?

277:nobodyさん
14/04/17 00:13:59.42 SXCfNI/g
大規模なシステムになった場合、PHPデバッガー等を使って
1行ずつステップデバッグ実行をした方が効率が良いものなのでしょうか?

cakePHPとかみたいなFWを使っている場合には
デバッガーがそこまで追い切れるのか若干気になります。

皆さんは、PHPで業務システムを作る時にはデバッガーを使っていますか?
それとも dumpで開発していますか?

278:nobodyさん
14/04/17 00:19:14.66
>>277
人海戦術に頼る。クラウドソーシングとかで安く依頼できるしな。
やっぱ、システムだけで対応しようとすると、何かと抜けが出るよ。

279:nobodyさん
14/04/17 00:26:59.39
自分はeclipseとXdebugを使ってステップ実行できる環境を使ってるよ
ステップ実行といってもすべての行を1行ずつ実行する必要はなくて
処理を追いたいところにブレークポイントをつけておけばいいだけ
ステップ実行するまでもない場合はdebug関数で変数の中身を画面で確認してる

>>261
2.3.8で試してみたらfalseになったんでバージョンが原因みたいだね

>>263
自分もreadは使ったことなかったんで試してみたところ、再現を確認
なかなか嫌な動きだわ

280:nobodyさん
14/04/17 02:16:53.26
スレチだが、新しい方に移動した方がいいの?

281:nobodyさん
14/04/17 06:59:31.54 +GQ/cWTu
CakePHPで複合主キーで構成されるテーブル同士の結合は
どのように実現すればよいのでしょうか?

[テーブル左] 列A*、列B*、列D*、列E*
[テーブル右] 列A*、列B*、列C
 (*は主キー)

のような構成で、
[テーブル左] に [テーブル右] を 列A、列Bをキーとして
列C を外部結合したいと考えています。
$virtualFields で1つにまとめて、$primaryKeyで定義しなす?

282:nobodyさん
14/04/17 09:07:56.95
>>277
デバッカ使ってる

エクステンションでなければ中まで追えるので、cakeも追えるよ

283:nobodyさん
14/04/17 12:22:28.87
特性スープやでぇ

284:nobodyさん
14/04/17 12:35:55.72
特性スープやでぇ

285:nobodyさん
14/04/17 14:12:21.40
>>281

'joins' キーでちまちま作りこんだほうが良い。
というか、以前調べたときはそれしか無理だった。
他に方法あれば教えて欲しい。

Cake3 から複合キー対応らしいけどね。

286:nobodyさん
14/04/17 23:16:01.90
ツリービヘイビアを使ったカテゴリで、
親カテゴリから子カテゴリまで何階層あるか調べる方法って無いですかね?
無限にカテゴリを作れるのではなく、ある程度階層指定したいと思います。
簡単に表示する方法があるなら、エラー判定しやすいのですが

287:nobodyさん
14/04/17 23:45:58.91
親要素の条件は、子エンティティと比較して
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')); // 親の階層数

288:nobodyさん
14/04/18 05:19:37.24
>>285
ありがとうございます
Cake3で対応ですか!期待して待ってます

289:286
14/04/18 10:55:29.76
>>287
以下の様な階層だとして
テスト→子テスト→孫カテゴリ

287さんの方法では、「子テスト」を選ぶと1と表示され、
「孫テスト」を選ぶと2が表示されるなど、1つ上の階層番号しか表示されません。

290:286
14/04/18 10:56:34.64
すみません。2行目を書き間違えました。

テスト→子テスト→孫カテゴリ
ではなく
テスト→子テスト→孫テスト
でした。

291:nobodyさん
14/04/18 13:04:19.06 N7yuefiZ
Cakeをインストールすると最初の画面でSecurity.saltとcipherSeedを変更する様に言われるけど、これは何桁でもいいの?

292:nobodyさん
14/04/18 13:22:10.90
いいよ

293:nobodyさん
14/04/18 13:39:34.12 N7yuefiZ
そうか、ありがとう

294:nobodyさん
14/04/18 13:45:58.83
>>290
じゃぁ1足せよw
「親の階層数」って書いてるじゃん

295:nobodyさん
14/04/19 16:38:03.71 2kVxcvEH
Cake人気ないな…
とうとうCakePHP bake なんたら でぐぐると食べ物のケーキの記事ばかり出てくるようになってしまった

296:nobodyさん
14/04/19 17:11:08.54
ねぇよ

297:nobodyさん
14/04/19 20:27:05.90
Cakeは海外で特に人気ないからな

298:nobodyさん
14/04/19 20:37:49.07
え、国内の方がないと思ってた

299:nobodyさん
14/04/19 20:39:03.09
PHPは日本で特に人気ないけどな

300:nobodyさん
14/04/19 20:57:23.19 2kVxcvEH
そうか?PHPの仕事しか来たことないわ。Rubyとかどこで使ってるの?って感じ

301:nobodyさん
14/04/19 21:42:49.70
>とうとうCakePHP bake なんたら でぐぐると食べ物のケーキの記事ばかり出てくるようになってしまった

どこの検索エンジンだよそれw

302:nobodyさん
14/04/20 01:46:02.06
人気っていうか、すごい使われるけど評価は低いよね。
よく叩かれてる

303:nobodyさん
14/04/20 09:30:13.88
PHPは日本でも使われてるんだが
やっぱり、Ruby、Perlの使われ方度合いに比べると
全然使われてないことになる

304:nobodyさん
14/04/20 09:57:55.62
ruby使ったことないけど、phpとさほど変わらんのでしょ?
最終的には好みの問題みたい。

305:nobodyさん
14/04/20 10:42:30.47
どこが変わらないって言ってるかはわからんが

RailsとCakeの今が、いい意味でも悪い意味でもRubyとPHPの差の一つ

306:nobodyさん
14/04/20 11:18:10.27
利用者が増えるに従ってアンチが増加するのは何でも一緒。
FWは型を提供するものだから、その型が気に入らなければ別のを使うしか無い。
無ければ作るか自分を合わせるしか無い。

明確な問題点があるんだったら、コミュニティに参加して改善を提案してみたことはあるのかな?
他を調査してより良い解決策があるんなら、具体的にその利点をここの読者に教えてあげようとしないのかな?

まぁ、自分一人で決めることも出来ないから、愚痴を言いたくなる気持ちもわかる。

307:nobodyさん
14/04/20 11:24:53.22
>>303
え?
Perlは人口減って、昔から使ってた一部の会社が使ってるばかりだし、
Rubyは最近ようやく増えてきたかなって程度だろ。

308:nobodyさん
14/04/20 11:30:03.25
>>307
海外での人気に比べるとな

309:nobodyさん
14/04/20 12:34:02.33
正直サーバーサイドはFWが何でもいいわ

310:nobodyさん
14/04/20 12:38:12.89
ガラパゴス言語
Perl,Ruby

ガラパゴスFW
CakePHP

って言いたいのか

実際そうだけどな

311:nobodyさん
14/04/20 14:23:15.37
世界的なシェアだと最近はLaravelが一番なんだっけ?
(シェアじゃなくてGitHubの人気だったか?)
あと、YiiとかCIもCakePHPよりは上なんだよな確か。

でもオープンソースだからといってもシェアに関してはプロプライエタリと同じで、
必ずしも良い物が普及するとは限らないよな。

たとえばWordPressみたいに、酷いシロモノでも
マーケティングが勝利するオープンソースもあるし。

312:nobodyさん
14/04/20 15:51:49.84
rubyはネットでは見るけど、現場では全然見ない

313:nobodyさん
14/04/20 17:08:13.64
Yiiは共産圏で人気らしいね

314:nobodyさん
14/04/20 18:32:52.08
>>312
織田裕二みたいですね

315:nobodyさん
14/04/21 09:50:09.63
Rubyって単に取り上げてるブログが目につく(ブクマなどで)だけで
多いと錯覚しているだけだろ?

そら、PHPみたいに成熟された言語より
Rubyのような比較的新しくてそれほど一般化していない
技術のほうが注目を浴びるに決まってるわw
それと混同して「PHPは人気なくなった」とか目論見が甘すぎ

316:nobodyさん
14/04/21 15:57:26.42
RubyもPHPと同時期に出来た言語なんだが

317:nobodyさん
14/04/21 18:53:01.40
ScalaとGoが注目浴びてるな

318:nobodyさん
14/04/25 10:49:57.10
リファラをコントローラーとアクションに分解する機能ってありませんよね?
$this->referer()だと普通にリファラが表示されるだkです。

319:nobodyさん
14/04/25 13:39:29.24 s6GwqSqm
CakeRequest にそれっぽい機能あった気がする

320:nobodyさん
14/04/25 15:10:13.57
Routerクラスがそれを担当している気がする

何を作ろうとしてるのか知らないけど、
リファラを使って何かをする機能ってだけで、ちょっと不穏な空気を感じてしまう。

321:318
14/04/25 16:51:30.47
>>320
管理画面なのですが、例えば削除(delete)する場所って
一覧(index)と詳細(detail)で出来るとします。
削除した後に全部一覧に戻せば良いだけかもしれませんが、
改ページした後に削除した場合、リファラで前の画面に戻したいのです。

つまり、要件として
・一覧から削除 → 前のページにリダイレクト
・詳細から削除 → 一覧にリダイレクト

となります。これをするために、リファラを分析して
「どこのページからのアクセスか?」がわかれば簡単と思い、質問しました。

322:nobodyさん
14/04/25 17:39:22.10
削除なら GET じゃなくて FormHelper::postLink() を使うのが今の標準だと思うんだけど、
その場合なら引数にリダイレクト変数をセットできる。

コントローラ側で汎用的な処理をしたいんならやっぱりリファラでやったほうが良いのかも。

URLの解析は >>320 の言ってる通りRouter::parse()メソッドがある。
ただ、リファラをそのまま渡してもダメで、
アプリケーションのルートからのパスにする必要があったかもしれない。

323:nobodyさん
14/04/27 13:54:25.75
海外の求人ちょっと見たらRailsが多くて驚いた
PHPばっかりの日本はガラパゴスなんかな

324:nobodyさん
14/04/27 15:43:07.45
rails多いといっても
phpのほうがrubyよりは一応多いでしょ

rubyの9割以上の求人がrailsってのがすごいよな

railsだとpostgresql求人増えてるし
cakephp+mysqlのスペックだとガラパゴスになりそうだな

325:nobodyさん
14/04/27 16:13:12.62
せやかて駆動

326:nobodyさん
14/04/27 17:19:21.88
ん? Cakeスレかここ。 phpの安直さは最高! fuelphp使ってる。 確かにCakeはオワコンだな。

327:nobodyさん
14/04/27 18:49:35.25
どこまでいっても、所詮Railsのパチもんだしな。
Djangoとはえらい違いだ。

328:nobodyさん
14/04/27 20:59:13.46
>>326
fuelphpって既に終わってるやん

329:nobodyさん
14/04/27 21:32:10.25
fuelは結局始まらなかったなぁ

330:nobodyさん
14/04/27 21:46:02.47
>>324
herokuのおかげかrailsはPostgreSQL対応が盛んだからな

331:nobodyさん
14/04/27 23:09:38.66 9dL9KMPJ
少し変化あったけど
結局またMySQLだよな

332:nobodyさん
14/04/28 00:46:19.25
日本は逆にRailsかCakeのどっちかになってる気がする
ま、CakeもRailsのパクリなんであれだが

333:nobodyさん
14/04/29 10:06:00.47 uHAmZpKN
脆弱性の緊急パッチが出てるんで
業務で使っている人は早めに当てておけよー。
1.3.x と 2.4.x 両方。

334:nobodyさん
14/04/29 10:12:45.43
まじか、と思って見に行ったら
公式からしてやられてしまったのか?w
URLリンク(cakephp.org)
502 Bad Gateway

335:nobodyさん
14/04/29 10:46:44.84 uHAmZpKN
公式復旧したっぽいね。
ちなみにこの脆弱性報告したのは実は俺。

336:nobodyさん
14/04/29 11:06:47.62
前から気付いてたので、フォーム改ざん検知使ってなかった。

337:nobodyさん
14/04/29 11:19:04.21
英語読めないんだけど、今回は何が問題なの?

338:336
14/04/29 11:26:35.82
家出ちゃったんで確認できないんだけど、今回の修正、別アクションにpostするときでも大丈夫?

339:nobodyさん
14/04/29 11:32:28.27
>>335
クリタタカシさんありがとうございます

340:nobodyさん
14/04/29 11:35:24.45 uHAmZpKN
>>337
SecurityComponent のフォーム改竄防止機能に穴があった。
作りにもよるけど hidden で受け取る id とかを改竄されると、任意のレコードを更新可能。

Model::save() を呼ぶ時に第一引数の $data に更新したいデータだけを渡すか
第三引数の $fieldList を明示的に指定するかしてれば平気。

>>338
別のアクションでも平気。
FormHelper が作る action をセキュリティトークンに入れてるから。
ただ、JavaScript で動的に action を変更している場合はブラックホールに飲まれるかと。

341:nobodyさん
14/04/29 11:38:39.55 uHAmZpKN
>>339
どういたしまして

342:nobodyさん
14/04/29 11:44:15.83
CakeのSecurityComponentっていっぱい穴ありそう
俺が触ってたのは1.3の頃だけど使いたくないと思った

343:nobodyさん
14/04/29 11:46:59.01
すげえ

344:336
14/04/29 11:48:47.49
>>340
ありがとう。これで自作form改竄対策から離れられる。

345:nobodyさん
14/04/29 16:06:25.97
セキュリティトークンどころかformまで今まで自作してたけど
Cake純正のもの使った方が楽なんかな

346:nobodyさん
14/04/29 17:12:05.84
おまえなんでCakePHP使ってんの?

347:nobodyさん
14/04/29 19:09:18.76
昔はもうちょっと使ってる人多かったんだよ
それでメジャーなのかなぁと思って、手を出した
結構色々これで作っちゃったから、以後ずるずる

348:nobodyさん
14/04/29 20:08:51.90
確実に昔よりは使っている人が多いと思うよ

349:nobodyさん
14/04/29 22:33:23.36
少なくとも俺の観測範囲では減っているな

350:nobodyさん
14/04/30 08:44:08.14
ワンオフ型が減り、量産型が増えたから
環境によっては増えたと思い、環境によっては減ったと思う

351:nobodyさん
14/04/30 13:45:58.87
また、アップデートかw

352:nobodyさん
14/04/30 15:08:14.56
う、本当だ

353:nobodyさん
14/05/01 00:53:29.70
なんでもかんでもhappy to announce ってバカみたいだな

354:nobodyさん
14/05/01 02:19:18.51
まぁ、決まり文句だからしゃーないけど、
文言考えるの面倒くさいんだろうな

355:nobodyさん
14/05/02 00:08:32.26
>> 340

これ本当?diffをちょっとみただけだけど、post先のURLを改竄されても通ってたのが、通らなくなってよりセキュアだねってだけで、hiddenの改ざん検知とか関係なくない?

356:nobodyさん
14/05/02 00:25:59.26
嘘だったらこめん。明日よくみてみる。

357:340
14/05/02 00:35:18.90
>>355
本当だよ。
俺が Mark Story 氏に実際の攻撃手順を書いて送ったのが26日。
アップデートが 2.5.0-RC2 に脆弱性のアナウンスなしで反映されたのが27日。
1.3.18 と 2.4.8 にアナウンスありで反映されたのが29日。
かなり深刻な脆弱性だったからこういう日程になったんだけど、
結果的にはミスがあって 2.4.9 が出ることになった。

必ず攻撃が成功するかはサイトの作り次第だけれど、
仕事で使ってるならアップデートした方がいいよ。

358:nobodyさん
14/05/02 00:43:14.81
>>356
今回の問題は、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の改ざんの話は、どういう意図で言ったのか俺もよく関連はわからん。

359:nobodyさん
14/05/02 00:55:27.39
>>355だけど、すまん。意味分かったかも。リリースノート読飛ばしてコミットログしかみてなかった。actionを改ざんすることでSecurtyComponentが丸ごと迂回されるのでhiddenも改ざんできるのね。いや、ソースみてないんでこれも嘘かもしれないけどw

360:340
14/05/02 00:58:57.58
>>359
そういうこと。

361:nobodyさん
14/05/02 15:48:57.61
パンくずリストを作成するHTMLヘルパーって扱いが難しいよね
階層が増えるとビューに余計なコードを書く機会が増える
だからコントローラと独自ヘルパーで何とかしているけど、
手間がかかって仕方がない。

362:nobodyさん
14/05/02 18:24:19.36
cookbookの例にあるようにTreeビヘイビアを使ってLI リストを表示したいのですが、
ビューで表示するときはヘルパーか何か作らないといけないのでしょうか?
以下のようにしたいのですが、generateTreeListでは無理です。

・My Categories
 ・Fun
  ・Sport
   ・Surfing

363:nobodyさん
14/05/02 19:10:49.13
>>362
Treeビヘイビアは不要

Model::find('threaded');
か、
Model::find('all');
したでーたを Hash::nest() で入れ子にする。

364:nobodyさん
14/05/02 20:12:03.57
>>363
すみません、そういう事ではなくて、ビューでの表示です。
ビューで>>362みたいなリスト化して出力するには、
独自のヘルパーを作らなければいけないのか?
他に方法があれば教えてくださいっと言った質問になります。

365:nobodyさん
14/05/02 20:40:21.50
無いよ。

なんでかって言うと、再帰処理したら簡単に表現できるからなぁ。

で、再帰処理するためには入れ子構造に組み直す必要があって、
そのためには >>363 に書いた通りって意味なんだが?

366:nobodyさん
14/05/02 20:42:16.77
とりあえず $Hoge->find('threaded'); で取得したデータをダンプするなりして
よく考えてみ。

367:nobodyさん
14/05/02 21:05:59.69
HtmlHelper::nestedList() ではだめなの?

368:367
14/05/02 21:46:37.32
ごめん。
HtmlHelper::nestedList() に渡すには TreeBehavior だと自力で整形しないと駄目なんだね。
CakeDC の Utils プラグインにある TreeHelper::generate() なら >>362 の要求を満たせる。

369:nobodyさん
14/05/02 21:48:33.85
>>367
HtmlHelper::nestedList() に渡すには
単純な入れ子構造にしておかないとだめ。

Model::find('threaded'); で取得したのはそのまま使えないと思う。

いったん Model::find('all'); で取得したデータを
Hash::extract() で階層を浅くして、それを
Hash::nest(); を使って組み直すなどの手間を掛けないと使えないんじゃないかな。

370:nobodyさん
14/05/02 21:49:26.87
あ、かぶった。すまん。

TreeHelper なんてあるの知らなかった。
一度見てみるわ。

371:nobodyさん
14/05/02 22:02:34.68
いえいえ。
実は俺もわりと最近知った。

372:362
14/05/02 22:29:38.32
>>365-371
皆さんありがとうございます。素直に自作ヘルパー作って
配列を再帰して表示することにします。

373:nobodyさん
14/05/08 16:22:29.68
フィールド名がemail以外の時ってemailバリデーション効かなくない?
サンプルコード漁ったらさらっと書いてあるけど動かない…

374:nobodyさん
14/05/08 17:05:11.16
>>373
$validateの配列の書き方間違ってない?

375:373
14/05/08 17:40:55.81
すまんちゃんと効いてた。これsave時にfalse返すんだな。
他のバリデーションと同様にPOST前にポップアップで教えてくれるかと思ってた。

376:nobodyさん
14/05/08 21:14:06.37
え?そんな機能あったか?

377:373
14/05/08 22:24:36.95
POST前ポップアップってこれのことね。
URLリンク(cdn-ak.f.st-hatena.com)
もしかして俺何か勘違いしてるかな…

378:nobodyさん
14/05/08 22:33:24.56
ブラウザさん

379:nobodyさん
14/05/09 00:28:49.07
ブラウザが出してるやつかな

380:nobodyさん
14/05/09 00:37:04.59
>>378-379
マジかwwChromeww本当にありがとうw

381:nobodyさん
14/05/09 04:21:32.04
HTML5の話題でひとくくりにされてる最近のブラウザの機能やね。
CakePHPもFormHelperがそのための属性を出すようになったりはしてるけど。

382:nobodyさん
14/05/09 10:16:45.79
クライアントバリデーションに任せっきりになってしまって、
悲惨なサイトが続出するような悪寒。

楽だし負荷軽減できるしで、いいことずくめなんだけど。

383:nobodyさん
14/05/09 10:59:15.63
そうだね。悪い奴がいないと助かるんだけどね。

384:nobodyさん
14/05/09 11:01:33.24
Controllerでバリデーションしなくて
Modelに移動するいい傾向になるだけでないかな?

385:nobodyさん
14/05/09 13:43:36.22
いい傾向ってなんだ?

386:nobodyさん
14/05/09 13:51:32.25
Fat Modelのことかと思われ

387:nobodyさん
14/05/09 14:56:57.61
サーバーサイドのバリデーションをしなくていいわけじゃないから、負荷軽減にならなくね?
ちゃんと機能するようにつくれば、無通信でユーザーに間違い見せれて、
使いやすくいフォームにはなると思うけど。

388:nobodyさん
14/05/09 15:49:02.85
ブラウザで弾いておいたらサーバー側での試行回数は減るだろ。
正常系の負荷はもちろん変わらんけど。

389:nobodyさん
14/05/09 18:26:07.60
初心者なんすけど
モデルの使い道がよくわかんないっす。
何から何までコントローラーで処理しちゃってモデルはスッカラカンです。
どなたかモデルの使い道というか便利さを三行で説明しなさい。

390:nobodyさん
14/05/09 18:27:49.70
>>387
HTTPの勉強をもっとしましょう。

391:nobodyさん
14/05/09 18:46:15.86
>>389
俺も初心者だからよく分かってないが、
コントローラはモデルに作ったメソッドを呼ぶだけで、
ざっくりした条件分岐のみにとどめておくと後から非常に見やすい気がする。

392:nobodyさん
14/05/09 20:58:13.09
やりすぎると Very Fat Model になってそれはそれで見難い
バランスというかセンスが問われる部分

393:nobodyさん
14/05/09 21:01:03.07
>>389
単に好みの問題だから好きにすればいいんじゃないかな
モデルはどこからでも使える上にシングルトンっぽくインスタンスが1つだけなので
共通っぽいメソッドやクラスを実装するのにも使える

394:nobodyさん
14/05/09 21:32:58.38
ああそうか、モデルはなんとなくテーブルに紐付くものみたいに思ってたが
ロジック処理だけのモデルがあっても良いよな

395:nobodyさん
14/05/10 01:47:38.21
>モデルはなんとなくテーブルに紐付く

これは常にRORと、その派生のCakePHPに対する批判として挙げられてるね。
本来のModelとは全然違うって、激怒しているブログがあちこちにある。

なお、CakePHP3では大幅に改善されるみたいです。

396:nobodyさん
14/05/10 07:20:47.11
>>388
ああ、まぁそりゃそうか。
といっても、負荷対策が必要な状況では、効果的な対策になるほどは減らないとは思うけど。

397:nobodyさん
14/05/10 10:46:10.10
Cakeはエンティティを入れるのが遅すぎた

398:nobodyさん
14/05/10 10:53:41.99
URLリンク(tech.itandi.co.jp)

1,3は同意できるところだが
2は会社のエンジニアレベルが低いとでも言いたいのか

399:nobodyさん
14/05/10 11:01:56.24
周りがCakePHPはRailsのパクリだっつーから使ってみたら
ActiveRecordの超絶劣化っぷりにびびった

Railsも似非MVC2になりがちだけどCakeはそれ以前に
オブジェクト指向設計に真っ向から喧嘩売ってるレベル

400:nobodyさん
14/05/10 12:53:17.49
そうやって批判する奴って何も具体的な事言えない奴ばかりだよな
実際どのくらいのスキルある奴なんだろう

401:nobodyさん
14/05/10 14:23:07.62
Composerは確かにほかの言語のと比べて使いにくい印象はあるけど、
git submoduleしないとパッケージのバージョンを管理できないなんて、
なに言ってるかわからないレベルなんだが。
そんなことあるんかね?

402:nobodyさん
14/05/10 15:56:06.47
お前らのMVCは間違ってる!ってRails式を散々disるスライドがあったが
ものがちゃんと作れれば別にいいわけで、正しいからどうだってのがよくわからん

403:nobodyさん
14/05/10 17:17:38.04
>>400
DBから取ってきたデータがarrayになってる部分だと思われ
Cake3でようやくオブジェクトになるようだが

404:nobodyさん
14/05/10 17:24:14.35
それよく聞くけど、オブジェクトの方が便利なん?
書き方が変わるだけのような気がするけど

405:nobodyさん
14/05/10 17:30:12.91
Cake3を少し試してみたがEntity使えるだけでも結構変わるね
特にViewがスッキリするのはもちろんだけど今までHelperやControllerに溢れがちだったロジックもEntityクラスに置けるのが結構あるしテストも楽
array+Hash・Setに比べたら開発効率やコードの読みやすさは段違いに上がる


でも2から3への移行は大変そう

406:nobodyさん
14/05/10 17:30:20.29
>>404
Modelのメソッドはすべてstaticです、なんて言ったらJavaやRubyなどのオブジェクト指向に
慣れ親しんだ人たちから見れば、なにそのふざけた設計は?とキレられるレベル

407:nobodyさん
14/05/10 17:37:51.74
オブジェクトじゃないとActiveRecordパターンとは言えないからなぁ

408:nobodyさん
14/05/10 20:22:57.11
arrayになった理由はCake1がPHP4をサポートしていたからだろうな
さすがにPHP4でオブジェクト指向にはできなかった、と

409:nobodyさん
14/05/10 23:47:42.75
PHP4懐かしいな
修飾子やら例外やらオートローダーが無いとか
参照渡ししないとクローンになるとかいろいろあるが
ActiveRecordの足かせになりそうな制約はないな

410:nobodyさん
14/05/11 13:33:38.34
最近、嫌static厨が多くて困る

411:nobodyさん
14/05/11 13:37:57.50
static に出来るものはそのほうが良いのにね。
見極めができないんかもな。

412:nobodyさん
14/05/11 15:03:25.90
「全部static」はさすがに嫌われて当然

413:nobodyさん
14/05/11 15:07:39.63
さすがにそんなヤツはおらんやろ

414:nobodyさん
14/05/11 15:08:05.37
staticとかpublicとか分別するとどんなメリットがあるの?もうおっさんだから、今だにわからない。
function hoge を _hogeにする時はあるけど。

どなたかご親切な人
わかりやすく教えてくれませんか?

415:nobodyさん
14/05/11 15:18:12.11
>>413
CakeのModelはまさに「全部static」なんだが…

416:nobodyさん
14/05/11 15:37:28.00
>>415


どこを言ってるんだろう

417:nobodyさん
14/05/11 15:40:10.91
ん、Model.phpを「static」で検索してみたけどひとつもヒットしないよ
調べたverは2.4.6
cake3ではstaticになっているってこと?言葉の使い方がヘンなだけ?

418:nobodyさん
14/05/11 18:47:27.75
>>398
> つまり結局はタイミングの問題でしかなくて、言語の優劣がどうとか、フレームワークの優劣がどうとか、といった観点は殆ど無く選びました。
つまり結局は、他に行ったから、とりあえず元鞘を叩いておくかっていう3流エンジニアの日常か

419:nobodyさん
14/05/12 01:19:34.02
>>414
それマジで質問してるならこんなところにいないで
基本的なオブジェクト指向の勉強したほうが良いよ。

420:nobodyさん
14/05/12 01:30:03.56
>>414
static のメリットをひとことで言うと、状態を持たない(状態が変化しない)
振る舞いを提供することにより、インスタンス化した場合に本来であれば考慮するべき
状態変化の副作用から開放されることではないかと。

まず間違いなく、テストは超簡単になる。

一方、アクセス修飾子のメリットはひとことで言うと
安全な設計が簡単にできるってことではないかと。
その点 CakePHP はメンバー変数の修飾子に public を使いまくってて恐ろしいほどではある。

421:nobodyさん
14/05/12 01:35:05.49
俺もstaticって使いどころがいまいちわからん。
特にphpはランタイムが短すぎて、1回しか使わないオブジェクトが多く、
staticを変に意識すると、むしろなんでもstaticでいいんじゃないかと思えてきてしまってこわい。
逆にstaticにしないと困るような事も、あんまないから、よくわからないままで結局staticは使わないという

>>414
たとえばモデルに、とある機能を作ってたら100行を超える長いメソッドになってしまい、一部を切り出したけど、
コントローラーから直接切り出したメソッドを呼ばれるのは想定外って場合に、
protectedかprivateにしておけば、呼ばれることがない。

protectedとprivateは、コントローラーやモデルを触ってるくらいなら、
正直使い分けが活きることがほとんどない気がする。
強いて例を出すと、AppController内の処理で切り出したメソッドが、ほかのコントローラーから呼ばれるのが想定外なら、
privateにしておくと呼ばれなくなる。

422:nobodyさん
14/05/12 01:45:18.99
>>421
>なんでもstaticでいいんじゃないかと

だけどオブジェクトの状態に依存しないメソッドなんて
そうそう作る機会はないと思うんだが、
もし可能なら作って問題無いと思うんだけど?
というか、むしろ作るべき。

423:nobodyさん
14/05/12 02:01:04.78
>>422
もちろん、思えてきてしまうだけで、よく考えるとダメな事がほとんどなんだけどね。
クラスやメソッドを書き始めるときに、まずこれはstaticにできるか?
と考えると、問題ないような気がしてしまうんよ。

そういえば、かなり昔だけどCakePHPを使い始める前のオレオレフレームワークでは、
データベースアクセスするとこ全部staticメソッドにしちゃってたなぁ。
いわゆるCRUDに対応したメソッドがあるだけだったし、データはオブジェクトじゃなくて連想配列だったから、
インスタンスいらないなぁと思って。
あとバリデーターもstaticメソッドだったなぁ。
バリデーションはコントローラーでやってたから、CakePHPでいうバリデーションルールの配列みたいなのは、
コントローラーに書いて、AppController的な親にvalidateメソッドを作ってた。

424:nobodyさん
14/05/12 02:19:15.31
このスレにはガチのstaticおじさんが居る気がする

425:nobodyさん
14/05/12 04:23:13.01
cakeってfindがstaticでないのが不思議でしょうがない

426:nobodyさん
14/05/12 10:30:47.47
>CakePHPのModelはまさに「全部static」

言いたいことは何となく分かる
他のフレームワークだとModelのstaticメソッドがテーブル(Repository)の操作
インスタンスメソッドがレコード(Entity)ごとの操作に対応してるのが多い

CakePHP2まではEntityがないので
そういう他のFWから入ってModelのインスタンスはEntityだろと決めつけてかかると
ModelにRepositoryの要素しかなくてfindもインスタンスメソッドという点に違和感をおぼえる

CakePHP3だとEntityクラスとTableクラスがそれぞれ用意されるからギャップが減る
クラスが分かれるからfindがインスタンスメソッドなのは変わらないけど
DDDを意識した設計で個人的には好感触


というか他のFWのstaticなfindも
RepositoryないしQueryに相当するオブジェクトのインスタンスメソッドに処理放り投げてるだけだろうし
ただ単に使い勝手とどこまでFWが暗黙的に処理するかってだけの問題な気がする

427:nobodyさん
14/05/12 10:33:48.09
>>425
状態依存しないメソッドなら問題ないけど
CakePHP の Model のオブジェクトって状態を持ってるから無理だよ。

たとえば同じPostクラスのオブジェクトが2個あったとして
$Post1->id = 1;
$Post2->id = 2;
ってした場合にメソッドが static なら破綻する。

428:nobodyさん
14/05/12 10:36:05.68
>>426
なるほど

429:nobodyさん
14/05/12 10:47:42.76
>>427
findと何か関係あるのそれ?

430:nobodyさん
14/05/12 11:14:24.54
cakeってTable Data Gatewayパターンだと考えれば普通なんだけどな

431:427
14/05/12 11:59:05.87
>>429
例えを簡単にするつもりだったが $id は関係無かったか。
要するに find が参照するプロパティのうち
状態依存のものが沢山あるってこと。

例えば
$Post1->primaryKey = sid;
$Post2->primaryKey = cid;
とか

432:nobodyさん
14/05/12 12:02:34.37 U9jrOtar
TreeBehaviorsについて質問なのですが、

moveUpやmoveDownがfalseを返してきてまったく動作しません。
発行したSQLを見ると、SELECT文ばっかりでUPDATEをやっていないように見えます。
どうやったら動かすことができるのでしょうか。

433:nobodyさん
14/05/12 12:18:35.60
>>432
スキーマ、レコード、moveUp moveDown のコード、クエリ
この辺を貼り付けてみて

434:nobodyさん
14/05/12 12:38:18.89
CakePHPって3でActiveRecordを採用するんだったよな

435:nobodyさん
14/05/12 13:15:30.27
>>433
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);
}

436:nobodyさん
14/05/12 13:24:21.16
>>431

CakePHPのモデルが状態を持ってることが、むしろ混乱の元になってる気がするけどな。
ループ内でsaveするならcreateしろ、とか。
結局find()したら連想配列を返すし、save()だってモデルにデータ持たせたりせずsave()に引数渡すことばかりじゃない?
よく使うfindとsaveで違和感を感じるだけで、インスタンスである必要な機能もあるけど。

まぁ言いたい事はたぶん >>426 と似たようなことなんだろうけど、
ほかのフレームワークをあまり触ってないから、違和感レベルでしか語れない。

437:nobodyさん
14/05/12 13:36:54.55
>>435
じゃぁ、verify() した結果を見たらヒントがあるかも

debug($this->Category->verify());

どこかで整合性が崩れてると実行されない可能性有り。

438:nobodyさん
14/05/12 13:49:48.47
>>437
ありがとうございます。試してみました。

verify()でしばらくかかりましたが、真っ白な画面がリターンされました。
これはツリーに不整合などの異常がなかったということですよね。

439:nobodyさん
14/05/12 14:00:55.26
>>438

時間かかってなおかつ白い画面ってことはタイムアウトですね。
かなり大きいんですね。
成功すれば bool(true) が返る。

Shell でやってログに書き込んで確認してみたらいいかも。

440:nobodyさん
14/05/12 14:03:28.70
タイムアウトで白い画面って・・・もしかして本番環境・・・?

441:nobodyさん
14/05/12 14:04:31.37
TreeBehavior 適用してるテーブルに他のモデルから更新したら
整合性グチャグチャになるから注意

442:nobodyさん
14/05/12 14:10:08.15
>>439
ありがとうございます。お察しの通りノードが3万以上あるツリーなのです。
白画面はタイムアウトですか。勉強になりました。

TeraTermからサーバにログインし curl コマンドでverifyのURLにアクセスしましたが、
ブラウザから呼んだ時とは違い、瞬時にプロンプトが返ってきてしまいます。

シェルでverifyを実行とは、具体的にはどうすればいいのでしょうか?

443:nobodyさん
14/05/12 14:11:10.17
>>440
いいえ、本番のデータをまるまるコピーしてきましたが、デバッグ環境です。

444:nobodyさん
14/05/12 14:12:13.34
>>441
他のモデルからTreeを適応しているテーブルには書き込みしに行っておりません。

445:nobodyさん
14/05/12 14:13:55.11
debug=2でタイムアウトしたら

Fatal error: Maximum execution time of 30 seconds exceeded in

ってでないっけ?

446:nobodyさん
14/05/12 14:15:27.41
>>445
Configure::write('debug', 2);

でやりましたが、白画面でした。

447:nobodyさん
14/05/12 14:27:56.28
Console/commant/VerifyHogeShell.php

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 の作り方・使い方はぐぐれば幾らでも出てくる

448:nobodyさん
14/05/12 14:31:07.10
>>442
cURLからアクセスしても最大実行時間は一緒だ。
コンソールからPHPプロセスを利用しなきゃ。
php のユーザーが誰かってことが抜け落ちてる。

449:447
14/05/12 14:32:38.76
1行目ミスった

>Console/commant/VerifyHogeShell.php

Console/Command/VerifyHogeShell.php

450:nobodyさん
14/05/12 14:37:04.67
>>447
>>448
ありがとうございます!
AppShellなるクラスが用意されていたのですね。知りませんでした。
さっそく試してみます。

451:447
14/05/12 14:41:43.59
TeraTerm ってことは Windows か。
わかってるだろうけどコマンドのディレクトリセパレータは / じゃなくて \ な。

452:nobodyさん
14/05/12 15:16:40.76
>>447
>>448

verify()をShellから実行した結果、180超のエラーが出力されました。
特に多いのは index missingというやつです。
recover() で回復できますでしょうか?

453:nobodyさん
14/05/12 15:22:02.02
>>452
以前自分も同じようになったときは、
recover()で上手く言った場合とそうでない場合とがあった。

上手く行かなかったときは時間もなかったんで、
独自でスクリプト書いてで lft と rght を振り直した。

すまんが深く探ってないんで、それ以上詳しいことはよく分からん。
一度やってみろとしか言えない。

454:nobodyさん
14/05/12 15:24:38.22
あと、verify() でエラーが出たってことは
これからも同じ問題が発生するおそれがあるんで、
更新処理を全て点検したほうがいいな。

テストを良く書けているかどうかで、こういうときに大きく差が出る。

455:nobodyさん
14/05/12 15:27:51.20
Treeビヘイビアを使ってカテゴリ管理って難しいよね。
不特定多数のカテゴリを扱うとかなったら、
今回のような問題が起きてしまう可能性があるし

456:nobodyさん
14/05/12 15:28:47.24
連投すまんが、今の状態だと recover 走らせる時もめちゃくちゃ時間かかるはずだから、
必ず Shell から実行すること。
更新中にタイムアウトなんかしたら(特にMySQLのMyISAMなどは)やっかいなことになる。

457:nobodyさん
14/05/12 15:35:37.85
>>455
入れ子集合モデルは更新コストが激高だからな。
場合に応じて使い分けるしか無いと思われ。

458:nobodyさん
14/05/12 15:38:35.35
>>453-456

アドバイスありがとうございます。
>これからも同じ問題が発生するおそれがあるんで、
お客が不正に行ったデータのInsertなどが原因だった可能性もありますが、
プログラムのほうも確認しておきます。

recover()もShellから実行しました。案外完了が早かったように思います。
今2度目のverify()です。

459:nobodyさん
14/05/12 16:13:23.60
>>453
verify()でtrueが返りました!
moveUp()をあるノードで実行して結果をdebug文で出すとtrueが返りました。
しかし、treeには何の変化もなし!ノードの位置は一切変わっていません。
なぜなのでしょうか・・・。

460:459
14/05/12 16:28:51.15
連投で申し訳ありませんが、moveUp(), moveDonw()の仕様を根本的に勘違いしていました。

bookを読むと 同じ枝の中で順番を上に上げるのがmoveUp()なのですね。

僕はそもそもmoveUp()したノードは「一つ階層を上がって、今までの親ノードと同じ階層に来る」
ということを実現するものなのかと勘違いしておりました。

申し訳ありませんでした。しかしverify, recoverをshellから実行するなどの貴重な情報が得られて
感謝です。

461:nobodyさん
14/05/12 16:30:16.90
階層を変えるなら parent_id を変更する

462:nobodyさん
14/05/12 16:31:48.27
>>461
そうですよね。
しかしparent_idを手でいじって、lft, rghtがそのままで良いのかというのが気になる点です。

463:nobodyさん
14/05/12 16:32:41.62
>>460
ちょっと興味あるんだが、レコード何件あんの?

464:nobodyさん
14/05/12 16:33:45.39
>>462
>parent_idを手でいじって
ちがーーーう!
TreeBehaviorが効いてるモデルでやるんだよ!!

465:nobodyさん
14/05/12 16:38:21.01
>>463
3万件超あります。

>>464
もちろん、DBから直接parent_idを変えたりしませんよ。
CakephpのEdit画面(もちろんTreeのモデルのもの)から変えます。

466:nobodyさん
14/05/12 17:32:11.61
>>463
んん、3万件オーバーでTreeBehaviorか。。。
ブラウザからの更新はちょっとキツイかもな。

467:nobodyさん
14/05/12 17:34:01.92
>>465
>CakephpのEdit画面(もちろんTreeのモデルのもの)から変えます。

なら問題なく lft, rght 変更してくれる。
っつーか、それがTreeBehaviorの仕事だからな。

468:nobodyさん
14/05/12 17:45:37.30
改めて思うけど、カテゴリの設計って難しすぎるな

469:nobodyさん
14/05/12 17:54:12.62
>>466-468

ありがとうございます。
parent_idを変更すると、思っていた階層の移動が完了できました。ご迷惑をおかけしました。

カテゴリはこれからも増えていく可能性があるので、
このままTreeBehaviorを実装していて安全なのかちょっと心配しています。

親子関係を実現するには普通にHABTMでもいいのではないかな、と思いましたが、
設計段階でTreeの採用が決まっていたので、これで作ってしまっています。
データ件数がでかくなった今、非常にデリケートなデータ構造なんだな、と改めて認識しております。

470:nobodyさん
14/05/12 18:14:56.49
>>468
さらにそれを管理してくのが苦痛。

471:nobodyさん
14/05/12 18:30:07.53
>>469
親子関係でHABTMってどうやるんだ

472:nobodyさん
14/05/12 19:01:06.74
>>471
・categories
・articles
・category_articles(中間テーブル)

みたいなテーブルを作る

473:nobodyさん
14/05/12 19:02:02.02
ごめん。中間テーブルの名前を間違えた。
categories_articlesだったかな。

474:nobodyさん
14/05/12 19:42:05.93
>>471

Categoryモデルの中に

public $belongsTo = array('Parent' => array('className' => 'Category',));
public $hasMany = array('Children' => array('className' => 'Category'));

と二つ記述するやりかたですかね。
それを最初に思いついたのです。
しかしTreeのほうが上ではないかという意見が出たため、そっちを採用しました。

475:nobodyさん
14/05/12 19:50:22.00
>>471
だからHABTMじゃないですね。ごめんなさい。
言うならばHas Many and Belongs to Oneでしょうか。

476:nobodyさん
14/05/13 16:37:41.63
ありゃ、もう2.5.0出たのか。
なんか最近CakePHPのバージョンあがるの早い気がするけど、気のせいか?

477:nobodyさん
14/05/13 16:39:47.73
>>476
年取っただけだと思う。
時代の流れが早く感じるよな。

478:nobodyさん
14/05/13 16:44:46.95
2.6も予定されてるのかよ。
さっさと3出して、2は打ち止めでいいだろ。

479:nobodyさん
14/05/13 17:43:09.45
今のCakeって$usesに書いてあるモデルは実際使われるまで読まれないんだよね?
ということは存在する全モデルを常に書いてもいいってこと?

480:nobodyさん
14/05/13 18:12:50.09
ぜんぜん良くはねーと思うが、負荷にはならんだろうな

481:nobodyさん
14/05/13 22:34:11.52
>>479
「今の」ってバージョンいくつからそうなったの?

482:nobodyさん
14/05/13 22:43:15.01
2.x

483:nobodyさん
14/05/14 00:35:48.56
サンクス。普段は2系使ってるから特に問題ないな

484:nobodyさん
14/05/14 02:38:22.28
プログラミングするとき3行毎に動作確認しないと
不安で死ぬやつって俺だけ?

485:nobodyさん
14/05/14 04:51:26.28
3行は短すぎるが、ちゃんと小さい処理単位でメソッドを分けておけば、
まとめて動作確認してもデバッグしやすいよ。
あとはテストを書け

486:nobodyさん
14/05/14 07:02:10.89
そんなあなたにテストファースト

487:nobodyさん
14/05/14 10:05:36.21
ぶっちゃけ、テストの利点が分からないの俺だけ?

488:nobodyさん
14/05/14 10:09:17.84
さすがに君だけじゃない?

489:nobodyさん
14/05/14 11:29:01.43
最初のうちは、いまいちわからんかもね。
インターフェースのテストで、mockの使い方がわかってくるようになると、考え方が変わるかも。

490:nobodyさん
14/05/14 12:33:17.82
>>489
俺も教えて欲しいんだけど
テスト書くのが面倒
テスト自体信用できない
書いてもやっぱり最初から書きたくなる
って思ってしまうんだけどそれでも書いた方がいいと思う?

できるプログラマーの人はみんな書いてるよね。

491:nobodyさん
14/05/14 12:42:45.04
>>490
結論としては書くべきでFA
そのことがわかるには経験が必要
てことだと思う

492:nobodyさん
14/05/14 12:51:30.16
サービスが稼動を始めてから、数ヶ月経った後くらいに、
誰かのひどいコードを見つけた時、
テストを書いてあれば・・・と思うよ。

493:nobodyさん
14/05/14 13:38:02.11
view (.ctp) ファイルのテストってどうやってやるんだろう。

494:nobodyさん
14/05/14 14:02:28.89
そこまでテストする必要があるのかはよく考えたほうが良いように思えるけど、
やるならSelenium使うんじゃない?

495:nobodyさん
14/05/14 14:08:25.34
テスト=コードが正しく動作するか確かめる

ではないんだよね?これはブラウザで確認すればいいだけだし、
大体はコード書いた後に実行して確かめているだろ。

具体的にどういう場面でテストが必要になるの?

496:nobodyさん
14/05/14 17:09:00.17
ユニットテストとユーザテストごっちゃにしている時点でなんだかな。

497:nobodyさん
14/05/14 17:52:25.48
>>495
> 大体はコード書いた後に実行して確かめているだろ。

一度書き捨てて終わらせられるなら誰も書く訳がない
改修は何度も発生する=確認も同じだけ発生する=クッソ面倒
だから面倒な確認を自動化するためにテストを作るんだ

498:nobodyさん
14/05/14 20:45:44.91
というよりさ!
まずテストコードってなんなの?
console.log()とは違うの?

499:nobodyさん
14/05/14 21:02:32.76
お前のテスト(むしろconsoleデバッグ?)
→ 逐一人の手で実行して人間がブラウザやconsoleに表示された値やを見て想定したものかどうか確認する
   自動化できてない
   複数の関数やメソッドが絡むとバグの原因の特定がしづらい

他の皆の意図するテスト(単体テスト)
→ それぞれの関数やメソッドが複数の引数のパターンに対し適切な返り値を返したり
  例外やエラーを吐いたりなど仕様通りの挙動をするかを確かめるコードを書く
  検証する対象が小さいので比較的簡単に書けるし自動化も容易い
  プログラムの小さい単位の動作をあらかじめ保証しておくことで
  後の複数の関数やメソッドが絡むテストの際にもバグの原因の特定がしやすくなる


面倒だから単体テストでググれ

500:nobodyさん
14/05/14 21:19:27.30
さっぱり意味が分からん

501:nobodyさん
14/05/14 21:51:05.96
例えば「足し算」ていうメソッドを作成したとする。
これは引数に例えば「1と2を入れると3が返る」というもの。

1「テストを書かないやりかた」

こんな簡単なメソッド、どうやってもミスるわけない。
とりあえず作る。最初に動くか確認する。
動いた・・・終わり

2「テストを書くやりかた」

「1と2を入力すると3が返る」というテストを書く。
開発しながらテストを走らせて正常か確認する。
テストが異常なら、異常がなくなるまでプログラムを修正する。
これをずっと繰り返す。

3「テストを先に書くやり方」

2のテストを先に書く。メソッドは空からスタート。
テストが通るまで開発を行う。

502:nobodyさん
14/05/14 21:56:32.40
console.logは、phpでいえばvar_dumpとかになるなんだろうが、
使うときにコメントイン/アウトしなきゃいけないし、消し忘れるとそれがそのまま出力されて大変なことになる(センシティブな情報だったら・・・)。

503:nobodyさん
14/05/14 22:52:25.27
上司がテストケース書いて、部下にそれに合うようなコードを書かせるってのなら良いと思う。

ただcakephp1が2になったりするとテストも書き直しだよね。
結局テスト書いてもそれ以上にプログラムの進歩が速いような気もするんだよね。

ちなみにヤフーとかって10年前くらいにcgiをphpに書き直したみたいなこと聞いたけど、あれ以来書き換えてないのかな。

それとも地道に書き換えまくってるのかな?

504:nobodyさん
14/05/14 23:08:58.07
>ただcakephp1が2になったりするとテストも書き直しだよね。

いきなりスパン長い話になってね?

ビジネスロジックまで全部変わるわけじゃないんだからテストコードも一部はそのまま使えるでしょ
テストコードまったくなしに書きなおすよりはいくらか書きやすいと思う

505:nobodyさん
14/05/14 23:36:50.08
>>499の説明で合ってるんだが、何がわからないのかわからない

506:nobodyさん
14/05/14 23:52:50.14
>>504
ありがとう。そういうメリットもあるんですね。

>>505
わからない人にとっては全くわからないんだよね。テストケースのメリット。


俺、gitもテストケースも使ったことないというか使えないので勉強します。

507:nobodyさん
14/05/15 00:48:57.49
なんだかんだ言って教えるのなw

508:nobodyさん
14/05/15 01:04:25.59
経験ないとわからないかもしれんね
愚者は経験に学ぶと言うけど人間なんて全員愚者だから、がんばって経験を積もう

509:nobodyさん
14/05/15 02:16:19.81
>>495
こういう >>492 時に必要になるんだよ。

例えば1日の区切りが0時じゃなく4時なサービスがあるとしよう。
DateTimeオブジェクトや日時の文字列を受けて、何日かを返すメソッドがあるんだけど、
中身を見たらこりゃひどい実装だなという時、
テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。

510:nobodyさん
14/05/15 03:48:38.98
お前ら俺が以前テストの質問した時はスルーしたくせに
テストの話題で盛り上がりやがって

511:nobodyさん
14/05/15 04:08:36.66
>>510
たぶんそれから必死で勉強したんだよ

512:nobodyさん
14/05/15 10:33:38.61
>>509
>中身を見たらこりゃひどい実装だなという時、
>テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。

ここが想像できないんだよ。中身(モデル?)が酷い実装っていうけど、
前は動いてたんだよな?それを変更する時に「酷い」が分かるんだろ?

なら、テストも書き直しだと思うんだよ。俺も>>503と同じ疑問を持ってる。
Cakeのバージョンアップではなくとも、仕様が変わればテストも変わるでしょ。

513:nobodyさん
14/05/15 10:45:22.44
0か1で考えてんな
少なくとも単体テストしやすいように設計してれば
仕様を変えた部分の他に影響がないことを保証しやすいんじゃないか


テストが書いてない誰かが作ったソフトウェアを改修する時に
あっち変えたらこっち動かなくなったよみたいな経験ない?

514:nobodyさん
14/05/15 10:52:06.00
んじゃあ次はgitってなんなのよ?

515:nobodyさん
14/05/15 11:08:32.04
>>514
俺も思うな。
一人で開発したことしかないからか、
前に戻したくなることなんてまず無い。

毎回、add、commitする手間の方が面倒な気がするけど。

ただ、いつでも何処にでも戻せる安心感ってのは大きいのかもしれない。
dropboxでも戻せるけどどこに戻せば良いのかすらわからない。

516:nobodyさん
14/05/15 11:14:00.56
>>512
別人だけど、中身ってコードのこと言ってるんだろ。
テストが完璧な仕様を表したものだと仮定すると、
テスト通りに動く限りは、実装コードはいくら変えても構わない、という理屈。
テストコードの方も変える必要がない(というか、変えたら同一の保証ができなくなる)。

もっとも、リファクタリングの過程で、新しいクラスやインターフェースを追加、とかなることが多いから、
その場合は、テストも変えていく必要はあるけど。

517:nobodyさん
14/05/15 11:25:10.47
バージョン管理してないとかマジか
まあ趣味で小規模のものならそれでもいいのかな…

518:nobodyさん
14/05/15 11:31:50.75
>>515
一人で開発を数年やってるが仕事でも個人サービスでもgitは重宝してる

過去ログとして何をやったかが残ること。
複数同時に機能開発ができること。
gitなしにはもう生きられない。

テストはControllerのテストは書かない。
それより下位層は書いてる。
自分が書いたコードを忘れたころに重宝してる。
他の機能実装のために、さらに下位層を変更したときに重宝してる。

デプロイツールもなしには生きられんな。

519:nobodyさん
14/05/15 11:48:03.50
>>517
残念ながら商用で10以上の製品を扱ってるんだ・・。

gitの前にSubversionを勉強したこともあったけど、
バージョン管理の利点があまり思いつかないんだよな。バックアップ以外で。

マイナーアップデートしてそれをgitで管理する程度ならいいだろうけど、
開発してたら頻繁に更新するわけだろ?コード間違えも多々ある。
なのに、どのタイミングでadd、commitするか分からんし、
毎回してたら515が言うように面倒だ。

520:nobodyさん
14/05/15 11:52:50.01
>>513
例えばこの2ちゃんの掲示板。
名前とメールアドレスと本文入れて投稿すれば掲載される。
この一連の処理が正しく行われるかのテストを書くわけだろ?

で、そこに「画像を追加できる」という機能が加わったとする。
コントローラーとモデルとビューにコードを追加し、テストも書き直すよな?
なら、またテストのやり直しだ。

521:nobodyさん
14/05/15 12:25:34.42
>>520
テストにもいろいろ種類があるが、ここで書け書け言われてるのは、
単体テストと呼ばれるやつな。

で、単体テストの場合、一連の処理をテストするんじゃなくて、
機能単位でテストする。
俺も理解は甘いから、機能単位と言い切って良いのかわからないけど。

なので >>509 のようなメソッドは、戻り値だけに着目すればよくて、テストが書きやすいんだけど、
コントローラーのテストはちょっと書きにくい。
コントローラーのメソッドはアクションで、実行されたあとの結果がいろいろあるからな。

522:nobodyさん
14/05/15 12:37:38.37
>>520
あえて掲示板ということで、CommentsControllerのaddメソッドのテストで考えてみると

1 必須項目を省いてPOSTしたら、書けてない事
2 書き込み成功していいPOSTなら、書けてる事
3 名前を省略したら「nobodyさん」になる事

もっとあるとは思うけど、addメソッドのテストとして、こんなのを確認するテストを書いたとする。

「画像を追加できる」機能が必須項目じゃなければ、「画像を追加できる」を実装した後も、
このテストは3つの部分は期待通りに動いてることを確認できると思う。
で、画像を追加する投稿についてのテストをいくつか追記して、機能追加が完成できる。
この場合あくまでテストは追記だから、テストは書き直しとは言わないと思う。

画像が必須項目だったとしたら、1と2は書き直しになっちゃうだろうけど、これも微修正って範疇じゃないかと。

523:nobodyさん
14/05/15 13:17:55.24
gitって、dropboxと違い
commitやマージが便利そうだな。

524:nobodyさん
14/05/15 13:33:34.19
>>522
物凄く分かりやすい!参考になった。
つまり、その1~3をこれまではブラウザでいちいち実行してたのを
テストコードさえ用意しておけば、自動で成否を出してくれるって事だよね?

それならテストを追加する意味もあるし、すごく便利だと思う。

525:nobodyさん
14/05/15 16:23:27.92
>>524
伝わったようで何よりだけど、あげておとすようで悪いが、
質問してた人が言ってたようなデメリットもやっぱりあるよ。

実装が大きく変われば、さすがにテストも修正というより書き直しになるし、
あとさっきも書いたけどコントローラーはテスト書きにくい。
仕様変更で実装が大きく変わりやすい箇所でもある。

あと >>522 この例でいうと、「画像を追加できる」機能を追加した際、
ぶっちゃけテストなんてなくても1~3は壊れないような実装になりそうな気がすごいする。

俺としては >>509 のような、ユーティリティ的なライブラリが、テストも書きやすいし恩恵も多いと思う。
実際困ったから書いたんだけど、時間というテストがめんどくさいデータで、
結局動作確認するには、4時丁度とその前後や、逆に0時丁度やその前後を引数に、呼んでみるしかないから、それってテストコードだしな。
で、ユーティリティだからサービスのいろんな箇所で呼ばれてて、ミスったときの影響範囲も広い。
なので、テストコードがないと、修正に及び腰になってしまう。

526:nobodyさん
14/05/15 16:45:41.71
>>525
なんかよく分からなくなってきたな・・・。
コード書いて「こういうイメージ?」って聞こうとしたんだけど、
どう聞けばいいからすら分からず、固まってしまったよw

527:nobodyさん
14/05/15 19:50:47.49
ここはなんのスレですか?

528:nobodyさん
14/05/15 19:53:03.77
スレタイ読めないの?CakePHPのスレですよ?
ちなみにCakePHPにテストという機能がちゃんと用意されてますよ?
だからその事について話し合っているんですよ?

529:nobodyさん
14/05/15 20:27:14.89
>>528
くわしく

530:nobodyさん
14/05/15 20:53:28.94
>>529
URLリンク(book.cakephp.org)

531:nobodyさん
14/05/15 23:34:57.49
>>525
テストコードがないと及び腰ってのすごくわかる。
自分が作ったコードですら触りたくないもん。

532:nobodyさん
14/05/16 13:54:12.18
では、先生方次は最近よく聞く
composerについて教えて下さい。

533:nobodyさん
14/05/16 14:02:22.96
あとで知ったかで話すから、ちょっと勉強する時間をくれ

534:nobodyさん
14/05/16 14:26:46.96
composerは依存する外部のライブラリ等を管理して
autoload処理までしてくれるもの

packgistに登録されているものの他に
gitやsvnとかで管理されているもの
zip等で落としてくるもの、PEARとかも管理できる

依存関係の解決や、バージョンアップの追従とかが簡単にできるのがいいね

更新時にスクリプト動かしたりもできるから、さらにいろいろ使えるよ

535:nobodyさん
14/05/16 14:41:38.71
cakeはcomposer対応がめちゃくちゃ遅かったよな。

536:nobodyさん
14/05/16 21:57:48.54
composerってRubyでいうとこのgem?

537:nobodyさん
14/05/16 22:04:02.91
bundlerかな

538:nobodyさん
14/05/16 22:12:07.93
>>537
なるほど、さんきゅー

539:nobodyさん
14/05/17 02:35:10.07
routes.phpで指定できるURLのパターンに、DBから取得した値を設定することってできる?
例えば、
/domain/DB値 みたいな感じで
ちなみに、1.3系

540:nobodyさん
14/05/17 03:35:24.78
>>539
2系では無理。routes.php のタイミングでは ClassRegistry がロードされていない。
1.3系は分からんが、やってみて確かめてみれば?

541:nobodyさん
14/05/17 03:39:32.10
Model使わずに直接SQL叩けば宜し

542:nobodyさん
14/05/17 05:32:08.69
>>539
うーん、たぶんできるんじゃね?

URLリンク(book.cakephp.org)
まず、カスタムルートクラスを使う。
Cookbookは英語しかないが、これ。

App::uses('CakeRoute', 'Routing/Route');
App::uses('ClassRegistry', 'Utility');
SlugRoute extends CakeRoute{
public function parse($url){
$parse = parent::parse($url);
$hoge = ClassRegistry::init('Hoge');
return $parse;
}
}

こういうカスタムルートクラス書いてみたら、$hogeにHogeのインスタンスがあることまでは確認した。
なお、phpがあるPCと、これ書いてるPHP別なので、上のコードにtypoがあるかもしれない。

カスタムルートクラスでApp::uses('ClassRegistry', 'Utility');することによる弊害があるかどうかは知らない。

543:nobodyさん
14/05/17 11:47:50.48
>>542
それは単にルータのクラスをRouteから変更するだけじゃん。

ルーティングのタイミング(routes.php の読み込み)は一緒だから
Model のインスタンス取得できないんじゃないかってことなんだけど。

544:nobodyさん
14/05/17 11:54:40.61
すまん、言葉足らずだった。
ルータのクラスを変更することは
ここでは問題になってないってことを言いたかっただけ。

で、今 routes.php で App::uses('ClassRegistry', 'Utility');
して Model のインスタンス取得したら問題なく動いたわ。
副作用は知らん。

1.3系は ClassRegistry ってないんだっけ?
途中から出来た?
その辺はよく分からん。

545:nobodyさん
14/05/17 12:16:13.55
WordPressが記事URLのルーティングを管理画面から変えられるけど、
あんな感じにできれば便利だなとは思う

546:nobodyさん
14/05/17 12:21:13.08
確かにそうだよな。
もっと初期段階でモデルにアクセスできる仕組みのほうがいい気がする。
他のFWとかのプロセスってこの辺りどうなってんのかな。
俺はCakeしか知らないから。

547:nobodyさん
14/05/17 12:58:47.14
>>546
全体のローダーとルーティングで制限がかかるローダーはタイミングが別なものが多いよ
前者でモデルの読み出しができれば使える感じ

548:nobodyさん
14/05/17 13:17:23.08
で、結局何が問題なの?

App::uses('ClassRegistry', 'Utility'); で初期段階でモデルにアクセスも出来たし、
あとはカスタムルートクラスで好きなようにパースして返せば、
良い書き方かはおいといて、動きそうな感じはしてるんだけど。

549:nobodyさん
14/05/17 13:46:47.18
うん、行ける気がする

で、>>548 こそ何が問題なの?

550:nobodyさん
14/05/18 01:51:53.74
>>549
質問に対してこれでできんじゃね?って方法を書いただけだから、
こっちに問題はないけど。

551:nobodyさん
14/05/18 02:42:01.29
この板、IDでないから誰が何喋ってんのか全く分からんw

552:nobodyさん
14/05/18 04:33:21.19
ところで、ClassRegistryが出てきたからついでに聞きたいんだけど、
new Hoge()じゃなくてClassRegistry::init('Hoge')が推奨されるのってなんで?

昔コントローラーじゃないところでモデル使うことがある時、
new Hoge()してるって言ったら、だめって言われたことあるんだけど、
まだ初心者だったら理由までは教えてもらえなかったんだよね。
よくわからないまま、ClassRegistry::init()を使うようにだけしてるんだけど、
理由知りたい。

553:nobodyさん
14/05/18 11:39:16.13
newしたら初期化されるじゃん

554:nobodyさん
14/05/18 12:23:32.63
phpunitのテスト駆動開発について。
テストを先に書くということですが、
メソッドを先に書く場合もありますか?

555:nobodyさん
14/05/18 12:34:06.68
また、掲示板サイトを作る場合、
記事を書く
記事を見る
記事を削除

の3つのケースを先に書いてテストし実装する
もしくは一つの機能ごとにテストを書く実装する、のどちらが良いのでしょうか。

556:nobodyさん
14/05/18 18:19:05.82
>>554
テストを先に書くことがテスト駆動開発の必須条件の一つだと思うんだけど、
別に原理原則にこたわることもないと思われ。
ただ、教科書的にはまずテストを書いて赤色から発進するのが通則。

>>555
テスト駆動開発は、一般的にはアジャイル開発の一部とされている
(たぶん、そうじゃない場合もあるはずなんだけどあまり記憶に無い)ので
単純なテストからだんだん複雑にして行くことを前提に、
最初は簡単な「記事を書く」テストを書いて実装して
簡単な「記事を見る」テストを書いて実装して、
簡単な「記事を削除」テストを書いて実装して・・・ってことなんじゃないかな?

だけどそれも程度によるだろうから、最初はざっくりアウトライン的に
全体を作って、作りこむに従って単体テストを増やしていったりテスト自体を
詳細にコーディングするってことでいいんじゃないかな?

557:nobodyさん
14/05/18 18:27:15.17
>>556
ありがとうございます!
勉強になります。

558:nobodyさん
14/05/18 23:31:40.02
まぁ自分で書いておいてこんなこと言うのもあれだけど、
TDDに限らず、ここで聞くより専門の書籍を一冊買って
それを読んで体系から身につけたほうがいい。

559:nobodyさん
14/05/19 16:50:44.06
画像のバリデーションで、画像をアップロードしていない場合は
バリデーション自体を中止したいのですが、良い方法はないでしょうか?
以下のようなルールをモデルに書いています。

'image' => array(
 array(
  'rule' => array('extension', array('jpg', 'jpeg', 'gif', 'png')),
  'message' => '拡張子が違います',
  'allowEmpty' => true,
 )
)

560:nobodyさん
14/05/20 15:39:04.32 RIYxfxGy
hasManyとfindについて質問です。

営業 1-多 顧客
というリレーションがあったとします。
営業 hasMany 顧客 と営業モデルに書いています。

そこで営業コントローラから 「顧客を一件ももっていない営業」をfindする方法がどうしても
思い浮かびません。 

どうかヒントをいただけませんでしょうか。

561:nobodyさん
14/05/20 15:56:13.36
営業 hasOne 顧客 というアソシエーションを一時的に張って、
検索条件を
'顧客.id' => null
とすれば行ける気がするのだがどうだろう。

あと、カウンターキャッシュという裏ワザもあるが、
アプリケーション依存になるんで一長一短。

562:nobodyさん
14/05/20 16:02:52.95
>>561
なるほど!試してみます。ありがとうございます。

563:nobodyさん
14/05/21 16:47:46.18
クックパッドってCake使ってるのかな?
なんかURLのルールが似てる気がする

564:nobodyさん
14/05/21 18:35:00.58
>>563
Railsじゃなかった?今は知らんけど

565:nobodyさん
14/05/21 19:54:17.38
ああ、Railsだから似てると感じるのか

566:nobodyさん
14/05/25 12:26:20.21
cakeとciのActiveRecordって
PofEAAのActiveRecordと違うと思うんだけど。何を元にしてるの?

567:nobodyさん
14/05/25 13:21:00.24
CakePHPにActiveRecordは実装されていない

568:nobodyさん
14/05/25 14:22:54.54
AppControllerを継承したクラスを継承したコントローラで
AppControllerに書かれた$uses、$componentsが使えない(マージされない)問題は
Cake2では直ってるんだっけ?
今確認できないのでどなたか教えてください

569:nobodyさん
14/05/25 16:32:17.75
>>568
Dispatcher でリフレクション呼び出してあれこれゴニョゴニョしてるんで、
多分大丈夫。
正式なアナウンスは知らん。

570:nobodyさん
14/05/26 20:03:50.85
>>568
その問題、今初めて知ったわ。

571:nobodyさん
14/05/26 21:17:51.86
久しぶりに自分が作った1.3のソース触ったけど、糞すぎて情けなくなる・・・

572:nobodyさん
14/05/26 21:34:55.75
オレの1.2のコードをやるから、その汚い糞を拭き取れ。

573:nobodyさん
14/05/28 12:20:55.53
カテゴリの状態を維持したまま別のコントローラーを実行するための
ルーティングってどう書けばいいですかね?

/hoge/ →Categoryモデルのname「hoge」
/hoge/news/ →Newsモデルのcategory_nameが「hoge」
/hoge/news/detail/1 →Newsモデルのidが1でcategory_nameが「hoge」

こういう場合、hogeの箇所(カテゴリ名)が不特定文字列なので
どういう書き方をすればいいか悩んでいます。cake2系です。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch