es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Manejo de formulario de devolución y redirección en servicio en Symfony5.

Quería manejar el formulario como un servicio porque los necesitaré en varios controladores

App\Controller

<p>$todo = new Todo();</p>

<p>$todo
    ->setOwner($this->getUser())
    ->setCreationDate(new \DateTime());
$form = $this->createForm(TodoType::class, $todo, [
    'userId' => $this->getUser(),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid())
{
    $entityManager->persist($todo);
    $entityManager->flush();</p>

<pre><code>return $this->redirectToRoute(todos');
</code></pre>

<p>} </p>

<p>return $this->render('todo/todos.html.twig', [
    'form' => $form->createView(),
]);

Así que lo convertí en un servicio y se ve así

class CreateTodo
{
    private $security;
    private $entityManager;
    private $formFactory;
    private $request;
    private $router;</p>

<pre><code>public function __construct(Security $security, EntityManagerInterface $entityManager, FormFactoryInterface $formFactory, RequestStack $request, RouterInterface $router)
{
    $this->security = $security;
    $this->entityManager = $entityManager;
    $this->formFactory = $formFactory;
    $this->request = $request;
    $this->router = $router;
}

public function createTodo() {
    $todo = new Todo();

    $todo
        ->setOwner($this->security->getUser())
        ->setCreationDate(new \DateTime());
    $form = $this->formFactory->create(TodoType::class, $todo, [
        'userId' => $this->security->getUser(),
    ]);
    $form->handleRequest($this->request->getCurrentRequest());
    if ($form->isSubmitted() && $form->isValid())
    {
        $this->entityManager->persist($todo);
        $this->entityManager->flush();

        return $this->router->generate('todos');
    } 
    return $form;
}

El problema es que no puedo enviar un formulario porque $form-&gt;createView() no existe, y si reemplazo return $this-&gt;router-&gt;generate('todos') con return $form, no me redirige, por lo que no se actualiza antes de que refresque. ¿Es una buena idea mover los formularios a servicios si los voy a usar en varios controladores?

Tags:  ,

Answer

  1. Avatar for davy.ai

    En primer lugar, para manejar el formulario como un servicio, debes modificar la clase CreateTodo para eliminar la declaración de retorno que devuelve el objeto del formulario y, en su lugar, devolver el resultado del envío del formulario. La clase modificada debería verse así:

    class CreateTodo
    {
        private $security;
        private $entityManager;
        private $formFactory;
        private $request;
        private $router;
    
        public function __construct(Security $security, EntityManagerInterface $entityManager, FormFactoryInterface $formFactory, RequestStack $request, RouterInterface $router)
        {
            $this->security = $security;
            $this->entityManager = $entityManager;
            $this->formFactory = $formFactory;
            $this->request = $request;
            $this->router = $router;
        }
    
        public function createTodo() {
            $todo = new Todo();
    
            $todo
                ->setOwner($this->security->getUser())
                ->setCreationDate(new \DateTime());
            $form = $this->formFactory->create(TodoType::class, $todo, [
                'userId' => $this->security->getUser(),
            ]);
            $form->handleRequest($this->request->getCurrentRequest());
            if ($form->isSubmitted() && $form->isValid())
            {
                $this->entityManager->persist($todo);
                $this->entityManager->flush();
    
                return $this->router->generate('todos');
            } 
            return null;
        }
    }
    

    De esta forma, puedes llamar al método createTodo desde cualquier controlador y se encargará del envío del formulario y devolverá la URL de redirección si el formulario se envió y es válido.

    En cuanto al problema de $form->createView() que no existe, simplemente puedes eliminar esa línea ya que ahora no estás devolviendo el objeto del formulario.

    En cuanto a si es buena idea mover los formularios a servicios si los utilizarás en varios controladores, puede ser una buena idea ya que promueve la reutilización del código y mantiene tus controladores limpios y enfocados en sus responsabilidades principales. Sin embargo, debes tener cuidado de no hacer que tus servicios sean demasiado genéricos, ya que eso puede hacer que sean más difíciles de mantener y menos claros en su propósito.

Comments are closed.