在Symfony中,我应该在哪里放置实体依赖函数

时间:2015-05-04 20:57:23

标签: class symfony

我的控制器中有这个代码,需要' procedure_type'从请求和检查中查看是否存在具有该名称的ProcedureType。如果是,则使用该对象,否则创建新的ProcedureType,然后返回要使用的新对象。

// Check the typed in ProcedureType against existing types.
$procedureTypes = $entityManager->getRepository('IncompassSurgeryBundle:ProcedureType')->findBy(array('name' => $request->request->get('procedure_type'), 'vendor' => $vendorId));
if (empty($procedureTypes)) {
    // Create Procedure Type
    $procedureType = new ProcedureType();
    $procedureType->setVendor($vendor)
                  ->setName($request->request->get('procedure_type'))
                  ->setCreated(new \DateTime())
                  ->setUpdated($procedureType->getCreated());
    $entityManager->persist($procedureType);
} else {
    $procedureType = $procedureTypes[0];
}

我不认为这是最好的方法,我想把代码移到一个函数中,比如checkProcedureType(),但我不知道哪里最好的地方就是说。我不认为它可以进入Entity或Repository类,并且将它移动到控制器中的私有函数并不感觉正确。

我确定有一种我不知道的类型,它扩展了实体。或许我应该把这些函数放在我的实体类中。

2 个答案:

答案 0 :(得分:2)

服务是Symfony中几乎所有内容的答案2.创建这样的服务:

IPC

在services.yml文件中:

namespace Your\Bundle\Service;

class ProcedureService // Call this the way you want
{
    protected $entityManager;

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

    public function callMeTheWayYouWant($vendorId, $vendor)
    {
        // Check the typed in ProcedureType against existing types.
        $procedureTypes = $this->entityManager->getRepository('IncompassSurgeryBundle:ProcedureType')->findBy(array('name' => $request->request->get('procedure_type'), 'vendor' => $vendorId));
        if (empty($procedureTypes)) {
            // Create Procedure Type
            $procedureType = new ProcedureType();
            $procedureType->setVendor($vendor)
                ->setName($request->request->get('procedure_type'))
                ->setCreated(new \DateTime())
                ->setUpdated($procedureType->getCreated());
            $this->entityManager->persist($procedureType);
        } else {
            $procedureType = $procedureTypes[0];
        }

        // The rest of your code
    }
}

然后在你的控制器中使用它:

  your_service:
    class: Your\Bundle\Service\ProcedureService
    arguments: [@doctrine.orm.entity_manager]

答案 1 :(得分:1)

如果逻辑以某种方式与访问数据库相关,我总是去存储库。但是,如果像你这样的情况,我倾向于分析它的依赖图。

  

您的代码是否仅在同一类中的某些其他方法中重复?

如果是,请转到private方法。

  

这部分代码是否在其他地方重复使用,但不依赖某些服务?

您可以通过创建执行代码的单独的类和static方法来外化逻辑。 注意:很快就会变得混乱

  

最后,您的代码是否依赖于服务/配置?

创建一个单独的服务,注入服务/配置并调用它的方法。添加一些开销,如果你滥用它,但你应该没关系

就个人而言,在你的例子中,我会采用private方法,但这只是我的看法。