Slimming Symfony2 Controller and Saving Logic

From the point of view of the MVC and Symfony2 pattern, I can slightly reduce my controller code by discarding some save logic . For example, given a standard new action like this:

public function newAction(\Symfony\Component\HttpFoundation\Request $request) { // Create a new entity and a new form type for managing $entity = $this->createNewEntity(); $form = $this->createForm($this->createNewFormType(), $entity); // If it GET just return the view if('GET' == $request->getMethod()) return array('form' => $form->createView()); // It POST request so bind the form $form->bindRequest($request); // ... and if it valid just persist the entity if($form->isValid()) : $em = $this->getEntityManager(); // Should be carried by controller? $em->persist($entity); // Should be carried by controller? $em->flush(); // Should be carried by controller? // Redirect the user to the default page return $this->redirect($this->getOnNewSuccessRedirectUrl($entity)); endif; // Return the view plus errors return array( 'errors' => $this->getValidator()->validate($entity), 'form' => $form->createView() ); } 

Would it be correct to move the logic to the repository ? Example (warning: may not work):

 class BaseRepository extends \Doctrine\ORM\EntityRepository { /** * Persist the entity (either new or existent) * * @param object $entity */ public function save($entity) { $em = $this->_em; $em->persist($entity); $em->flush(); } /** * Delete the entity. * * @param object $entity */ public function delete($entity) { $em = $this->_em; $em->remove($entity); $em->flush(); } } 

Controller Code:

 if($form->isValid()) : $this->getRepository()->save($entity); // Redirect the user to the default page return $this->redirect($this->getOnNewSuccessRedirectUrl($entity)); endif; 
+7
source share
2 answers

I think it is a good idea to transfer your problem and remove the logic from your controllers, but the repository is not suitable for this.

From the Symfony2 docs ( http://symfony.com/doc/current/book/doctrine.html#fetching-objects-from-the-database ):

You can think of the repository as a PHP class whose only job is to get objects of a particular class.

You should use only the repository class to retrieve data from the database.

I would move your persist / remove logic to a service (see http://symfony.com/doc/current/book/service_container.html ), so your controller code would be something like

 if($form->isValid()) : $this->get('service.entity')->save($entity); // Redirect the user to the default page return $this->redirect($this->getOnNewSuccessRedirectUrl($entity)); endif; 
+10
source

Chris is absolutely right.

But by the way:

Why do you reaffirm your essence in this way:

'errors' => $ this-> getValidator () β†’ validate ($ entity)?

You bind the request to the form, so errors are processed in the created view in the form form_errors (...) 'viewhelpers.

+4
source

All Articles