Форма в контроллере Symfony - PullRequest
0 голосов
/ 04 июня 2018

Я не понимаю, куда мне поместить код формы в моем проекте Symfony 4.Как я понимаю, у вас не должно быть бизнес-логики в контроллере, но вам нужно расширить Controller для использования $ this-> createForm.

class HomeController extends Controller
{
    public function index(Request $request)
    {
        $article = new Article();
        $form = $this->createForm(ArticleType::class, $article);
        $form->handleRequest($request);

       if ($form->isSubmitted() && $form->isValid()) {
           $article = $form->getData();

           $entityManager = $this->getDoctrine()->getManager();
           $entityManager->persist($article);

           return $this->redirect("/");
       }
       return $this->render('home/home.html.twig', [
            'form' => $form->createView()
       ]);
   }
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

В одном средне-большом проекте (или, чтобы быть более упорядоченным) вы должны поместить в папку src / Form / Type / (вы должны создать его).В вашем примере:

<?php
// src/Form/Type/ArticleType.php
namespace App\Form\Type;

use App\Entity\Article;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

//you must use the classes you use in the form
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;

class ArticleType extends AbstractType
{
   public function buildForm(FormBuilderInterface $builder, array $options)
   {
    //add your form code here
      $builder
         ->add()
         ->add ()
       ;
   }

   public function configureOptions(OptionsResolver $resolver)
   {
      $resolver->setDefaults(array(
      //write here your options
      ));
   }

   public function getBlockPrefix()
   {
      return null;
   }

}
0 голосов
/ 04 июня 2018

На мой взгляд, нет ничего плохого в использовании форм в Controller.Однако, если вы хотите сохранить свои контроллеры тонкими, вы можете перенести свою бизнес-логику в сервисы.Например:

App \ Controllers \ HomeController:

class HomeController extends Controller
{
    // Inject ArticleService
    public function index(Request $request, ArticleServiceInterface $articleService)
    {
        $article = new Article();
        $form = $this->createForm(ArticleType::class, $article);
        $form->handleRequest($request);

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

            $articleService->create($form->getData());

            return $this->redirect("/");
        }
        return $this->render('home/home.html.twig', [
            'form' => $form->createView()
        ]);
    }
}

App \ Services \ ArticleService:

class ArticleService implements ArticleServiceInterface
{
    private $entityManager;

    public function __construct(EntityManagerInterface $entityManager) {
        $this->entityManager = $entityManager;
    }

    public function create(Article $article)
    {
        // you may do some extra stuff here
        $this->entityManager->persist($article);
        $this->entityManager->flush();
    }
}

Это полный излишек в этом конкретном примере, нодает представление о том, как это может быть.

Подробнее в Документация Symfony .

...