Jakub Staněk
Jakub Staněk

Reputation: 65

symfony repository logic functions

Hello i saw a lot of tutorials and still dont know how can i make custom functions in my already done repository.

this is content of my 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(),
    ));
}

and i just want to make some function to make controller more beautiful any ideas? if you give me and example how can i insert my data into database via custom repository function. I know how to make custom query thats all. Every help/idea is very helpfull!

Upvotes: 1

Views: 125

Answers (1)

genesst
genesst

Reputation: 1431

From here

Doctrine 2 ORM does not support INSERT via DQL or the DQL query builder. For a complete syntax, check the EBNF of DQL.

You can add more abstractions if you want your controller to look slightly more beautiful, off the top of my head (effective in 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: Use native controller functions to create a form and get the currently logged in user. And if you are not intend to add more complex logic between $form->isSubmitted() and $form->isValid() use just $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(),
        ));
    }
}

Upvotes: 1

Related Questions