我是Symfony的新人,我有一点问题。 我一直在网上搜索,无法找到问题的答案。 我创建API,我有两个控制器(UserController,InstructorController)与类似的方法(addUserImage,addInstructorImage)。我创建了抽象的BaseImage(这里是保存文件),InstructorImage和UserImage(这里是设置路径)。这是我的控制者:
/**
* @ApiDoc(
* name="addInstructorImage", section="Instructors",
* description="Add Instructor Image",
* )
*
* @Route("/instructor/{instructor}/image", name="instructors.image.add")
* @Method("POST")
*
* @param Request $request
* @param Instructor $instructor
* @View
*
* @return \FOS\RestBundle\View\View
*/
public function addInstructorImage(Request $request, Instructor $instructor)
{
$this->denyAccessUnlessGranted('edit', $instructor->getUser());
$image = new InstructorImage();
$form = $this->get('form.factory')
->createNamed('', InstructorImageType::class, $image, ['csrf_protection' => false, 'method' => 'POST']);
$form->handleRequest($request);
if ($form->isValid()) {
$image->setInstructor($instructor);
$em = $this->getDoctrine()->getManager();
$em->persist($image);
$em->flush();
return $this->view(null, Response::HTTP_NO_CONTENT);
}
return $this->view($form, Response::HTTP_BAD_REQUEST);
}
我的第二个控制器是相同的。 唯一的区别是另一个对象和另一种形式。优化此代码的最佳方法是什么?我应该创建添加照片或使用链处理程序的服务吗?也许你有更好的想法? 谢谢你的帮助
答案 0 :(得分:0)
简短的回答:不要浪费时间去尝试优化这类东西。
您的方法由19行代码组成。这是所有基本的锅炉板易于阅读的代码。我知道无论什么时候我看到重复的代码,我都试图尝试以某种方式结合它,但究竟会获得什么?将19行减少到15?
如果我要更改您的代码,那么我很想将一些业务逻辑转移到它自己的服务中。类似的东西:
InstructorManager::addImage($instructor,$image);
那将摆脱实体经理的锅炉板并提供一些抽象。虽然所有方法都在设置图像并调用flush,但可能会使测试更容易一些。非常值得努力。如果您还要添加其他管理器类型功能,那么可能是值得的。或者您可能希望能够从控制台应用程序添加图像。
当然,您可能需要在将来添加功能。也许您想在图像更改时通知某人。如果您发现自己需要修改重复的代码,那么您可以证明将公共代码移入其自己的服务的努力是合理的。
我想你可以使用容器的工厂功能为你的表单创建一个服务。特别是如果你有一堆这样的形式。但同样,几乎不值得努力,甚至可能使事情变得更难维持。