2013-10-15 54 views
0

我已經轉換一個PHP應用程序交給Symfony2中,並有另一個結構性問題互動實體功能...Symfony2的組織:在那裏把與數據庫和其他實體

在我的舊的應用程序我會實體類這可能會影響其他實體類......例如,我有一個搜索類和一個結果類。像search-> updateSearch()這樣的函數可以對搜索類和子結果類($ this-> result-> setFoo('bar'))進行操作,這只是一個與實體相關的函數的例子,不屬於Symfony2的實體類

從我可以告訴它看來最symfonyesque方法將創建一個服務,沿着searchHelper類的行,我可以通過實體管理器$搜索和$結果類,並在他們那裏工作。

這聽起來是不是最好的行動過程?

謝謝!

+0

你可能想看看http://symfony.com/doc/current/book/service_container.html – PMoubed

回答

2

對於這種情況我使用型號經理,它的意圖是與實體經營業務層ORM無關的接口。喜歡的東西:

<?php 

/** 
* Group entity manager 
*/ 
class GroupManager 
{ 
    /** 
    * Holds the Doctrine entity manager for database interaction 
    * @var EntityManager 
    */ 
    protected $em; 

    /** 
    * Holds the Symfony2 event dispatcher service 
    * @var EventDispatcherInterface 
    */ 
    protected $dispatcher; 

    /** 
    * Entity specific repository, useful for finding entities, for example 
    * @var EntityRepository 
    */ 
    protected $repository; 

    /** 
    * Constructor 
    * 
    * @param EventDispatcherInterface $dispatcher 
    * @param EntityManager $em 
    * @param string $class 
    */ 
    public function __construct(EventDispatcherInterface $dispatcher, EntityManager $em) 
    { 
     $this->dispatcher = $dispatcher; 
     $this->em = $em; 
     $this->repository = $em->getRepository($class); 
    } 

    /** 
    * @return Group 
    */ 
    public function findGroupBy(array $criteria) 
    { 
     return $this->repository->findOneBy($criteria); 
    } 

    /** 
    * @return Group 
    */ 
    public function createGroup() 
    { 
     $group = new Group(); 

     // Some initialization or creation logic 

     return $group; 
    } 

    /** 
    * Update a group object 
    * 
    * @param Group $group 
    * @param boolean $andFlush 
    */ 
    public function updateGroup(Group $group, $andFlush = true) 
    { 
     $this->em->persist($group); 

     if ($andFlush) { 
      $this->em->flush(); 
     } 
    } 

    /** 
    * Add a user to a group 
    * 
    * @param User $user 
    * @param Group $group 
    * @return Membership 
    */ 
    public function addUserToGroup(User $user, Group $group) 
    { 
     $membership= $this->em->getRepository('GroupBundle:Membership') 
     ->findOneBy(array(
      'user' => $user->getId(), 
      'group' => $group->getId(), 
     )); 

     if ($membership && $membership->isActive()) { 
      return null; 
     } elseif ($membership && !$membership->isActive()) { 
      $membership->setActive(true); 

      $this->em->persist($membership); 
      $this->em->flush(); 
     } else { 
      $membership = new Membership(); 
      $membership->setUser($user); 
      $membership->setGroup($group); 

      $this->em->persist($membership); 
      $this->em->flush(); 
     } 

     $this->dispatcher->dispatch(
      GroupEvents::USER_JOINED_GROUP, new MembershipEvent($user, $group) 
     ); 

     return $membership; 
    } 

然後將服務定義:

<service id="app.model_manager.group" class="App\GroupBundle\Entity\GroupManager"> 
    <argument type="service" id="event_dispatcher" /> 
    <argument type="service" id="doctrine.orm.entity_manager" /> 
</service> 

,你可以注入記錄器,郵件,路由器,或任何其他服務,你可以需要。

看看FOSUserBundle的經理,以獲得有關如何使用它們的示例和想法。

0

這聽起來像你應該使用教義自定義存儲庫類。您可以在這裏查看它們:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

基本上它們允許您在基本實體之上添加自定義邏輯。也正因爲他們基本上都是實體的擴展,這使得它可以很容易地在加載它們,使用它們的功能:

//Basic Entity File 
/** 
* @ORM\Entity(repositoryClass="Namespace\Bundle\Repository\ProductRepo") 
*/ 
class Product 
{ 
    //... 
} 

然後該實體回購文件:

//Basic Repo File 
use Doctrine\ORM\EntityRepository; 

class ProductRepo extends EntityRepository 
{ 
    public function updateSearch($passedParam) 
    { 
     // Custom query goes here 
    } 
} 
從控制器

然後您可以加載回購和使用功能:

//Controller file 
class ProductController extends Controller 
{ 

    public function updateSearchAction() 
    { 
     $productRepo = $this->getDoctrine()->getManager()->getRepository('Namespace\Bundle\Entity\Product'); 

     // Set $passedParam to what ever it needs to be 

     $productRepo->updateSearch($passedParam); 

    } 
} 
+0

謝謝你的迴應。根據Symfony2的文檔,我不確定存儲庫是我應該使用的,書中說:「您可以將存儲庫視爲一個PHP類,其唯一的工作是幫助您獲取某個類的實體。」 由於我正在尋找的不僅僅是獲取實體,我認爲模型管理者的建議可能更適用。 雖然使用自定義存儲庫的很好的例子...我打算稍後參考它。 – Pez