- 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/
- 501 名前:nobodyさん mailto:sage [2014/05/14(水) 21:51:05.96 ID:???]
- 例えば「足し算」ていうメソッドを作成したとする。
これは引数に例えば「1と2を入れると3が返る」というもの。 1「テストを書かないやりかた」 こんな簡単なメソッド、どうやってもミスるわけない。 とりあえず作る。最初に動くか確認する。 動いた・・・終わり 2「テストを書くやりかた」 「1と2を入力すると3が返る」というテストを書く。 開発しながらテストを走らせて正常か確認する。 テストが異常なら、異常がなくなるまでプログラムを修正する。 これをずっと繰り返す。 3「テストを先に書くやり方」 2のテストを先に書く。メソッドは空からスタート。 テストが通るまで開発を行う。
- 502 名前:nobodyさん mailto:sage [2014/05/14(水) 21:56:32.40 ID:???]
- console.logは、phpでいえばvar_dumpとかになるなんだろうが、
使うときにコメントイン/アウトしなきゃいけないし、消し忘れるとそれがそのまま出力されて大変なことになる(センシティブな情報だったら・・・)。
- 503 名前:nobodyさん mailto:sage [2014/05/14(水) 22:52:25.27 ID:???]
- 上司がテストケース書いて、部下にそれに合うようなコードを書かせるってのなら良いと思う。
ただcakephp1が2になったりするとテストも書き直しだよね。 結局テスト書いてもそれ以上にプログラムの進歩が速いような気もするんだよね。 ちなみにヤフーとかって10年前くらいにcgiをphpに書き直したみたいなこと聞いたけど、あれ以来書き換えてないのかな。 それとも地道に書き換えまくってるのかな?
- 504 名前:nobodyさん mailto:sage [2014/05/14(水) 23:08:58.07 ID:???]
- >ただcakephp1が2になったりするとテストも書き直しだよね。
いきなりスパン長い話になってね? ビジネスロジックまで全部変わるわけじゃないんだからテストコードも一部はそのまま使えるでしょ テストコードまったくなしに書きなおすよりはいくらか書きやすいと思う
- 505 名前:nobodyさん mailto:sage [2014/05/14(水) 23:36:50.08 ID:???]
- >>499の説明で合ってるんだが、何がわからないのかわからない
- 506 名前:nobodyさん mailto:sage [2014/05/14(水) 23:52:50.14 ID:???]
- >>504
ありがとう。そういうメリットもあるんですね。 >>505 わからない人にとっては全くわからないんだよね。テストケースのメリット。 俺、gitもテストケースも使ったことないというか使えないので勉強します。
- 507 名前:nobodyさん mailto:sage [2014/05/15(木) 00:48:57.49 ID:???]
- なんだかんだ言って教えるのなw
- 508 名前:nobodyさん mailto:sage [2014/05/15(木) 01:04:25.59 ID:???]
- 経験ないとわからないかもしれんね
愚者は経験に学ぶと言うけど人間なんて全員愚者だから、がんばって経験を積もう
- 509 名前:nobodyさん mailto:sage [2014/05/15(木) 02:16:19.81 ID:???]
- >>495
こういう >>492 時に必要になるんだよ。 例えば1日の区切りが0時じゃなく4時なサービスがあるとしよう。 DateTimeオブジェクトや日時の文字列を受けて、何日かを返すメソッドがあるんだけど、 中身を見たらこりゃひどい実装だなという時、 テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。
- 510 名前:nobodyさん mailto:sage [2014/05/15(木) 03:48:38.98 ID:???]
- お前ら俺が以前テストの質問した時はスルーしたくせに
テストの話題で盛り上がりやがって
- 511 名前:nobodyさん mailto:sage [2014/05/15(木) 04:08:36.66 ID:???]
- >>510
たぶんそれから必死で勉強したんだよ
- 512 名前:nobodyさん mailto:sage [2014/05/15(木) 10:33:38.61 ID:???]
- >>509
>中身を見たらこりゃひどい実装だなという時、 >テストがあれば、中身を書き換えても同じ結果を返す実装にできたとわかりやすい。 ここが想像できないんだよ。中身(モデル?)が酷い実装っていうけど、 前は動いてたんだよな?それを変更する時に「酷い」が分かるんだろ? なら、テストも書き直しだと思うんだよ。俺も>>503と同じ疑問を持ってる。 Cakeのバージョンアップではなくとも、仕様が変わればテストも変わるでしょ。
- 513 名前:nobodyさん mailto:sage [2014/05/15(木) 10:45:22.44 ID:???]
- 0か1で考えてんな
少なくとも単体テストしやすいように設計してれば 仕様を変えた部分の他に影響がないことを保証しやすいんじゃないか テストが書いてない誰かが作ったソフトウェアを改修する時に あっち変えたらこっち動かなくなったよみたいな経験ない?
- 514 名前:nobodyさん mailto:sage [2014/05/15(木) 10:52:06.00 ID:???]
- んじゃあ次はgitってなんなのよ?
- 515 名前:nobodyさん mailto:sage [2014/05/15(木) 11:08:32.04 ID:???]
- >>514
俺も思うな。 一人で開発したことしかないからか、 前に戻したくなることなんてまず無い。 毎回、add、commitする手間の方が面倒な気がするけど。 ただ、いつでも何処にでも戻せる安心感ってのは大きいのかもしれない。 dropboxでも戻せるけどどこに戻せば良いのかすらわからない。
- 516 名前:nobodyさん mailto:sage [2014/05/15(木) 11:14:00.56 ID:???]
- >>512
別人だけど、中身ってコードのこと言ってるんだろ。 テストが完璧な仕様を表したものだと仮定すると、 テスト通りに動く限りは、実装コードはいくら変えても構わない、という理屈。 テストコードの方も変える必要がない(というか、変えたら同一の保証ができなくなる)。 もっとも、リファクタリングの過程で、新しいクラスやインターフェースを追加、とかなることが多いから、 その場合は、テストも変えていく必要はあるけど。
- 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 は他で作ったライブラリを置く場所にしてる。 コンポーネントはコントローラの処理を助けることが限定されている場合しか書く意味ない。 もちろん、そういうロジックだけならコンポーネントはすれば良い。
|

|