Php Symfony2组织:在何处放置与数据库和其他实体交互的实体函数
我已经将一个PHP应用程序转换为Symfony2,还有另一个结构问题 在我的旧应用程序中,我会有可能作用于其他实体类的实体类……例如,我有一个搜索类和一个结果类。像search->updateSearch()这样的函数将对search类及其子结果类($this->result->setFoo('bar')进行操作。这只是不属于Symfony2实体类的实体相关函数的一个示例 据我所知,最具symfonyesque的方法似乎是创建一个服务,类似于searchHelper类,我可以将entity manager、$search和$result类传递给它,并在那里对它们进行操作 这听起来像是最好的行动方案吗Php Symfony2组织:在何处放置与数据库和其他实体交互的实体函数,php,entity-framework,symfony,Php,Entity Framework,Symfony,我已经将一个PHP应用程序转换为Symfony2,还有另一个结构问题 在我的旧应用程序中,我会有可能作用于其他实体类的实体类……例如,我有一个搜索类和一个结果类。像search->updateSearch()这样的函数将对search类及其子结果类($this->result->setFoo('bar')进行操作。这只是不属于Symfony2实体类的实体相关函数的一个示例 据我所知,最具symfonyesque的方法似乎是创建一个服务,类似于searchHelper类,我可以将entity ma
谢谢!听起来您应该使用Doctrins自定义存储库类。您可以在此处查看它们: 基本上,它们允许您在基本实体之上和之外添加自定义逻辑。此外,由于它们基本上是实体的扩展,因此加载它们和使用它们的功能非常容易:
//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);
}
}
对于这个场景,我使用模型管理器,它旨在成为一个业务层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;
}
您可能想看看感谢您的回复。根据Symfony2的文档,我不能肯定存储库是我应该使用的,这本书说:“您可以将存储库看作一个PHP类,它的唯一任务是帮助您获取某个类的实体。”因为我要寻找的不仅仅是获取实体,我认为模型管理员的建议可能更适用。不过,使用自定义存储库的好例子…我计划稍后再参考。
<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>