优化——两种相似的方法
Optimization - Two similar method
我是 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);
}
我的第二个控制器是相同的。
唯一的区别是另一个对象,和另一个形式。优化此代码的最佳方法是什么。我应该创建添加照片的服务还是使用链处理程序?也许你有更好的主意?
感谢您的帮助
简短回答:不要浪费时间尝试优化此类内容。
您的方法由 19 行代码组成。这都是易于阅读的基本样板代码。我知道每当我看到重复的代码时,我很想尝试以某种方式组合它,但究竟会有什么收获呢?将 19 行减少到 15 行?
如果我要更改您的代码,那么我很想将一些业务逻辑移到它自己的服务中。类似于:
InstructorManager::addImage($instructor,$image);
这将摆脱实体管理器样板并提供一些抽象。尽管所有方法都在设置图像并调用刷新,但可能会使测试更容易一些。几乎不值得付出努力。如果您还需要添加其他管理器类型的功能,那么这可能是值得的。或者您可能希望能够从控制台应用程序添加图像。
当然,您将来可能不再需要添加功能。也许您想在图像更改时通知某人。如果您发现自己需要修改重复的代码,那么您可能可以证明将通用代码移到它自己的服务中的努力是合理的。
而且我想您可以使用容器的工厂功能为您的表单创建一个服务。特别是如果你有一堆这样的表格要制作。但同样,不值得付出努力,甚至可能使事情更难维护。
我是 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);
}
我的第二个控制器是相同的。 唯一的区别是另一个对象,和另一个形式。优化此代码的最佳方法是什么。我应该创建添加照片的服务还是使用链处理程序?也许你有更好的主意? 感谢您的帮助
简短回答:不要浪费时间尝试优化此类内容。
您的方法由 19 行代码组成。这都是易于阅读的基本样板代码。我知道每当我看到重复的代码时,我很想尝试以某种方式组合它,但究竟会有什么收获呢?将 19 行减少到 15 行?
如果我要更改您的代码,那么我很想将一些业务逻辑移到它自己的服务中。类似于:
InstructorManager::addImage($instructor,$image);
这将摆脱实体管理器样板并提供一些抽象。尽管所有方法都在设置图像并调用刷新,但可能会使测试更容易一些。几乎不值得付出努力。如果您还需要添加其他管理器类型的功能,那么这可能是值得的。或者您可能希望能够从控制台应用程序添加图像。
当然,您将来可能不再需要添加功能。也许您想在图像更改时通知某人。如果您发现自己需要修改重复的代码,那么您可能可以证明将通用代码移到它自己的服务中的努力是合理的。
而且我想您可以使用容器的工厂功能为您的表单创建一个服务。特别是如果你有一堆这样的表格要制作。但同样,不值得付出努力,甚至可能使事情更难维护。