2012-04-23 8 views
6

私は自分のMVCフレームワークをPHPで学習しています。正しいコントローラ/アクションなどを呼び出すためのルータ/ディスパッチャクラスを持つことは本当に難しいことではありませんでした。PHP MVCのBaseModel、良いか悪い?

しかし、今私はモデルを使用する部分にいます。実際には、モデルレイヤーです。しかし、私を混乱させる何かがあります。

他のMVCフレームワークの多くは 'BaseModel'を持っています。私はこれが実際に悪い習慣であることを読んだことがあります。なぜなら、 "モデル"は別のクラスと見なされるべきではないからです。しかし、「マッパー」パターンや「リポジトリ」パターンなどのものを含むことができる実際の「レイヤー」として。

しかし、正直言って、私はそれに利点はありません。私にとっては、「BaseModel」クラスが同じ結果を出して最速の方法だと思われます。

私は単にような何か行うことができます。

class User extends BaseModel 
{ 
    // the GetUserBy* could easily be something that's handled by the 
    // BaseModel class, like in the Repo pattern. 

    public function getUserByName ($name) 
    { 
     // no error handling of any kind, just for simplicity 
     return $this->db->exec("SELECT * FROM users WHERE name='".$name."'"); 
    } 

    // $data = array 
    public function saveUser ($data) 
    { 
     // Make sure no extra fields are added to the array 
     $user = array ('name' => $data['name'], 
         'address' => $data['address']); 

     $this->db->autoSave ($user); 
    } 
} 

をしかし、私は、リポジトリのパターンのために行くだろうならば、私は次のものを作成する必要があります。 リポジトリ エンティティ DAO

エンティティはに凝集体を持っています他のリポジトリ。だから基本的に私は手動でオブジェクトに私のデータベース全体のスキームを書いています...

最後に、何が違いですか?それ以外の場合は、単にBaseModelクラスを使用するだけで、多くの時間を節約できる可能性があります。

しかし、なぜそれでもまだ悪いと思われますか?私が今やっていることよりも、レポパターンが私のアプリケーションを切り離すわけではありません。私にとって、上記のパターンは非常に過大評価されているようです。おそらく共有状態を持つアプリケーションでのみ動作します。オブジェクトをリポジトリにローカルに保存し、後でコミットします。

私は誰も本当にこれに答えることはできないと考える理由...だ

しかし、私はまだ私が行かせるまともな答えを見ることを望んでいる:「えーえ...私は何を考えていた.... "しかし、そうでなければ、BaseModelが悪いことではないと私は確信しています。ほとんどのブロガーは単なる羊の束です:-)

+1

pretty [Propel](http://www.propelorm.org/)-ish – Alp

+2

これらのブログ記事のいずれかへのリンクを教えてもらえますか? – webbiedave

+1

@Alpのコード例? Propelは単なるORMであり、私は自分でクエリを書くのが好きなので、その方向には進まない。私はORMs reaallhateいけない。しかし、私はむしろそれらを使用していません。いくつかの '魔法'は大丈夫ですが、それほど多くはありません。しかしそれはまったく別の話だ。 – Vivendi

答えて

1

レポパターンは、私は が今やっているより多くのそして私のアプリケーションを切り離していないことを

あなたのアプリケーションが緊密に(、実際には、あなたのマッパーとして動作している)SQLデータベースのコンポーネントに結合され、 。しかし、これにもかかわらず、あなたのデザインはActive RecordのアプローチよりもはるかにRepositoryに似ています(これはあなたが参照するこれらのブロガーの多くが悩んでいる可能性が高いです)。

アクティブレコードはデータだけでなく、データベースへのアクセスだけでなく、カプセル化:

$user = new User(); 
$user->setUsername('jane'); 
$user->setEmail('[email protected]'); 
$user->save(); 

それはレコードオブジェクトを永続化層(関心事の分離)を知らないことが持っているよりよいです。あなたの "ベース"は、ユーザーデータの配列を返すことによってそのことを行い、それらの配列が変更されたときには、それらを保存するためにユーザー "ベース"に渡す必要があります。あなたはあなたの命名を次のように変更することができます:

class UserRepo extends BaseRepo 
{ 
    // user-specific repo code... 
} 

$userRepo = $this->getRepo('User'); 
$user = $userRepo->getUserByName('jane'); 
$user['email'] = '[email protected]'; 
$userRepo->save($user); 

ベースレポを持つことは何も問題ありません。

+0

あなたが正しいと思います。それは何らかの形でRepoパターンのように見えます。しかし、私はエンティティクラスや値オブジェクトを使用していません。私も私のポストで言ったように、データベーススキームを「オブジェクト」に書き換えるような気がします。 ---私の 'UserRepo'はSQLクエリから直接取り出した配列を返します。 Entities/VOの使用は見られません。エンティティを使用する場合、基本的には、クエリから配列として結果を得て、エンティティオブジェクトにマップし、データを取得/設定するために使用します。なぜ私はそれに時間を費やすべきではない(エンティティ)。それについての考えは...? – Vivendi

+0

レコードをオブジェクトにマッピングすることで、OOPのすべてのオプション(希望の構造、インタフェース、タイプヒントなど)が可能になります。配列ベースの方が高速で、リソースも少なくて済み、ネイティブのPHP配列関数に渡すことができます。それはトレードオフであり、あなたの呼び出しです。 – webbiedave

0

Modelクラスは、それらを実装することなく。 Userモデルについては、これらすべての機能を持つインターフェイスGettingUsersを簡単に作成し、Userモデルで実装することができます。

+2

これは非常にbookishの答えであり、それはなぜまともな説明を続行している声明は続きません。また、モデルクラスが実装ロジックを持たないメソッドしか定義していない場合は、抽象クラスではなくインターフェースでなければなりません。私が言ったように、私はknoeをモデル、抽象クラス、インタフェースに「簡単に」分けることができました。 *何がBaseModelに対抗するメリットであるか。あなたはそれに答えることさえしようとしなかったように見える。 – Vivendi

+1

@Vivendi - 興味深い質問ですが、市民になってください。担当者からも分かるように、真実はいつかの周りにあり、あなたはここで新しいです。 – halfer

+1

@halfer申し訳ありませんが、私は誰も私の返事に違反しなかったことを願っています。私はとにかく失礼ではありませんでした。私は別の方法で私のコメントに特定のものを入れておくべきです。 – Vivendi

0

あなたのモデルのほとんどは、それらが従うべき統一されたインターフェイスを持たないため、私は基本モデルを全く使用しません。必要に応じて、さまざまな種類のモデル(基本的なオブジェクト指向プログラミング)の基本クラスを作成できます。

全体的に、私はモデルがコントローラーと配線し、1つまたは複数のビューで配線する「緩い」コンポーネントであると考えています。それらはすべて、異なるものを行うため、統一されたインタフェースを持つことはできません。永続ストアと話したり、永続性を持たないものや、他のモデルで構成するものがあります。

1

PHPフレームワークから優れたMVCプラクティスを習得しようとしているなら、それは間違っています。 PHPのベストフレームワークでさえ、設計上の間違いや欠陥が詰まっています。

"BaseModel"は通常、何らかのORMを実装しているフレームワークです。そして最も人気のあるパターンはActiveRecordです。シンプルなテーブルでは、他の人とは関係なく(基本的にはゲッター/セッターに栄誉を与えられます)、それはいいです。しかし、より複雑な構造やクエリを扱う際には、まず解消し始めます。通常広範囲になるtechnical debt

このアプローチが問題を引き起こす理由は、この場合の「モデル」が責任を負う可能性があるということです。ビジネスロジックはストレージに緊密に束縛されており、ストレージはロジックに溶接されています。アプリケーションが成長すると、そのような「モデル」はハッキングを蓄積します。

いいえ、「ブロガーの束」は羊ではありません。彼らはアプリケーションアーキテクチャとオブジェクト指向プログラミングに関する本を読んだだけです。あなたはこのテーマに関する本を最後に読んだのはいつですか?

+0

私は矛盾したものをたくさん読んでいます:)。しかし、あなたはそれをどのようにしてモデルにあまり蓄積しないでしょうか?あなたは脂肪モデル、脂肪コントローラ、どこかの図書館、ストアドプロシージャなどを持っているようです。職業はなんですか?私は多くの複雑なクエリのためにActiveRecordのアイデアを避けなければなりません。 ARはハックのように感じて巨大になります。私もSQLが好きです。ありがとう。 – johnny

+0

@johnny私は、あなたの主な問題は、実際には "モデル"が何であるかについて悪い情報を持っていることに起因すると思います。たぶん[this post](http://stackoverflow.com/a/5864000/727208)は少し助けてくれます。 –

関連する問題