我的控制器中有这个代码,需要' 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类,并且将它移动到控制器中的私有函数并不感觉正确。
我确定有一种我不知道的类型,它扩展了实体。或许我应该把这些函数放在我的实体类中。
答案 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
方法,但这只是我的看法。