2014-11-15 2 views
0

Я пишу контроллер для обработки базовой CRUD-функции и хотел бы знать, если бы я понял это правильно.Symfony 2: CRUD-Controller - как?

У Symfony много отличной функциональности и Интересно, если я изобретаю колесо в этом случае. У меня около 20 классов, которые будут расширены CRUDController, и я хотел бы использовать лучшие практики, как можно раньше.

Заранее благодарен!

CRUDController.php

namespace myApp\MyBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\BrowserKit\Response; 
use Symfony\Component\HttpFoundation\Request; 

class CRUDController extends Controller { 

    protected $repo; 
    protected $em = 'doctrine.orm.entity_manager'; 
    protected $templatePath; 
    protected $itemsAlias = 'items'; 
    protected $itemAlias = 'item'; 
    protected $listingTemplate = 'list'; 
    protected $saveTemplate = 'save'; 
    protected $templateFileExtension = '.html.twig'; 
    protected $entity; 
    protected $formType; 
    protected $formMethod = 'POST'; 
    protected $indexRoute; 
    protected $addSuccessMessage = 'Added.'; 
    protected $addErrorMessage = 'Not added'; 
    protected $editSuccessMessage = 'Edited.'; 
    protected $editErrorMessage = 'Not Edited.'; 

    public function indexAction() 
    { 
     return $this->render($this->templatePath . $this->listingTemplate . $this->templateFileExtension, array(
      $this->itemsAlias => $this->get($this->repo)->findAll() 
     )); 
    } 

    public function addAction(Request $request) { 
     return $this->save($request); 
    } 

    public function editAction($id, Request $request) { 
     return $this->save($request, $id); 
    } 

    protected function save(Request $request, $id = null) { 

     if (is_null($id)) { 
      $item = new $this->entity(); 
     } else { 
      $item = $this->get($this->repo)->find($id); 
     } 

     $form = $this->createForm(new $this->formType(), $item); 
     if ($request->isMethod($this->formMethod)) { 
      $form->handleRequest($request); 

      if ($form->isValid()) { 
       $em = $this->get($this->em); 
       $em->persist($item); 
       $em->flush(); 

       $this->get('session')->getFlashBag()->add(
        'success', 
        is_null($id) ? $this->addSuccessMessage : $this->editSuccessMessage 
       ); 
      } else { 
       $this->get('session')->getFlashBag()->add(
        'error', 
        is_null($id) ? $this->addErrorMessage : $this->editErrorMessage 
       ); 
      } 

      return $this->redirect($this->generateUrl($this->indexRoute)); 
     } 

     return $this->render($this->templatePath . $this->saveTemplate . $this->templateFileExtension, array(
      'form' => $form->createView(), 
      $this->itemAlias => $item 
     )); 
    } 
} 

MyController.php

namespace myApp\MyBundle\Controller; 
use myApp\MyBundle\CRUDController; 

class MyController extends CRUDController { 
    public function __construct() { 
     parent::__construct(); 

     $this->repo   = 'myapp.service.repository.item'; 
     $this->templatePath = '@myapp/items/'; 
     $this->itemsAlias = 'myItems'; 
     $this->itemAlias = 'myItem'; 
     $this->entity  = 'myApp\myBundle\Entity\Item'; 
     $this->formType  = 'myApp\myBundle\Form\Type\ItemType'; 
     $this->indexRoute = 'items_index'; 
    } 
} 
+1

Вместо того, чтобы кататься самостоятельно, подумайте о том, чтобы экспериментировать с одним из многочисленных пакетов кролов. Например: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html – Cerad

ответ

3

Основываясь на моем опыте - "Универсальный Crud Controller" является полезным только тогда, когда проект начинается. Во время разработки многие объекты требуют специальных модификаций. Вторая вещь о вашей идее: в методе сохранения вы должны иметь IF около $em->persist($item);, поскольку существующие объекты не могут быть сохранены снова. Последнее: во время разработки (и с использованием этого кода) вы должны думать о «владении стороной» отношений, потому что «Доктрина» может обрабатывать изменения только на стороне владеющих. Он создает проблемы следующим образом: Продукт имеет много категорий - отношение двунаправленное. Таблица объединений содержится в аннотации продукта. Вы можете добавить категорию в продукт и сохранить ее успешно. Но добавление продукта в категорию не будет сохранять изменения в базе данных (конечно, вы можете обрабатывать его вручную во время сохранения:]).

+0

Спасибо за ваш ответ! Я бы использовал «Universal Crud Controller» только для простой CRUD-функциональности. Если какой-либо метод требует разной функциональности, я бы перезаписал его. –