PHPでOOP (894レス)
PHPでOOP http://medaka.5ch.io/test/read.cgi/php/1172205352/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
634: nobodyさん [sage] 2008/12/20(土) 17:07:58 ID:??? >>633 ものすごく丁寧にありがとう。 まだぼんやりとしかわからないけど、サンプルコードを読み解いて、いろいろ試してみる。 http://medaka.5ch.io/test/read.cgi/php/1172205352/634
635: nobodyさん [sage] 2008/12/20(土) 17:13:17 ID:??? >>633 >「入力値の検証」なのだから、コントローラの責任。 「検証する」んじゃなく「検証させる」のが仕事じゃないの? ここでいう入力値の検証って例えばどんなこと言ってる? 3行目で >何が許可されるかを知ってるのはだいたいModelだからな。 って書いてるってことは、なにか、Modelに関係ないものを想定してると思うんだけど。 http://medaka.5ch.io/test/read.cgi/php/1172205352/635
636: nobodyさん [sage] 2008/12/20(土) 18:07:36 ID:??? >635 大雑把に言うと、処理を始める前に可能なパラメータの検証全般。 純粋に入力値だけを見て判定できるものだな。システムや環境の状態を見なくとも判定できるエラーを出す役割。 処理を始めないと分からないもの(DBに指定されたエントリーがあるかとか)は、バリデーションでは扱わない。 DBにこの値があった場合はクッキーにこれが無いといけない…みたいなのも対象外。 日付として「'9999-12-31'」が指定されてもバリデーションでは引っ掛けない。これは有効な入力。 「'2008-13-4
5'」はバリデーションでエラーとして引っ掛ける。この日付が有効になる事はあり得ないから。 メールアドレスが正しいフォーマットかをチェックするのはバリデーションで、それが有効なメールアドレスかをチェックするのはモデル。 ユーザーIDとして正しいフォーマットならばバリデーションは通るが、当該ユーザーがいない場合モデルがエラーを出す。 http://medaka.5ch.io/test/read.cgi/php/1172205352/636
637: nobodyさん [sage] 2008/12/21(日) 00:53:43 ID:??? >>636 なんとなく分かるけど、 例えばそれだと「2008-13-45は日付(のつもり)」ってことを コントローラが知っとかないといけないってことだよね? あと、日付が必要なくなった、とかいうときは コントローラーを変更しないといけないってことにならない? なんか拘ってるようでアレだけどお勉強スレってことで許してw http://medaka.5ch.io/test/read.cgi/php/1172205352/637
638: nobodyさん [sage] 2008/12/21(日) 00:57:41 ID:??? って、もしかして、リクエストとして渡ってくるものを想定してるのかな。 hoge.php?date=20081231 とか。 http://medaka.5ch.io/test/read.cgi/php/1172205352/638
639: nobodyさん [sage] 2008/12/21(日) 12:32:43 ID:??? >637 「コントローラ」の指している範囲が俺と違う気がする。 俺はディスパッチャ(処理の振り分け)部分じゃなくて、そこから振り分けられる先のコントローラを指している。 ぐぐったが、「アクション」としてクラスにして丸ごとコントローラから切り離す文化圏もあるようだな。 「日付のつもりで送られてくる文字列がある」という事実は、ディスパッチャは(たいていの場合)知らない。 が、コントローラ(アクション)は知っている。だって知らないと日付具象モデルに処理を引き渡しよ
うがないからな。 Cにはどの道変更が入る。リクエストをモデルに引き渡すのが仕事だからな。 「日付がどこからどう渡ってくるか」はCの管轄であってMじゃない。Mはそれを知っていてはいけない。 Mは「日付を渡されたらどうする」だけ知っていればよく、実際問題どこに日付があるかはCが隠蔽すべき。 たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。 この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。 「省略時は日付を無視して過去のレコードを
全取得する」という場合は、データ取得ロジックが変更なのでまずMは変わる。 制御の構造、呼び出しインターフェイスも変わるのでCも変わる。 http://medaka.5ch.io/test/read.cgi/php/1172205352/639
640: nobodyさん [sage] 2008/12/21(日) 12:37:44 ID:??? まあ実際は、日付省略時のMの挙動を変えるだろうけどな。 >638 入力値以外のもの(DB内の値とか処理結果)の検証は当然モデル。 というか、そういうのは一般にはバリデーションとは言わずアサーションと呼ぶ。 http://medaka.5ch.io/test/read.cgi/php/1172205352/640
641: nobodyさん [sage] 2008/12/21(日) 13:45:12 ID:??? >>639 Cは振り分けだけが仕事だと思ってたんだけど。 その先にさらに C があることなんてあるのか。 サブコントローラーみたいな感じ? http://medaka.5ch.io/test/read.cgi/php/1172205352/641
642: nobodyさん [sage] 2008/12/21(日) 14:51:26 ID:??? >641 やっぱ、そこか。 例えばブログの場合、エントリー群を司るモデルや、タグクラウドを司るモデルができる。これは自明だな。 で、データを受け取って画面を表示するだけの、ごく単純なビューがいる。これも自明。 で、それら呼び出してページのデータを作る、という「データの統合」を司るクラスが必要になる。 これをMVCのうち、MとCのどっちに置くかの問題。 MVC、MVCって言ってるけど、本質的には4層なんだよ。 処理の振り分けに1層を割くならば、4層なくてはならない。 処理の振
り分け=呼び出すCの決定(ディスパッチャ)→どのMを呼び出すかを制御する(コントロール) →データを実際に扱う(モデル)→表示(ビュー)、となる。 実際のフレームワークだと、RailsやZendはDispatcherが振り分けを担当し、制御はコントローラが執っている。 (だから、おまいの目から見れば、コントローラは仕事をやりすぎに見えるはず) SymfonyやCakeだとControllerがディスパッチを担当し、制御はActionが執っている。 CodeIgniterだとディスパッチは単一のエントリポイント(リクエストを受けるphpファイル)であるindex.phpが行なって、
制御はCが行なっている。 http://medaka.5ch.io/test/read.cgi/php/1172205352/642
643: nobodyさん [sage] 2008/12/21(日) 15:35:51 ID:??? >>642 >たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。 >この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。 これって制御じゃなくてロジックだからモデル的仕事じゃねぇの? http://medaka.5ch.io/test/read.cgi/php/1172205352/643
644: nobodyさん [sage] 2008/12/21(日) 16:01:38 ID:??? >>642 横槍で質問してすまんかった。 すげーわかりやすい。 勉強になった。ありがとう。 http://medaka.5ch.io/test/read.cgi/php/1172205352/644
645: nobodyさん [sage] 2008/12/21(日) 16:03:24 ID:??? 4層www http://medaka.5ch.io/test/read.cgi/php/1172205352/645
646: nobodyさん [sage] 2008/12/23(火) 01:41:15 ID:??? >>645 あなたの顔に死相が出ていますよ。4層だけに。 http://medaka.5ch.io/test/read.cgi/php/1172205352/646
647: nobodyさん [sage] 2008/12/24(水) 12:54:19 ID:??? 考え方としてディスパッチとコントロールは分けるべきだが、 実装するときは、コントロールで括るよな? http://medaka.5ch.io/test/read.cgi/php/1172205352/647
648: 642 [sage] 2008/12/24(水) 22:47:37 ID:??? >647 M・V・Cで分けるならCってのは同意。いちおう > 処理の振り分けに1層を割くならば と予防線は張ってあるわけだが。 俺はControllerの親クラスとかControllerFactoryでディスパッチする事が多い。 http://medaka.5ch.io/test/read.cgi/php/1172205352/648
649: nobodyさん [sage] 2008/12/25(木) 12:55:55 ID:??? >>648 > Controllerの親クラスとかControllerFactoryでディスパッチする事が多い ディスパッチャーのインターフェースを作って、コントローラクラスでインプリメンツするってのは駄目なの? http://medaka.5ch.io/test/read.cgi/php/1172205352/649
650: nobodyさん [sage] 2009/01/04(日) 21:25:44 ID:??? 保守 http://medaka.5ch.io/test/read.cgi/php/1172205352/650
651: nobodyさん [sage] 2009/01/10(土) 18:38:23 ID:??? 保守 http://medaka.5ch.io/test/read.cgi/php/1172205352/651
652: nobodyさん [sage] 2009/01/18(日) 01:35:36 ID:??? 手始めに、サイトのリニューアルついでにSmarty入れてCMS'っぽく'してみる。 http://medaka.5ch.io/test/read.cgi/php/1172205352/652
653: nobodyさん [sage] 2009/01/26(月) 20:14:56 ID:??? お?サンプルか? http://medaka.5ch.io/test/read.cgi/php/1172205352/653
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 241 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s