2

我理解的利益或倉庫的模式,但我不能在Symfony3主義理解有Doctrine\ORM\EntityManager\Doctrine\ORM\EntityRepositorySymfony的學說實體管理器和庫

  1. 是兩者有何區別?
  2. 存儲庫是否應該注入控制器或實體管理器?

    編輯 正確的問題應該是:什麼是從控制器訪問存儲庫的正確方法?

    • 存儲庫是否應作爲服務注入控制器?
    • 存儲庫是否應作爲服務注入另一個服務?
  3. 實體管理器是否應該包含任何查詢?
    編輯 正確的問題應該是:一個服務應該包含查詢嗎?其中@MateuszSip已經解釋過,它可以通過注入實體管理器來完成

  4. 是否應將類似getAvailableManagers的自定義函數放入 存儲庫或服務中? (凡manager是一個倉庫,有 在確定available manager一些邏輯)

  5. 如何像findAllManager一個更通用的功能,它應該是在倉庫或實體管理器?

當前我正在使用Symfony3。非常感謝您

乾杯,

編輯 談起@MateuszSip(感謝隊友),我決定把我的問題與下面的例子更清晰。請注意,下面的代碼並不代表真正的問題

控制器

Class ManagementController 
{ 
    public function assignManager($projectType) 
    { 
     // Grabbing a service 
     $s = $this->get('mycompany_management_management_service') 

     $managers = $s->findAvailableManagers(); 
     $managers = $s->checkCapability($managers, $projectType); 

     return $managers 
    } 
} 

class ManagerRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function findAvailableManagers() 
    { 
     ... 
     return $managers 
    } 

    public function checkCapability($managers, $type) 
    { 
     ... 
     return $capableManagers 
    } 
} 

服務

class ManagementService 
{ 
    ... I am not sure what should be here. 
} 

回答

2
  1. 的EntityManager用於管理學說相關的對象,所以:
    • 你能堅持一個實體對象(它現在被教條管理,並準備保存)
    • 你可以刪除一個實體對象(所以它會在稍後刪除)
    • 你可以刷新,並「會觸發掛起操作
    • 你可以得到一個存儲庫(讓你需要的對象),或使用一個通用的API,通過主鍵 等獲取對象

這是一類管理對象的狀態及其與數據庫的關係。

存儲庫是一種標準化訪問限制的模式。

  1. 如果您的應用程序非常複雜,則應該向控制器注入單獨的服務。因此,有一個UserSaver服務(作爲示例),它使用entityManager創建/更新用戶和UserFinder(或者其他名稱良好的用戶),UserRepository負責根據定義的標準提取用戶。

  2. 您可以使用實體管理器創建查詢,但是em本身不能包含查詢。

  3. 在我看來,在服務中定義一個方法,並在UserRepository中定義一個相應的方法。在這一刻,所有你想要的東西都應該被數據庫獲取,但是它可能會在以後改變。

  4. 在存儲庫中。方法如:findByRole(role = manager),findIsActive,findOneBySecurityNumber依賴於存儲庫。

+0

感謝您的回答。爲了您的觀點4.服務訪問存儲庫如何?是通過注射嗎?還是通過' - > entityManager-> getRepository'? –

+0

您可以將存儲庫定義爲服務並將其注入到服務中。 –

+0

如果我將我的存儲庫定義爲服務,爲什麼需要將其注入另一個服務?我不應該只是將存儲庫作爲服務注入控制器嗎?另外如果我使用注入,那麼' - > entityManager-> getRepository'有什麼意義呢?感謝並抱歉,如果問題太多 –