2017-12-06 3 views
1

를 컨트롤러에 교리 Manager 인스턴스를 주입 Doctrine Manager 인스턴스를 수동으로 생성하지 않으면 더 편리 할 것입니다.심포니는 다음과 업데이트 작업을 정의 할 수 있습니다, 메소드 인자 컨트롤러에서

/** 
    * @Route("/product/edit/{id}") 
    */ 
    public function updateAction(Product $product, ObjectManager $em) 
    { 
     $product->setName("new name"); 
     $em->flush(); 
    } 

대신 긴 코딩의 : 다음과 같이 당신이 할 수 있어야한다, 그래서 나는 아직 Symfony4을 시도했지만 공식 심포니 문서에 근거하지 않은

/** 
* @Route("/product/edit/{id}") 
*/ 
public function updateAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $product = $em->getRepository(Product::class)->find($id); 

    if (!$product) { 
     throw $this->createNotFoundException(
      'No product found for id '.$id 
     ); 
    } 

    $product->setName('New product name!'); 
    $em->flush(); 

    return $this->redirectToRoute('app_product_show', [ 
     'id' => $product->getId() 
    ]); 
} 

답변

2

, 동작 기반 의존성 주입은,이 당신의 행동에 대한 인자로서 서비스 인터페이스를 선언함으로써 서비스를 사용하는 것.

당신이 컨트롤러에서 서비스가 필요한 경우

https://symfony.com/doc/4.1/controller.html#controller-accessing-services

, 그냥 입력 - 힌트의 클래스 (또는 인터페이스) 이름의 인수입니다. 따라서 귀하의 경우는 다음과 같아야합니다

: 심포니가 자동으로 당신이 필요로하는 서비스를 전달합니다

/** 
    * @Route("/product/edit/{id}") 
    */ 
public function updateAction(Product $product, EntityManagerInterface $em) 
{ 
    $product->setName("new name"); 
    $em->flush(); 
} 
+0

덕분에, 그건 정말 마술! 하지만 어떻게 내부에서 작동합니까? – TangMonk

+0

정말 모르겠지만 반사 수업을 통해 성취했다고 생각합니다. –

관련 문제