gpt4 book ai didi

architecture - zf2 + 学说体系结构。如何使用对象管理器?

转载 作者:行者123 更新时间:2023-12-04 04:21:20 26 4
gpt4 key购买 nike

使用 Doctrine ObjectManager 的最佳方式是什么?我将它注入(inject) module.config.php 的 Controller

'Telecom\Controller\Users' => function($sm){
$ctr = new Telecom\Controller\UsersController();
$ctr->setEntityManager(
$sm->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
);

return $ctr;
},

然后我在我的 Controller 中使用它如下

$this->getEntityManager()->persist($entity);
$this->getEntityManager()->flush();

但是 Marco Pivetta(Doctrine 团队,zf2 贡献者)教导说“如果你在你的 Controller 中注入(inject) objectmanager,你将会有一个糟糕的架构”http://marco-pivetta.com/doctrine-orm-zf2-tutorial/#/39/11 .

所以请帮助我,使用 Entity Manager 的最佳架构方式是什么。我应该像我自己的服务一样使用另一个层来处理实体管理器吗?

最佳答案

如果 Controller 中有实体管理器,则引入了“域逻辑”(数据库查询)的耦合,它们与应用程序逻辑密不可分( Controller 应仅读取请求并返回正确的响应)。这种耦合使得重用和维护代码变得相当困难。

一种解决方案是创建注入(inject) Controller 的“服务”。服务封装业务逻辑(例如数据库查询)并为 Controller 提供定义良好的 API。好的是,如果业务逻辑在任何时候发生变化(它总是会);您只需更改所述服务的实现, Controller 将继续运行。

ZF2 非常灵活,有很多方法可以完成相同的任务。我个人执行以下操作:

服务

服务并不意味着只封装一个实体;它们应该封装执行该特定任务所需的所有实体。这完全取决于服务试图做什么。例如,更复杂的服务可能需要其他服务。

在我的实现中,我有一个名为 AbstractEntityService 的抽象类,该类针对所有需要持久性(需要数据库的任何服务)的服务进行了扩展。

这里的类(class)很长,但是下面是关键部分。

abstract class AbstractEntityService 
extends Service\AbstractService
implements EntityMapperAwareInterface, FormProviderInterface
{

public function __construct(
EntityMapper $entityMapper,
FormElementManager $formElementManager)
{
$this->entityMapper = $entityMapper;
$this->formElementManager = $formElementManager;

$this->getEventManager()->addIdentifiers(array(__CLASS__));

parent::__construct();
}

public function getForm($name)
{
return $this->formElementManager->get($name);
}

public function create(Entity\EntityInterface $entity)
{
$this->triggerEvent(static::EVENT_CREATE, array('entity' => $entity));

$entity = $this->entityMapper->insert($entity);

$this->triggerEvent(static::EVENT_CREATE_POST, array('entity' => $entity));

return $entity;
}

请注意 EntityMapperFormElementManager 已注入(inject) - 此处没有 ObjectManagerServiceLocator

实体映射器

只是对象管理器周围的薄层;这允许我们将 EntityManager 换成 DocumentManager,例如,如果我们从 MySQLMongoDB

interface MapperInterface
{
public function getObjectManager();

public function setObjectManager(ObjectManager $objectManager);

public function getRepository($className);

public function insert(EntityInterface $entity);

public function save(EntityInterface $entity);

public function delete(EntityInterface $entity);

public function flush();

}

因此,具体服务的示例是:

class ListService extends AbstractEntityService
{
public function __construct(
EntityMapper $entityMapper,
FormElementManager $formElementManager,
ListRepository $listRepository
){
parent::__construct($entityMapper, $formElementManager);
$this->listRepository = $listRepository;
}

protected function init(EventManagerInterface $eventManager){
parent::init($eventManager);
$eventManager->attach(static::EVENT_CREATE, array($this, 'createList'));
}

public function createList(EventInterface $event)
{
$list = $event->getParam('entity');

if (! $list instanceof Entity\ValueList) return;
$name = $list->getName();
if (empty($name)) {
$name = $this->formatName($list->getTitle());
$list->setName($name);
}
}

列表 Controller

Controller 然后简单地使用该服务(在上面的例子中它是一个“ListService”)

class ListController extends AbstractActionController {

public function __construct(
ListService $listService
){
$this->listService = $listService;
}

public function createAction(){
// validate request/form data...
$form = $this->listService->getListCreateForm();

$list = $this->listService->create($form->getData());

// return view...
}

哇哦;比计划的要长一些,但希望对您有所帮助。

关于architecture - zf2 + 学说体系结构。如何使用对象管理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22981089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com