Symfony2架构:如何将数据访问与业务逻辑分开?

时间:2014-06-24 16:00:53

标签: symfony doctrine-orm

我正在与Doctrine一起构建Symfony2应用程序。我在我的“Entity”文件夹中有我的Doctrine Entity对象,我的 Controller 文件夹中有一些REST控制器。现在我想添加可重用的业务逻辑。

我将尝试给出一个抽象/简单的例子: 想象一下,你有一个由零件组成的产品。所有部件都有价格。你想得到产品的价格。

所以你有一个名为 Product 的实体,它有一个引用 Part ProductHasPart 实体的ArrayCollection(Doctrine ManyToOne / OneToMany)。产品的价格是相关零件价格的总和乘以您需要在产品中存储的关系的频率(ProductHasPart)

直观地说,我只是将一个函数“getPrice”编写到产品实体中,但这感觉不对:

  • 这将混合数据访问和业务逻辑
  • 我的实体会变得非常庞大,因为那些业务逻辑功能会变得非常复杂
  • 这会使测试业务逻辑变得复杂。

那么我在哪里放置我的函数“calculateCosts()”?

到目前为止,我发现了两种理论方法:服务和模型。我经常读到Symfony2对此没有任何限制,但我还没有找到代码示例。

1 个答案:

答案 0 :(得分:4)

您可以创建名为Calculation的服务。它会进行成本计算。 您也可以不传递Product实体,而是传递CalculatedInterface。因此代码可以与其他实体实现的CalculatedInterface重复使用

实施例

service.yml:

    calculation:
         class: %calculation.class%

服务:

class Calculation
{
    /**
     * @param $entity
     */
    public function calculate($entity)
    {
       $entity->setTotal($entity->getValue1() + $entity->getValue2());

    }
    ...
控制器中的

$this->get('calculation')->calculate($entity);
$entityManager->persist($entity);
$entityManager->flush();