【PHP】フレームワークについて語るスレ【総合】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2005/08/10(水) 02:21:08ID:CBjrwwHdPhrame本家
http://phrame.sourceforge.net/
Mojavi Project
http://www.mojavi.org/
mojavijapan
http://mojavi.p0t.jp/
Agavi本家
http://agavi.org/
Agavi.JP
http://agavi.jp/
[ 日本発 ] Maple Project
http://kunit.jp/maple/
[ 日本発 ] Ethna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/ethna-tutorial-startup-practice1.html
※関連スレ
【PHP】フレームワークMapleに舌鼓
http://pc8.2ch.net/test/read.cgi/php/1122105465/
【PHPフレームワーク】Ethna【スケルトン自動作成】
http://pc8.2ch.net/test/read.cgi/php/1123070439/
PHPでオブジェクト指向プログラミング
http://pc8.2ch.net/test/read.cgi/php/1113724557/
その他>>2-5参照汁
0811nobodyさん
2005/12/13(火) 21:58:05ID:???actionにいってからviewじゃない?
直接viewにいくのはなんか気持ち悪いな
>>807
Model=POPOなの?
そこまで疎結合にするならModelをextendsする意味がないような…
俺はModel≒ビジネスロジックという認識だった。
0813nobodyさん
2005/12/13(火) 22:04:25ID:???0814nobodyさん
2005/12/13(火) 22:05:40ID:???0815nobodyさん
2005/12/13(火) 22:17:24ID:???モデルはフレームワーク自体からも疎結合である方がいいって意味だよね。
考え方は分からないでもないけど
そこまで疎にする必要がはたしてあるのか…
そもそもフレームワークを採用する時点で
全面的な依存を選択しているわけで、
モデルだけを疎結合することにどれほどの意味があるのか
0816nobodyさん
2005/12/13(火) 22:17:28ID:???0817nobodyさん
2005/12/13(火) 22:19:09ID:???疎を考えるんなら777の言うようにレイヤーパターンで考えたほうが良いと思う
MVCパターンをレイヤーパターンに置き換えると
VCがプレゼンテーション層
Mがドメイン層とデータソース層
それぞれの層は独立していて別の層を知らないのが理想
actionはドメイン層とプレゼンテーション層の中間層かな?
だからactionは
プレゼンテーションからの入力(リクエストパラメータ)を受け取る
ドメインロジックを呼び出す
パラメータをドメインロジックに渡す
ドメインロジックでゴニョゴニョした結果をプレゼンテーションロジックに渡す
こんな流れがいいんじゃないかなぁ
結論、mojaviのModelクラスはイラネ
0820nobodyさん
2005/12/13(火) 22:33:04ID:???>>817
おまいらユニットテストしないんですか?
>>819
むしろすっきりする
actionにロジック書くわけじゃないからね
あくまでAPIを呼び出して使うだけ
mojavi的にはこんな感じ
$id = $request->getParameter('id');
$service = new HogeService();
$hoge = $service->getHoge($id);
$request->setAttribute('hoge', $hoge);
0824nobodyさん
2005/12/13(火) 23:00:01ID:???おれはできるだけ使わんやつは消しとるよ。
0825nobodyさん
2005/12/13(火) 23:04:08ID:???概念的にはその通りだけど
mojaviのModelクラスに依存したくないという意味でイラネということです
>>822
それすごく悩んだけど
自前のクラスローダーで解決したお
>>823
DB接続用クラスをSingletonで作成してどこからでも呼び出せるようにしてるよ
DB::getConnection()みたいな感じで
といってもどこからでも呼び出してるわけじゃないけどね
0827nobodyさん
2005/12/13(火) 23:58:11ID:???>自前のクラスローダーで解決したお
それはautoload側をいじったのか、ロード関数みたいなのつくったのか
0829nobodyさん
2005/12/14(水) 00:34:57ID:???Singletonごときでなんであんなものに頼らなきゃいけないのか疑問・・・。
しかもグローバルに呼び出しできなくなるし
0830nobodyさん
2005/12/14(水) 00:41:56ID:???0831nobodyさん
2005/12/14(水) 01:27:53ID:???まあどちらかと言うと、インスタンス2つ以上作ろうとする方が頭どうかしてるもんな。
Controllerとか。
0832nobodyさん
2005/12/14(水) 01:43:05ID:???リクエスト毎にオブジェクトが生成->破棄されるという意味では無意味だな。
ログとかDBコネクションとかでは使えるけど、それもグローバル変数に入れとけばいいみたいな。
0833nobodyさん
2005/12/14(水) 01:44:31ID:???シングルトンって「グローバル変数のオブジェクト指向版」みたいな意味しかない気がする
実際に役に立つのはDB接続みたいなリソース使いまわしくらいって印象が……
0834nobodyさん
2005/12/14(水) 01:46:05ID:???クラスが必要なときのみ読みこむようにその設定があるんだし、そんなに気にしなくてもいいのでは。
まぁ少ないほうが早いに決まってるけど。
0835nobodyさん
2005/12/14(水) 03:49:22ID:???そこまで行くとMojaviの理念から外れてるし、それはもうmojaviから派生した>817のフレームワークであって、
とても「mojaviを使っている」とはいえないと思うが。
なのでmojavi(agavi)でMVCどうやるのか(requestをどう扱うか)っていう話においては参考にならない。
>>820
も同様
ただ、ユニットテストはMojaviの致命的な欠点だとおもう。
本題の"request"の扱いについてはModelはControllerを知るべきではない、
そして"request"はControllerである。よって"request"は"Model"で扱うべきではない。
とおもうが。
実際はModelでしかたなくrequest呼び出したことありますごめんなさい。
設計が悪かった。反省してます。
0836nobodyさん
2005/12/14(水) 06:37:08ID:???0837nobodyさん
2005/12/14(水) 06:44:24ID:???0838nobodyさん
2005/12/14(水) 07:15:24ID:???疑問は晴れてないけど。
0839nobodyさん
2005/12/14(水) 10:23:55ID:???Controller
↓
Request ⇔ Action ⇔ Model ⇔ User,Database
↓
Controller
↓
Request ⇔ View ⇔ Model
|
←|→
プレゼンテー | ドメイン層、データソース層
ション層 |
|
俺にとってActionとはControllerの一部であり、Requestの受付とModelの呼び出し以外のことはしない。
Action::executeすげーシンプルウマー(AAry)。>>820、>>835と基本的に同じ。
俺にとってModelとはMojavi内で唯一ビジネスロジックを担当する部分である。
ちなみにModel以外はデータ層に触りません!
0840nobodyさん
2005/12/14(水) 11:25:24ID:???俺はOO的にうまいことまとまらない場合は
似たような関数をまとめてお茶を濁してる。
0842nobodyさん
2005/12/14(水) 11:44:42ID:???839じゃないけど
俺もModelはビジネスロジックを担当する部分という認識なんだが
きみのいうModelって何?
0843839
2005/12/14(水) 11:46:02ID:???たしかに関数の入れ物に過ぎないModelができちゃうこともあるかもw
俺の場合はSean KerrのAction::executeのコメントで、
* Execute any application/business logic for this action.
*
* In a typical database-driven application, execute() handles application
* logic itself and then proceeds to create a model instance. Once the model
* instance is initialized it handles all business logic for the action.
*
* A model should represent an entity in your application. This could be a
* user account, a shopping cart, or even a something as simple as a
* single product.
っていうやつ(mojavi/action/Action.class.php)をけっこう意識しながらやってる。
Modelはentityを表すってのけっこうしっくりきてるかも。
つーか今読み返してみたら、Sean Kerr的にはActionでビジネスロジックもありっていうスタンスっぽいなw
ただ、基本はModel=ビジネスロジックでしょ。
0844nobodyさん
2005/12/14(水) 12:08:56ID:???Actionに対するアプリケーションロジック・ビジネスロジックの実行をします。
よくあるデータベースを用いたアプリケーションでは、execute()の中でアプリケーションロジックを扱い、続いてModelのインスタンスを生成します。
Modelの初期化をしたら後はその中で全てのビジネスロジックを扱います。
Modelはアプリケーション内のエンティティを表すようにすると良いでしょう。
例えば、ユーザーアカウント、ショッピングカートであったり、時には個々の製品といったシンプルなものであることもあるでしょう。
0845nobodyさん
2005/12/14(水) 12:12:22ID:???そうそう。
やっぱり841はビジネスロジックの定義を勘違いしてないか?
エンティティーのメソッドはすなわちビジネスロジックだし。
Model=ValueObjectと勘違いしてる気がする。
0846nobodyさん
2005/12/14(水) 14:28:05ID:???というか、レイヤとモデルを微妙に混同してるのかも。
ドメイン層のレイヤにビジネスロジックがあって、
そこで操作されるものがドメインモデル(エンティティ)。
これをそのまま実装に反映させるなら、
ドメインモデルとビジネスロジックは別クラスにするのが自然。
だけどケースバイケースで、ドメインモデルのクラスが
ビジネスロジックのメソッドを持つ実装にするのもあり。
どちらがいいかは一概には言えないと思う。
>>845
それは違うよ。
ValueObjectはどちらかというとドメインモデルではなく
プレゼンテーションモデル。
ドメインモデルをそのままプレゼンテーション層まで引きずってくる
設計方針ならValueObjectぽっく見えるかもしれないけど、
プレゼンテーションモデルをきっちりわける設計方針なら
>>841の言ってるモデルはドメイン層で閉じてるはず。
0847nobodyさん
2005/12/14(水) 15:10:04ID:???0848nobodyさん
2005/12/14(水) 16:18:44ID:???0849nobodyさん
2005/12/14(水) 16:45:40ID:???0850nobodyさん
2005/12/14(水) 17:12:47ID:???ValueObjectがプレゼンテーションモデルってどゆ意味?
単に値を持たせるオブジェクトだから
どんな層にでも入ってくる汎用的なパターンだと思うんだが
0851nobodyさん
2005/12/14(水) 21:59:44ID:???自説を立てるときはそれなりの手順を踏襲してほしい
0853nobodyさん
2005/12/15(木) 02:23:24ID:???この公式サンプルも、全然>>839みたいな定義になってねぇし
0854839
2005/12/15(木) 03:13:21ID:???たしかにそうだね。それが
> つーか今読み返してみたら、Sean Kerr的にはActionでビジネスロジックもありっていうスタンスっぽいなw
と言った理由なんだけど。
ただ、俺自身はドメイン層の処理はModelでやる方針でやってるって話。
Actionでドメイン層・データソース層に手を出すのも利点があるなら大いに結構だとは思うよ。
>>853
えーっと一応言っておくけど>>839は設計(or実装)方針の話ね。
(それまでの議論の内容も多少加味したつもりなんだが偏見もあるかも・・・)
あと、そこのサンプルは>>844の「ユーザーアカウント」にあたるものをModelとして抽出せずにActionで済ませちゃってるんだね。
だから839と違って見えるってのも無理はないかも。
まあロジックが複雑になってきたらそんなことは言ってられないので俺は認証用に作ったModelを再利用してるよ。
必要ならそのModelをもう一段継承してカスタマイズとかできるのでそこそこ便利だし。
0855nobodyさん
2005/12/15(木) 03:28:55ID:???同じ気持ちでしたが、
http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/DesMVC.asp
ここを読んでみて>>841の言ってることがよくわかりました。
MVCの図にあるとおり
>ビューとコントローラの両方がモデルに依存していることに注意してください。ただし、モデルはビューとコントローラのどちらにも依存していません。
モデルは両方に依存していないものなんだね。
そう考えるとたしかに>>839の言ってる図は話にならない。
でも、それを言い出すとAgaviの設計自体がおかしいことになるね。
0856839
2005/12/15(木) 03:51:45ID:???たぶんUMLを見慣れてる人が多いんだろうから誤解を与えたかもしれないけど、>>839は「依存関係」を表してるつもりじゃなかったんだなぁorz
Controller→Action→Controller→Viewってのは制御が移る順番。
他の⇔はデータの受け渡しであって、基本的にはメソッドの呼び出し+リターンなので制御が移る順番としても解釈できるかも。
>>855が依存関係の話を持ってきてくれたのでそれも考慮すると、⇔の矢印をすべて外側向きに変えたら少しはましになるかな?
矢印の意味は
・依存してる側→依存されてる側
・呼び出し側→呼び出される側
という関係で。(唯一Action→Controllerの部分だけリターンなので矢印の色でも変えてくださいw)
「ビジネスロジック」って言葉は俺も再考する必要があるかも。
>>846をもうちょっと咀嚼してみる。
0857nobodyさん
2005/12/15(木) 03:53:25ID:???こういうの見るとますますわからんくなる…
0858nobodyさん
2005/12/15(木) 04:01:35ID:???保守性の高いコードってWebアプリケーションなら結構つくれちゃうからなぁ…
ビジネスロジック云々より、ビジネスや運営自体について考えてたほうがよっぽど金になる
0859839
2005/12/15(木) 04:09:49ID:???俺的もそう思う。どっちでもいーじゃんおまいらw、と
でも「間違っている」というつっこみをたくさんいただいたので、ヘコみつつ悪戦苦闘中であります。
0860nobodyさん
2005/12/15(木) 04:22:02ID:???マジでAgaviのView周りってModelに依存性あるの?
ステートレスなWebアプリでは切り離されてるのが当たり前だと思ってたけど。
アクティブモデルにせよオブザーバはかませるっしょ
0861nobodyさん
2005/12/15(木) 04:40:08ID:???コントローラかアクションにぶらさげることは出来るね
前者はコントローラがMediator(と言ってもモデルかアクションから
データを受け渡すだけ)となり、後者ではアクションはコマンドオブジェクト
(ビジネスロジックとViewの呼び出しをカプセル化したもの)ということになる
どっちもパターンとしてはMVCとは呼ばないんだろうけど
http://www.martinfowler.com/eaaCatalog/applicationController.html
Viewがモデルに依存したほうがいいかアクションに依存したほうがいいか
まとまった見解ってある?
0862nobodyさん
2005/12/15(木) 04:43:36ID:???Agavi自体の仕様では依存性は発生しないよ。Modelは一つもなくても動くし。
でもModelを使った時点で依存はゼロではないと思われ。
「切り離す」ってのはいわゆる疎結合にするって意味だとは思うけど、元々依存してしまうものだからせめて疎結合にしましょうって感じじゃなかったっけ?
>>855の言ってるのは、逆向きの依存はゼロってことでしょう。
「Viewを変更したらModelが動かなくなりました」とかしゃれになんないし。
でもModelを変更したらViewに支障が出るのは仕方ない。
それでも最小限にしましょうってのが疎結合だと思う。
オブザーバはContextのことでおkかな?
0863nobodyさん
2005/12/15(木) 05:25:53ID:???結合の程度というようなファジーなものは存在しない
Framework界隈で依存性といったらこれのことだと思う
0864nobodyさん
2005/12/15(木) 05:52:18ID:???疎結合って結合の程度がゆるいことじゃないの?
つーかどのレスに対してなのか反論なのか何なのかわからんな。
0865863
2005/12/15(木) 06:11:06ID:???結合にはもちろん程度があるよ
しかし依存性にはそういうものは無くゼロイチだということを言ってみた
>>860と>>862の愛でどうも考えている依存性が違って
かみ合ってないように見えたので
0866nobodyさん
2005/12/15(木) 06:12:18ID:???○ 間で
すまん
間違ったものを芽生えさせた
0867nobodyさん
2005/12/15(木) 06:12:22ID:???Modelにするにせよ別もんにしてつくるにしても、
初期のViewだけじゃなにもできんじゃん。
ごてごてタグとテンプレートと定数混ぜることになってしまう。
その辺のモデルもつくるでしょ?ふつう
0868nobodyさん
2005/12/15(木) 06:16:08ID:???ビュー内でモデルは呼び出したくない
0870862
2005/12/15(木) 06:21:54ID:???そかそか。曖昧な言い方ですまんかった。
基本的には「依存性はゼロイチ」ってのは同意だよ。
だから>>860への答えはViewからModelへの依存性は「あり」。
ただ「切り離されてるのが当たり前」って表現をしてたので、862で「それは疎結合のことであって≠依存性だよね」っていう意味で言った。
>>868
実際にはそうだよなw
0872nobodyさん
2005/12/15(木) 09:58:57ID:???モデルからUserにアクセスする必要がある時はどうやってるの?
0874nobodyさん
2005/12/15(木) 10:21:58ID:???0876nobodyさん
2005/12/15(木) 11:14:48ID:???フレームワークに依存しない設計がいまいちイメージしにくいな
0877nobodyさん
2005/12/15(木) 11:38:55ID:???もうあんな設計は古いって…。
0878nobodyさん
2005/12/15(木) 11:43:23ID:???0879nobodyさん
2005/12/15(木) 11:51:42ID:???0880nobodyさん
2005/12/15(木) 11:55:01ID:???影響受けてるフレームワークいっぱいあるしな
0881nobodyさん
2005/12/15(木) 14:16:48ID:???0882nobodyさん
2005/12/15(木) 15:21:47ID:???0883nobodyさん
2005/12/15(木) 21:48:05ID:???ValidateやらFilterは自作になるけど、結構いいと思う。
0884nobodyさん
2005/12/15(木) 23:18:51ID:???プロダクトとしてリリースするなら、自分のところできちんと性能評価をやった方がいいよ。
0885nobodyさん
2005/12/16(金) 00:48:04ID:???0886nobodyさん
2005/12/16(金) 01:35:11ID:???0887768
2005/12/16(金) 09:02:11ID:???0888nobodyさん
2005/12/16(金) 09:14:05ID:???0889nobodyさん
2005/12/16(金) 18:13:50ID:???エスパー募集してもよろしいでしょか?
0892nobodyさん
2005/12/17(土) 00:42:49ID:???0893nobodyさん
2005/12/17(土) 01:13:05ID:???多少質問あったほうが盛り上がるからいいんで内科医?
>>892
基本的にvalidationはactionでやり、DBの扱いはmodelでやってるけど、このスレ読んでたらもしかしたらactionでやったほうがいいのかな?とも思えてきた。
0895nobodyさん
2005/12/17(土) 01:39:26ID:???0896nobodyさん
2005/12/17(土) 01:50:31ID:???modelを作るほど複雑でなく(単なるログとか)、
また他のアクションで同じ機能を利用しないならアクションで済ませてしまってもいいとは思う。
0897nobodyさん
2005/12/17(土) 02:02:35ID:???modelでDBに登録するとしたらサニタイズもmodelでやるってことになる?
でないとmodelがactionに依存してしまう気がするんだけど。
0898nobodyさん
2005/12/17(土) 09:32:09ID:???サニタイズはactionでやるべきだね。
0899nobodyさん
2005/12/17(土) 09:36:15ID:???モデルは自身のためのサニタイズは自身で持つ
いずれも定義は括りだす
0900nobodyさん
2005/12/17(土) 09:39:35ID:???てことか。
実際どこで何をやるんだろ。
0901nobodyさん
2005/12/17(土) 10:04:30ID:???てことはActionでDBに書き込むのが正しい?
0902nobodyさん
2005/12/17(土) 10:55:36ID:???0903nobodyさん
2005/12/17(土) 11:29:14ID:???0904nobodyさん
2005/12/17(土) 12:05:30ID:???0905nobodyさん
2005/12/17(土) 12:12:34ID:???答えが返ってくる時もあれば返ってこない時もあるけど
0907nobodyさん
2005/12/17(土) 13:24:57ID:???0908nobodyさん
2005/12/17(土) 19:16:29ID:???http://www.agavi.org/
レス数が900を超えています。1000を超えると表示できなくなるよ。