[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/03 16:30 / Filesize : 202 KB / Number-of Response : 839
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【PHP】フレームワーク CakePHP 17ホール目【v2.4】



1 名前:nobodyさん [2014/03/01(土) 17:03:24.57 ID:8AJ9GD6E]
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです
CakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう

※他フレームワークとの比較等はスレ違いです

■本家
www.cakephp.org/
APIドキュメント
api.cakephp.org/
github - cakephp
github.com/cakephp
the Bakery
bakery.cakephp.org/
Issue
cakephp.lighthouseapp.com/dashboard
CheatSheet[1.2] (PDF)
cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf

■日本語公式
cakephp.jp/
フォーラム
cakephp.jp/modules/newbb/
cookbook(マニュアル)
[2.x] book.cakephp.org/2.0/ja/index.html
[1.3] book.cakephp.org/ja

※前スレ
kohada.2ch.net/test/read.cgi/php/1378659370/

517 名前:nobodyさん mailto:sage [2014/05/15(木) 11:25:10.47 ID:???]
バージョン管理してないとかマジか
まあ趣味で小規模のものならそれでもいいのかな…

518 名前:nobodyさん mailto:sage [2014/05/15(木) 11:31:50.75 ID:???]
>>515
一人で開発を数年やってるが仕事でも個人サービスでもgitは重宝してる

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

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

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

519 名前:nobodyさん mailto:sage [2014/05/15(木) 11:48:03.50 ID:???]
>>517
残念ながら商用で10以上の製品を扱ってるんだ・・。

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

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

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

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

521 名前:nobodyさん mailto:sage [2014/05/15(木) 12:25:34.42 ID:???]
>>520
テストにもいろいろ種類があるが、ここで書け書け言われてるのは、
単体テストと呼ばれるやつな。

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

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

522 名前:nobodyさん mailto:sage [2014/05/15(木) 12:37:38.37 ID:???]
>>520
あえて掲示板ということで、CommentsControllerのaddメソッドのテストで考えてみると

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

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

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

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

523 名前:nobodyさん mailto:sage [2014/05/15(木) 13:17:55.24 ID:???]
gitって、dropboxと違い
commitやマージが便利そうだな。

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

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

525 名前:nobodyさん mailto:sage [2014/05/15(木) 16:23:27.92 ID:???]
>>524
伝わったようで何よりだけど、あげておとすようで悪いが、
質問してた人が言ってたようなデメリットもやっぱりあるよ。

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

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

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



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

527 名前:nobodyさん mailto:sage [2014/05/15(木) 19:50:47.49 ID:???]
ここはなんのスレですか?

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

529 名前:nobodyさん mailto:sage [2014/05/15(木) 20:27:14.89 ID:???]
>>528
くわしく

530 名前:nobodyさん mailto:sage [2014/05/15(木) 20:53:28.94 ID:???]
>>529
book.cakephp.org/2.0/ja/development/testing.html

531 名前:nobodyさん mailto:sage [2014/05/15(木) 23:34:57.49 ID:???]
>>525
テストコードがないと及び腰ってのすごくわかる。
自分が作ったコードですら触りたくないもん。

532 名前:nobodyさん mailto:sage [2014/05/16(金) 13:54:12.18 ID:???]
では、先生方次は最近よく聞く
composerについて教えて下さい。

533 名前:nobodyさん mailto:sage [2014/05/16(金) 14:02:22.96 ID:???]
あとで知ったかで話すから、ちょっと勉強する時間をくれ

534 名前:nobodyさん mailto:sage [2014/05/16(金) 14:26:46.96 ID:???]
composerは依存する外部のライブラリ等を管理して
autoload処理までしてくれるもの

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

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

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

535 名前:nobodyさん mailto:sage [2014/05/16(金) 14:41:38.71 ID:???]
cakeはcomposer対応がめちゃくちゃ遅かったよな。



536 名前:nobodyさん mailto:sage [2014/05/16(金) 21:57:48.54 ID:???]
composerってRubyでいうとこのgem?

537 名前:nobodyさん mailto:sage [2014/05/16(金) 22:04:02.91 ID:???]
bundlerかな

538 名前:nobodyさん mailto:sage [2014/05/16(金) 22:12:07.93 ID:???]
>>537
なるほど、さんきゅー

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

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

541 名前:nobodyさん mailto:sage [2014/05/17(土) 03:39:32.10 ID:???]
Model使わずに直接SQL叩けば宜し

542 名前:nobodyさん mailto:sage [2014/05/17(土) 05:32:08.69 ID:???]
>>539
うーん、たぶんできるんじゃね?

book.cakephp.org/2.0/en/development/routing.html#custom-route-classes
まず、カスタムルートクラスを使う。
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さん mailto:sage [2014/05/17(土) 11:47:50.48 ID:???]
>>542
それは単にルータのクラスをRouteから変更するだけじゃん。

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

544 名前:nobodyさん mailto:sage [2014/05/17(土) 11:54:40.61 ID:???]
すまん、言葉足らずだった。
ルータのクラスを変更することは
ここでは問題になってないってことを言いたかっただけ。

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

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

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



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

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

548 名前:nobodyさん mailto:sage [2014/05/17(土) 13:17:23.08 ID:???]
で、結局何が問題なの?

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

549 名前:nobodyさん mailto:sage [2014/05/17(土) 13:46:47.18 ID:???]
うん、行ける気がする

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

550 名前:nobodyさん mailto:sage [2014/05/18(日) 01:51:53.74 ID:???]
>>549
質問に対してこれでできんじゃね?って方法を書いただけだから、
こっちに問題はないけど。

551 名前:nobodyさん mailto:sage [2014/05/18(日) 02:42:01.29 ID:???]
この板、IDでないから誰が何喋ってんのか全く分からんw

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

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

553 名前:nobodyさん mailto:sage [2014/05/18(日) 11:39:16.13 ID:???]
newしたら初期化されるじゃん

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

555 名前:nobodyさん mailto:sage [2014/05/18(日) 12:34:06.68 ID:???]
また、掲示板サイトを作る場合、
記事を書く
記事を見る
記事を削除

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



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

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

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

557 名前:nobodyさん mailto:sage [2014/05/18(日) 18:27:15.17 ID:???]
>>556
ありがとうございます!
勉強になります。

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

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

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

560 名前:nobodyさん [2014/05/20(火) 15:39:04.32 ID:RIYxfxGy]
hasManyとfindについて質問です。

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

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

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

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

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

562 名前:nobodyさん mailto:sage [2014/05/20(火) 16:02:52.95 ID:???]
>>561
なるほど!試してみます。ありがとうございます。

563 名前:nobodyさん mailto:sage [2014/05/21(水) 16:47:46.18 ID:???]
クックパッドってCake使ってるのかな?
なんかURLのルールが似てる気がする

564 名前:nobodyさん mailto:sage [2014/05/21(水) 18:35:00.58 ID:???]
>>563
Railsじゃなかった?今は知らんけど

565 名前:nobodyさん mailto:sage [2014/05/21(水) 19:54:17.38 ID:???]
ああ、Railsだから似てると感じるのか



566 名前:nobodyさん mailto:sage [2014/05/25(日) 12:26:20.21 ID:???]
cakeとciのActiveRecordって
PofEAAのActiveRecordと違うと思うんだけど。何を元にしてるの?

567 名前:nobodyさん mailto:sage [2014/05/25(日) 13:21:00.24 ID:???]
CakePHPにActiveRecordは実装されていない

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

569 名前:nobodyさん mailto:sage [2014/05/25(日) 16:32:17.75 ID:???]
>>568
Dispatcher でリフレクション呼び出してあれこれゴニョゴニョしてるんで、
多分大丈夫。
正式なアナウンスは知らん。

570 名前:nobodyさん mailto:sage [2014/05/26(月) 20:03:50.85 ID:???]
>>568
その問題、今初めて知ったわ。

571 名前:nobodyさん mailto:sage [2014/05/26(月) 21:17:51.86 ID:???]
久しぶりに自分が作った1.3のソース触ったけど、糞すぎて情けなくなる・・・

572 名前:nobodyさん mailto:sage [2014/05/26(月) 21:34:55.75 ID:???]
オレの1.2のコードをやるから、その汚い糞を拭き取れ。

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

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

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

574 名前:nobodyさん mailto:sage [2014/05/28(水) 12:29:00.97 ID:???]
Router::routes(array('/:category/'), array('controller' => 'categories'));

Router::routes(array('/:category/:controller/'));

Router::routes(array('/:category/:controller/detail/:id'));

でどう?

575 名前:nobodyさん mailto:sage [2014/05/28(水) 12:33:07.08 ID:???]
あと、第三パラメータで正規表現でのフィルタリングができるんで、
3つ目のURLパターンにおいてIDは数値と決まっているなら

Router::routes(array('/:category/:controller/:id'), array(), array('id' => '[0-9]+'));

とすることで

/hoge/news/1

をマッチさせることが出来ると思う。



576 名前:573 mailto:sage [2014/05/28(水) 13:36:48.07 ID:???]
>>574-575
ありがとうございます。この方法ですが、
他のコントローラーと共存させたい場合はどうなるのでしょうか?

/contacts/ お問い合せ用のコントローラー
/faqs/ FAQ用のコントローラー

などがサイトに存在する場合、おかしくなるような気が・・。
そういう場合は、固定のコントローラーを
ルーティングに書いていけばいいんですかね?
Router::routes(array('/contacts/:action'), array('controller' => 'contacts'));

577 名前:nobodyさん mailto:sage [2014/05/28(水) 13:55:25.16 ID:???]
問題ない。
ルーティングは単純な正規表現を先頭からマッチさせていくだけ。
で、最後の最後に通常のマッチングがコアの方に用意されている。

578 名前:nobodyさん mailto:sage [2014/05/28(水) 13:56:01.83 ID:???]
あ、問題あるわ。すまんw

579 名前:nobodyさん mailto:sage [2014/05/28(水) 13:56:49.69 ID:???]
>そういう場合は、固定のコントローラーを
>ルーティングに書いていけばいいんですかね?
>Router::routes(array('/contacts/:action'), array('controller' => 'contacts'));

そうですね。

580 名前:573 mailto:sage [2014/05/28(水) 15:29:39.46 ID:???]
>>579
ということは、固定のコントローラーは全てルーティングに書く必要があるんですね。
そうなるとあまり利便性が良くないですね。

581 名前:nobodyさん mailto:sage [2014/05/28(水) 17:12:42.77 ID:???]
TreeBehaviorのleftとrightってなんなん…これ見ると存在しないid指定してるみたいでわけが分かんないよ…
book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html

582 名前:nobodyさん mailto:sage [2014/05/28(水) 20:12:28.98 ID:???]
>>580
カテゴリ名を自由にするってことは、特定の文字を禁止にするんだろうから、
それを表現できるパターンを第3パラメータに書けば良いと思うよ。
たとえば ["member", "user"] というコントローラを作るんなら

$route = '/:controller/:action/*';
$default = array();
$options = array('controller' => '(member|user)');
Router::connect(compact('route', 'default', 'options'));

あと、アクションを設定しない場合に index を適用させるなら

$route = '/:controller';
$default = array('action' => 'index');
Router::connect(compact('route', 'default'));

を最初に加えておく。

あとすまん、
上で Router::routes() っていうのは Router::connect() の間違いだった。すまん。

583 名前:nobodyさん mailto:sage [2014/05/28(水) 20:13:54.99 ID:???]
>>581
lft, rght はIDじゃないよ。

TreeBehavior のアルゴリズムを理解するのにとっておきの記事
blog.xao.jp/blog/cakephp/understanding-of-nested-sets-model-for-treebehavior-of-cakeph/

584 名前:573 mailto:sage [2014/05/28(水) 20:20:05.04 ID:???]
>>582
ありがとうございます。色々工夫してやってみます。

585 名前:nobodyさん mailto:sage [2014/05/28(水) 22:03:01.32 ID:???]
>>583
ありがとうマジで助かった!



586 名前:nobodyさん mailto:sage [2014/05/29(木) 01:00:35.02 ID:???]
RailsとCakeでMVCを覚えたせいで見事に騙され、モデルはテーブルに紐付くもんと思ってたわ
テーブル関係ないビジネスロジックをどこに書くか迷って、コンポーネントに書いてたけど
モデルに書いた方がいいんだろうか?

587 名前:nobodyさん mailto:sage [2014/05/29(木) 01:27:10.16 ID:???]
>>586
ビジネスロジックをモデルに書くのは常識だ。
コンポーネントに書いたほうが良いなんて聞いたこと無い。
Rails も Cake もその点においては何も騙してねーと思うよ?

588 名前:nobodyさん mailto:sage [2014/05/29(木) 08:11:31.86 ID:???]
テーブルをまたがる共通処理や、似て非なるテーブルに同じ処理をしたい場合に、ロジックを置く場所がないて話だと思うけど。
そういう場合にRailsの1モデル-1テーブル形式は破綻してるのは確か。

589 名前:nobodyさん mailto:sage [2014/05/29(木) 08:25:24.09 ID:???]
「具体的に言うと、モデルはデータベースのテーブルを表しますが」
book.cakephp.org/2.0/ja/models.html
とあるせいで、モデル=テーブルに紐付く(原則として)と思ってたよ
市販の解説書も同じような感じで書いてる

590 名前:nobodyさん mailto:sage [2014/05/29(木) 08:44:24.60 ID:???]
>>587
モデルの中で他のモデルをClassRegistry::initとかやりたくないんだよ
コントローラに書きたくなければコンポーネントになる

591 名前:nobodyさん [2014/05/29(木) 10:03:02.00 ID:veg5U4SW]
じゃあLibに作れよ

Modelじゃだめって理由でComponentに置く発想がおかしい

592 名前:nobodyさん mailto:sage [2014/05/29(木) 10:04:39.91 ID:???]
は?LibよりComponentの方が使いやすいじゃん
Controllerの冒頭で配列に入れるだけで$thisで使えるんだから

593 名前:nobodyさん mailto:sage [2014/05/29(木) 10:18:58.89 ID:???]
RailsにしてもCakeにしてもActive RecordないしTable Data Gatewayパターンを利用するクラスをModelと命名して
データベーステーブルと(さらにはコントローラとも)1対1対応しなきゃいけないように見えるから勘違いしやすいんだよな

Railsは1つのモデルに関するロジックは"モデル"クラスに書けるけど
Table Data GatewayのCakeはこれすらコントローラやヘルパーに溢れ出やすい印象

複数"モデル"が絡むときに簡易サービス層として利用されやすいのがコンポーネントなのかな
コントローラから呼びやすいしファットコントローラの一番楽な回避策だろうし


初心者でも(本来の広い意味での)モデルの中にサービス層を作りやすい実装や解説にしておいてくれるとありがたいんだけど

594 名前:nobodyさん [2014/05/29(木) 10:27:52.09 ID:veg5U4SW]
>>592
なんだその理由ww

595 名前:nobodyさん mailto:sage [2014/05/29(木) 11:21:59.06 ID:???]
>>594
何がおかしいんだ?



596 名前:nobodyさん [2014/05/29(木) 11:35:25.87 ID:Kdl2SKiZ]
>>588

>似て非なるテーブルに同じ処理をしたい場合
これはビヘイビアがいい気がする。

597 名前:nobodyさん mailto:sage [2014/05/29(木) 13:26:17.97 ID:???]
前もこの話題出たよな
結論は出なかった

598 名前:nobodyさん mailto:sage [2014/05/29(木) 13:48:42.54 ID:???]
作るものの規模とかで最適な構成は変わるしね。
>>593 のいうサービス層が必要になる規模は、CakePHPではちょっと対象外なんじゃないかと思ってる。
CakePHPの中の人がどう思って作ってるかはしらんけど。

599 名前:nobodyさん mailto:sage [2014/05/29(木) 15:11:21.10 ID:???]
複数モデルにまたがる処理をコンポーネントに書いている人は
$useTable = false の別のモデルを作った方がずっと楽だと思うんだが。

コントローラから直接参照できる点は一緒。
データのセット、バリデーション、フォーム値の復元。
使うモデルを $hasOne とか入れとけば ClassRegisry::init も呼ぶ必要ない。

600 名前:nobodyさん mailto:sage [2014/05/29(木) 15:24:59.72 ID:???]
俺はコンポーネントでやる方が楽だけどな

601 名前:nobodyさん mailto:sage [2014/05/29(木) 15:34:31.80 ID:???]
おれも >>599 と同じだな。
Modelの下にサブディレクトリ切ってAppでパス通すのもありだと思う。

Lib は他で作ったライブラリを置く場所にしてる。

コンポーネントはコントローラの処理を助けることが限定されている場合しか書く意味ない。
もちろん、そういうロジックだけならコンポーネントはすれば良い。

602 名前:nobodyさん mailto:sage [2014/05/29(木) 16:13:20.58 ID:???]
複数ページにまつわる処理といえば、削除はどうしてる?
会員制サイトだと、以下のような構成がよくあるが、

会員
└日記
└お気に入り
└掲示板の作成や投稿

会員を削除すると、その下の投稿内容も削除しないとおかしい(と俺は思う)
だから俺は、管理画面で会員を削除したら、user_idがあるモデルは全て削除している。
削除はコントローラーに書いてる。

603 名前:nobodyさん mailto:sage [2014/05/29(木) 16:24:33.64 ID:???]
>>602
会員モデルの削除を呼んだら消えるようにする

604 名前:nobodyさん mailto:sage [2014/05/29(木) 16:37:36.60 ID:???]
>>603
hasManyでdependentをtrueだな。

俺も基本はそうしてるんだけど、>>602のに「画像」がある場合は困る。
各テーブルを参照して画像情報を取得し、削除していく必要がある。

605 名前:nobodyさん mailto:sage [2014/05/29(木) 16:50:52.43 ID:???]
beforeDelete,afterDeleteでいいんじゃない



606 名前:nobodyさん mailto:sage [2014/05/29(木) 18:18:39.64 ID:???]
そうすると、Userモデル内で他のモデルも呼ぶことになるぞ?

607 名前:nobodyさん mailto:sage [2014/05/29(木) 18:23:19.16 ID:???]
>>606
画像に関して言ったんだけど

dependentで消せないものに関して、Userモデル内から他のモデル呼んでも問題ないと思うけどな

608 名前:nobodyさん mailto:sage [2014/05/29(木) 20:03:02.45 ID:???]
deleteAll のコールバックって無いんだよね?

あれば Image モデルの afterDelete に
アセットを削除する処理を書いておけば良いのだろうけど。

saveMany や saveAll はコールバック効くのに
deleteAll は効かないってのもおかしな設計ではあるな。

609 名前:nobodyさん mailto:sage [2014/05/29(木) 23:57:26.91 ID:???]
deleteAll はコールバックあるよ。
ないのは updateAll

610 名前:nobodyさん mailto:sage [2014/05/30(金) 01:36:47.29 ID:???]
>>609
あ、そうなのか!
deleteAll の第3パラメータを true にするんだな。
今初めて気づいたわ。

じゃぁ、アセットの削除をそこに書けば良いわけか。

611 名前:nobodyさん mailto:sage [2014/05/30(金) 10:22:00.45 ID:???]
つまり、どういう設計になるの?

612 名前:nobodyさん mailto:sage [2014/05/31(土) 17:06:44.83 ID:???]
gitでcakephp管理する時、丸ごと全ファイルを管理するの?
それともビヘイビアとかプラグインとかだけ?
教えてください。お願いします!

613 名前:nobodyさん mailto:sage [2014/05/31(土) 18:14:11.40 ID:???]
全部

614 名前:nobodyさん mailto:sage [2014/05/31(土) 18:28:27.72 ID:???]
cakephpってまだcomposerに対応しきれてない?

cakephp2でcakephp/appみたいなの探してるんだけどないかな?

615 名前:nobodyさん mailto:sage [2014/05/31(土) 18:39:11.86 ID:???]
>>614
composer 使ってるけど、対応しきれてないと思ったのはどの辺り?



616 名前:nobodyさん mailto:sage [2014/05/31(土) 18:49:51.57 ID:???]
>>615
bakeでプロジェクト作らないといけないのに
ハードコーディングを直さなきゃいけないところとかかな

617 名前:nobodyさん mailto:sage [2014/05/31(土) 19:51:01.39 ID:???]
それは composer というか bake project の仕様だなー。
include_path 通しておけばハードコーディングされなくなるけど。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<202KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef