2017-09-05 47 views
1

你好,我看了很多教程,仍然不知道如何在我已经完成的存储库中创建自定义函数。symfony存储库逻辑函数

这是我CommentController的内容:

public function newAction(Request $request, $productId) 
{ 
    $comment = new Comment(); 
    $form = $this->formFactory->create(CommentForm::class, $comment); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $em = $this->get('doctrine')->getManager(); 
     /** @var Product $product */ 
     $product = $em->getRepository(Product::class)->find($productId); 

     $comment->setAuthor($this->tokenStorsge->getToken()->getUser()); 
     $comment->setProduct($product); 
     $comment->setContent($form->get('content')->getData()); 

     $this->em->persist($comment); 
     $this->em->flush(); 

    } 

    return $this->render(':form:comment.html.twig', array(
     'form' => $form->createView(), 
    )); 
} 

,我只是想做出一些功能,使控制器更美丽什么想法?如果你给我和例子如何可以通过自定义存储库函数将我的数据插入数据库。我知道如何自定义查询这一切。每一个帮助/想法都非常有用!

+1

你的动作大约为美如一个想它。持久性已经解耦,存储库隐藏了查询的复杂性,你看起来很好,IMO。 :) –

+0

是的,我会给查询,这不是我猜想的问题,但那些制定者呢?它不好,不是吗? –

+0

我认为这取决于你问谁。死硬的DDD迷可能希望隐藏起来。有些人可能会主张在施工时通过所有参数。我喜欢Symfony处理这个的方式 - 很明显 - 容易更新 - 易于测试 - 我个人对这种方法没有任何问题。 –

回答

1

here

学说2 ORM不经由DQLDQL query builder支持INSERT。有关完整语法,请检查the EBNF of DQL

您可以添加更多的抽象,如果你希望你的控制器会略有更漂亮,把我的头顶部(有效Symfony的2.8):

BaseController.php

namespace AppBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

abstract class BaseController extends Controller 
{ 
    /** 
    * @return ProductRepository 
    */ 
    protected function getProductRepo() 
    { 
     return $this->get('doctrine.orm.entity_manager')->getRepository(Product::class); 
    } 
} 

CommentController.php: 使用本机控制器功能来创建表单并获取当前登录的用户。如果你不打算增加$form->isSubmitted()$form->isValid()利用之间更复杂的逻辑只是$form->isValid()

class CommentController extends BaseController 
{ 
    public function newAction(Request $request, $productId) 
    { 
     $comment = new Comment(); 

     $form = $this->createForm(CommentForm::class, $comment); 
     $form->handleRequest($request); 

     if ($form->isValid()) { 
      /** @var Product $product */ 
      $product = $this->getProductRepo()->find($productId); 

      $comment->setAuthor($this->getUser()); 
      $comment->setProduct($product); 
      $comment->setContent($form->get('content')->getData()); 

      $this->em->persist($comment); 
      $this->em->flush(); 

     } 

     return $this->render(':form:comment.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 
}