2011-11-19 5 views
5

私は、フレームワークを使用していないPHPのMVCアプリケーションで作業しています。 ORMにRedBeanを使用しています。これは、datamapperパターンを実装しており、doctrineと非常によく似ています。MVCでモデルとORMを完全に分離する必要がありますか?

このquestionによれば、私はモデルがORMオブジェクトではないことを理解しています。データベース内のテーブルの多くの話をする必要がある

  • 「複雑な」モデル:これらのモデルの

    • 一つは、RBACの権限のようなものにすることができます私のプロジェクトで、私は次のシナリオを持っていますシステム。コントローラーは、$permission->isAllowed($controller, $action, $resource)のようなものを呼び出して、ユーザーが要求されたアクションを実行できるかどうかを判断できるはずです。また、$permission->getPermissions()に電話して、ユーザーの権限のリストを取得することもできます。
  • モデルは、一般に、データベースに1つのテーブルで表現することができる「単純な」モデル:

    • 一つのそのようなモデルはUserモデルであろう。例えば、$user->changeRank(),$user->addPoints()などとなります。

私が今直面しています問題は、様々なフレームワークのために、ほとんどのドキュメントを見て、私は直接、例にORMとコントローラの会談をそれを見ることができるということです。 ORMは、モデルは、なぜコントローラはそれと直接対話することが許可されていない場合は

public function createAction() 
{ 
    $product = new Product(); 
    $product->setName('A Foo Bar'); 
    $product->setPrice('19.99'); 
    $product->setDescription('Lorem ipsum dolor'); 

    $em = $this->getDoctrine()->getEntityManager(); 
    $em->persist($product); 
    $em->flush(); 

    return new Response('Created product id '.$product->getId()); 
} 

:たとえば、ここにsymfony2からコントローラ例ですか?このようなモデルと対話してはいけませんか?

class ProductModel{ 
    public function newProduct($name, $price, $description){ 
     $product = new Product(); 
     $product->setName('A Foo Bar'); 
     $product->setPrice('19.99'); 
     $product->setDescription('Lorem ipsum dolor'); 

     $em = $this->getDoctrine()->getEntityManager(); 
     $em->persist($product); 
     $em->flush(); 
    } 
} 

最後に、permissionsモデルの概要を説明しました。これはMVCの文脈でモデルとみなされますか?このクラスはアプリケーション全体で使用されます。ほとんどのツールではアクセス許可をチェックする必要があります。

+1

大きな質問です。 –

答えて

2

ORM(Object Relational Mapper)は、モデルファイルを生成するために使用されます。モデルファイルは、アプリケーションとデータベース(モデル)間の通信に使用されます。あなたはORMのプロセスに精通しているようですが、そうでないかもしれない人たちのために迅速な再キャップ(例としてdoctrineを使用します)があり、私はあなたの質問に答えて幸運になるかもしれません。

ORMを使用して、スキーマファイルを生成するデータベーススキーマをイントロスペクトします。このスキーマファイルで、アプリケーションのニーズに合わせて変更できます。たとえば、actAs: { Timestampable ~}、またはactAs: NestedSet: hasManyRoots: trueを追加できます。また、このスキーマファイルを使用して、オブジェクト間の関係をどのように動作させるかを設定することもできます(refClassなどを使用する1:M、M:M)

スキーマファイルの準備ができたらモデルファイルを生成するコマンドを発行します。モデルファイルは、アプリケーション内でデータベースにアクセスするために使用できるクラスです。そのため、コントローラは実際にORMによって生成されたファイルを介してモデル(データベース)と通信しています。

あなたが与えた例は、あなたのアクション(ページコントローラ)からあなたのモデルに多くのビジネスロジックをオフロードできるという点で、良い例です。このようにして、コントローラレベルのロジックを処理することなく、他のコードポイントから同じロジックにアクセスできます。どのようなdoctrineが(そしてpropelも)、あなたが 'Table'(または 'Peer')クラスを作成できるようにしています。これらのクラスは、複数のオブジェクトを扱うためのコンテナとして機能します。これらのクラスの中には、2番目の例で示したようにビジネスロジックを追加する必要があります。

究極の目標は、リクエストパラメータとフォーム処理を扱うだけで、できるだけ軽量なアクションを保ち、 'テーブル'または設計したカスタムクラスを使用してモデルに値をプッシュすることです。このパラダイムに続いて、トリムアクションと集中管理されたビジネスロジックを備えた機能豊富なアプリケーションを作成できます。

編集---

私はあなたの許可のAPIに関するあなたの最後の質問を逃した申し訳ありません。投稿した内容から、権限オブジェクトを持ち、コントローラとデータベースの間のAPIとして使用しているという点で、MVCのパラダイムに従っているように見えます。

+0

他のモデル(永続性を必要としないかもしれない)はエンティティ管理者を必要としないが、エンティティ管理者(永続性を必要とするモデル)を管理する必要があるモデルもありますか?モデルをインスタンス化して管理する2つの方法を持つことは、私にとって非常にきれいに見えません。 – F21

+0

@phpdev:あなたはDoctrineを特に指していますか? –

+0

はい。データベースとやりとりしないモデルがいくつかあるので、エンティティマネージャはまったく必要ありません。 – F21

関連する問題