2017-12-06 1 views
1

In Regler Regler Sie eine Update-Aktion mit folgenden definieren:Symfony injiziert Lehre Manager-Instanz Methodenargumente

/** 
    * @Route("/product/edit/{id}") 
    */ 
    public function updateAction(Product $product) 
    { 
    // product is auto select from database by id and inject to controller action. 
    } 

Die automatische Injektion sehr bequem ist, aber, wie die Lehre Manager-Instanz injizieren Aktion an die Steuerung, Es wäre bequemer, Doctrine Manager manuell zu erstellen. wie folgt vor:

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

statt lange Codierung:

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

Antwort

2

ich Symfony4 nicht versucht haben, noch nicht, aber auf der offiziellen Symfony Dokumentation basiert, ist es handlungsorientierte Dependency Injection, so sollten Sie in der Lage sein, Verwenden von Services, indem Service-Schnittstelle als Argument für Ihre Aktion deklariert wird.

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

Wenn Sie einen Dienst in einem Controller benötigen, nur ein Argument, mit seiner Klasse (oder Schnittstelle) Name Typ-Hinweis. Symfony werden Sie automatisch den Dienst übergeben Sie benötigen:

Also in Ihrem Fall sollte es so aussehen:

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

Dank, das ist wirklich Magie! aber wie funktioniert es im internen? – TangMonk

+0

Ich weiß es nicht wirklich, aber ich denke, es ist durch Reflexion Klasse erreicht. –