2016-07-18 2 views
1

저는 Symfony를 처음 사용하며 약간 문제가 있습니다. 온라인에서 검색 중이며 문제에 대한 답변을 찾을 수 없습니다. API를 만들고 비슷한 메서드 (addUserImage, addInstructorImage)를 사용하는 두 개의 컨트롤러 (UserController, InstructorController)가 있습니다. 나는 추상적 인 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

이 질문은 [ProgrammersStack] (http://programmers.stackexchange.com/)에 훨씬 적합하다고 생각합니다. 여기서 좋은 대답을 얻지 못할 수도 있습니다. – Jurik

+0

@jurik 다른 사이트를 참조 할 때 [cross-posting frowned at]을 가리키는 것이 도움이되는 경우가 많습니다 (http://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

물론 Wojciech는이 답변을 삭제해야합니다 질문. @gnat - 마이그레이션을 위해 플래그를 지정할 수 있다면 도움이 될 것입니다. – Jurik

답변

0

짧은 대답 : 이런 종류의 것들을 최적화하는 데 시간을 낭비하지 마십시오.

귀하의 방법은 19 행의 코드로 구성됩니다. 모든 기본적인 보일러 판은 코드를 읽기 쉽습니다. 나는 내가 중복 코드를 볼 때마다 그것을 어떻게 든 시도하고 결합하려고 시도하지만 정확하게 얻고 자하는 것이 무엇인지 알고있다. 아마 19 줄을 15 줄로 줄이는거야?

코드를 변경하려고한다면 비즈니스 로직의 일부를 자체 서비스로 옮기고 싶습니다. 다음과 같이하십시오 :

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

그러면 엔티티 관리자 보일러 플레이트가 제거되고 약간의 추상화가 제공됩니다. 모든 메소드가 이미지를 설정하고 flush를 호출하는 것만으로도 테스트하는 것이 더 쉽습니다. 노력할 가치가 거의 없습니다. 추가 할 다른 관리자 유형 기능이있는 경우 가치가있을 수 있습니다. 또는 콘솔 앱에서 이미지를 추가하고 싶을 수도 있습니다.

물론 나중에 기능을 추가해야 할 필요가있을 수 있습니다. 이미지가 변경 될 때 누군가에게 알리고 싶을 수도 있습니다. 중복 된 코드를 수정해야 할 필요가 있다면 공통 코드를 자체 서비스로 이동하려는 노력을 정당화 할 수 있습니다.

그리고 컨테이너의 공장 기능을 사용하여 양식에 대한 서비스를 만들 수 있다고 가정합니다. 특히 이러한 형태의 무리가 있다면. 그러나 다시 한번, 노력할 가치가 없으며 유지 보수하기가 더 어려워 질 수도 있습니다.

관련 문제