2016-07-18 12 views
1

私はSymfonyで新しく、少し問題があります。 私はオンラインで検索していますが、私の問題に対する答えを見つけることができませんでした。 私はAPIを作成し、同様のメソッド(addUserImage、addInstructorImage)を持つ2つのコントローラ(UserController、InstructorController)を持っています。抽象BaseImage(ここではファイルを保存しています)、InstructorImageとUserImage(ここではパスを設定しています)を作成しました。これは私のコントローラーです:最適化 - 2つの同様のメソッド

/** 
* @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); 
} 

私の2番目のコントローラーは同じです。 唯一の違いは、別のオブジェクトと別のフォームです。このコードを最適化する最良の方法は何ですか?写真を追加するサービスやチェーンハンドラを使用するサービスを作成する必要がありますか?多分もっと良いアイデアがありますか? あなたのお手伝いをありがとうございます

+0

私はこの質問が[ProgrammersStack](http://programmers.stackexchange.com/)にはるかによく当てはまると思います。 – Jurik

+0

@Jurik他のサイトを参照するとき、[cross-postingが嫌になる]ことを指摘することはしばしば役に立ちます(http://meta.stackexchange.com/tags/cross-posting/info) – gnat

+0

もちろん、Wojciechは未回答のこの記事を削除する必要がありますすぐ質問。 @gnat - 移行のためにフラグを立てると便利です。 – Jurik

答えて

0

短い答え:この種のものを最適化しようとして時間を無駄にしないでください。

あなたのメソッドは19行のコードで構成されています。それはコードを読むのが簡単な基本的なボイラープレートです。私は重複したコードが見えるときはいつも、何とかしようとすると誘惑されますが、正確に何が得られるのでしょうか? 19行を15に減らす?

私はあなたのコードを変更しようとしていたが、私はビジネスロジックのいくつかをそれ自身のサービスに移すことに誘惑されるだろう。エンティティマネージャのボイラープレートを取り除くと抽象化のビットを提供する

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

:ような何か。すべてのメソッドが行っているが、イメージを設定してflushを呼び出すことができますが、テストするのが少し楽になるかもしれません。努力する価値はほとんどありません。あなたが追加する他のマネージャタイプの機能を持っているなら、それは価値があるかもしれません。または、あなたはコンソールアプリケーションから画像を追加できるようにしたいかもしれません。

将来的に機能を追加する必要はなくなります。画像が変更されたときに誰かに通知したいと思うかもしれません。重複したコードを修正する必要がある場合は、おそらく共通のコードを独自のサービスに移動するための努力を正当化することができます。

そして、コンテナの工場機能を使用してフォームのサービスを作成できるとします。特にこれらのフォームをたくさん用意していた場合は、しかし、もう一度、努力する価値はほとんどなく、物事を維持することをさらに困難にするかもしれません。

関連する問題