优化 - 两种类似的方法

时间:2016-07-18 13:20:51

标签: php design-patterns copy-paste symfony

我是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);
}

我的第二个控制器是相同的。 唯一的区别是另一个对象和另一种形式。优化此代码的最佳方法是什么?我应该创建添加照片或使用链处理程序的服务吗?也许你有更好的想法? 谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

简短的回答:不要浪费时间去尝试优化这类东西。

您的方法由19行代码组成。这是所有基本的锅炉板易于阅读的代码。我知道无论什么时候我看到重复的代码,我都试图尝试以某种方式结合它,但究竟会获得什么?将19行减少到15?

如果我要更改您的代码,那么我很想将一些业务逻辑转移到它自己的服务中。类似的东西:

InstructorManager::addImage($instructor,$image);

那将摆脱实体经理的锅炉板并提供一些抽象。虽然所有方法都在设置图像并调用flush,但可能会使测试更容易一些。非常值得努力。如果您还要添加其他管理器类型功​​能,那么可能是值得的。或者您可能希望能够从控制台应用程序添加图像。

当然,您可能需要在将来添加功能。也许您想在图像更改时通知某人。如果您发现自己需要修改重复的代码,那么您可以证明将公共代码移入其自己的服务的努力是合理的。

我想你可以使用容器的工厂功能为你的表单创建一个服务。特别是如果你有一堆这样的形式。但同样,几乎不值得努力,甚至可能使事情变得更难维持。