Symfony 2: CRUD-контроллер - как?

0

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

У 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';
    }
}
Теги:
design-patterns
crud

1 ответ

3
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню