Listado y Creación de Empresas en Symfony

Clase 9 de 17Curso de Symfony Framework

La vista del administrador

En la clase anterior comenzamos a desarrollar la funcionalidad del usuario administrador, aprendiste cómo crear un nuevo controlador, cómo vincularlo a una URL y cómo desarrollar un template.

En esta clase vamos a darle concretud mediante un ejemplo de nuestro proyecto: el listado de las empresas registradas.

El listado de empresas

Usualmente las URLs que mapean a métodos index tienen como objetivo mostrar listados completos de objetos, en nuestro caso, se trata de ofertas.

Así que, realicemos las modificaciones que necesitamos para lograr ello.

Lo primero que vamos a requerir es acceder a las ofertas que existen, para ello tendremos que valernos de uno de los servicios que Symfony (más bien Doctrine) provee: el EntityManager.

En Symfony el concepto de Servicio es muy importante: se trata de clases que realizan alguna función, aunque su estado no es importante.

Básicamente podrías pensar que las clases de una aplicación Symfony se clasifican en Entidades y Servicios.

Una de las características más interesantes que ha introducido Symfony a partir de la versión 4 es el autowiring.

Se trata de un mecanismo que permite que las instancias de los objetos servicio disponibles en el Contenedor de Dependencias (otro de los componentes core del framework) sean inyectadas a cualquier método público que las requiera con sólo definirlas como parámetro.

El método index de CompanyController ahora debe declararse así:

public function index(EntityManagerInterface $entityManager) { $companies = $entityManager ->getRepository(Company::class) ->findAll(); return $this->render('company/index.html.twig', [ 'companies' => $companies, ]); }

Toda la “magia” del autowiring se basa en el uso extensivo de type-hinting (realmente no se trata de magia como te habrás imaginado).

El Contenedor de Dependencias identifica a cada servicio por su clase (o interface), de esa forma es sencillo determinar los argumentos que deberán utilizarse al momento de realizar la invocación de estos métodos.

¡Ah! Casi lo olvido, hay un par de sentencias use que debes agregar al comienzo (ver nota):

  • use Doctrine\ORM\EntityManagerInterface;
  • use App\Entity\Company;

Y ahora sólo nos queda adaptar el template templates/company/index.html.twig:

{% extends 'base.html.twig' %} {% block title %}Empresas registradas{% endblock %} {% block body %} <style> .example-wrapper { margin: 1em auto; max-width: 800px; width: 95%; font: 18px/1.5 sans-serif; } .example-wrapper code { background: #F5F5F5; padding: 2px 6px; } </style> <div class="example-wrapper"> <h1>Empresas registradas</h1> {% if companies|length > 0 %} <ul> {% for company in companies %} <li>{{ company.name }} - {{ company.email }}</li> {% endfor %} </ul> {% else %} <p>Aún no hay empresas</p> {% endif %} </div> {% endblock %}

Si refrescas tu navegador verás:

No hay empresas registradas

Lo cual es lógico… aún no se ha creado ninguna empresa :p.

Creación de una empresa

Para crear empresas será necesario contar con:

  1. Un nuevo método.
  2. Un nuevo template.

De modo que, ¡manos a la obra!

Antes de empezar a tirar código, sabemos que necesitaremos un formulario para ingresar los datos.

Para crearlo usaremos el comando php bin/console make:form.

En el nombre del formulario usaremos CompanyType (el sufijo Type es una convención de Symfony) y lo asociaremos a la entidad Company.

De este modo obtendremos una nueva clase src/Form/CompanyType, la cual contendrá los objetos que se usarán para crear el HTML del formulario (tanto en la creación de ofertas como en la edición).

Si vemos el formulario construido notaremos que falta algo… ¿Cómo hará el usuario para enviar los datos sin un botón de submit?

De modo que mejor lo agregamos al método CompanyType::buildForm():

$builder ->add('name') ->add('email') ->add('save', SubmitType::class, [ 'label' => 'Guardar', ]) ;

Ahora sí, armemos el nuevo método en CompanyController:

/** * @param Request $request * @param EntityManagerInterface $entityManager * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response * @Route("/company/new", name="company_new") */ public function create(Request $request, EntityManagerInterface $entityManager) { $company = new Company(); $form = $this->createForm(CompanyType::class); $form->setData($company); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $company = $form->getData(); $entityManager->persist($company); $entityManager->flush(); return $this->redirectToRoute('company'); } return $this->render('company/new.html.twig', [ 'form' => $form->createView(), ]); }

¡Listo! ¡Nuestro administrador ya puede crear empresas!

La pregunta que surge es ¿sólo el administrador puede crear empresas?

Pues así debería ser pero con lo que hicimos hasta ahora cualquiera con la URL correcta puede… hay que remediar eso.

En la próxima clase construiremos un sistema de login con el que limitaremos el acceso a las partes sensibles de nuestra aplicación.

¡Allá vamos!

Nota

El código mostrado lo he generado utilizando un IDE que agrega automáticamente las sentencias use. Si no cuentas con una herramienta como esta es posible que te encuentres con errores al ejecutar el código tal cual se ve. No te preocupes, Symfony te dará un mensaje sumamente claro respecto de qué debes corregir para que todo funcione.