2011-11-19 59 views
5

我的工作是不使用任何框架,PHP的MVC應用程序。我使用RedBean我的ORM,它實現了DataMapper的模式和作品相當類同doctrine我應該在MVC中將模型和ORM完全分開嗎?

按本question,據我所知,該模型不是ORM對象。在我的項目,我有以下情形:

  • 「複雜」的模型,其需要在數據庫中有很多表的談話:

    • 其中一個模型可以是這樣的RBAC權限系統。控制器應該能夠調用諸如$permission->isAllowed($controller, $action, $resource)的東西來確定用戶是否被允許執行所請求的動作。另外,他可能會撥打$permission->getPermissions()以獲取用戶擁有的權限列表。其中模型一般可以用1臺在數據庫中表示
  • 「簡單」模式:

    • 一個這樣的模式將是User模型。例如$user->changeRank(),$user->addPoints()等。

我現在面臨的問題是,尋找各種框架的大多數文檔,我可以看到,在該示例中,直接與ORM控制器會談。例如,這裏是從symfony2的示例控制器:

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()); 
} 

如果ORM不是模型,爲什麼控制器允許直接與它交互?它不應該與看起來像這樣的模型交互?

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(對象關係映射器)被用於生成模型文件。模型文件用於在應用程序和數據庫(模型)之間進行通信。看來你的ORM過程熟悉,但很快重新蓋(使用學說爲例),對於那些誰可能沒有了,我可能會得到幸運,回答你的問題。

您使用ORM內省數據庫模式,生成模式文件。現在有了這個模式文件,你可以改變它以適應你的應用需求。例如,您可以添加actAs: { Timestampable ~}actAs: NestedSet: hasManyRoots: true。此外,您將希望使用此模式文件來設置對象之間的關係如何表現(例如,使用refClass等的1:M,M:M)

一旦您的模式文件準備就緒,您發出命令來生成模型文件。模型文件是您可以在您的應用程序中使用以訪問數據庫的類。因此,控制器實際上是通過ORM生成的文件與模型(數據庫)通信。

你給的例子是一個很好的,因爲你可以卸載大部分業務邏輯從你的行動(頁面控制器),進入你的模型。通過這種方式,可以從其他代碼點訪問相同的邏輯,而無需處理任何控制器級邏輯。什麼學說(並且推動也是這樣)允許你創建'表'(或'對等')類。這些類充當處理多個對象的容器。正如您在第二個示例中演示的那樣,您應該在這些類中添加業務邏輯。

的最終目標是讓你的行動輕量級越好,只是處理請求參數和表單處理,然後按值通過「表」或你設計定製類模型。遵循這種模式,您可以擁有一個功能豐富的應用程序,包括修剪操作和集中的業務邏輯。

編輯---

對不起,我錯過了關於您的許可API的最後一個問題。從你發佈的內容來看,它看起來遵循了MVC範例,因爲你擁有一個許可對象,並在控制器和數據庫之間用作API。

+0

是否可以接受,有些車型需要一個EntityManager(機型需要持久性)來管理它們,而其他車型(這可能不需要持久性),不需要一個EntityManager?有2種方式來實例化和管理模型對我來說看起來並不是很乾淨。 – F21

+0

@phpdev:你指的是具體的教義嗎? –

+0

是的。我有一些模型根本不與數據庫交互,所以他們根本不需要實體管理器。 – F21

相關問題