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í:
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:
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:
Un nuevo método.
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():
¡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.
Buenas, ya que no está la template new.html.twig os dejo por aquí la que he montado yo :)
{%extends'base.html.twig'%}{%block title %}Nuevas empresas{%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:2px6px;}</style><divclass="example-wrapper"><h1>Nuevas empresas</h1>{{ form(form)}}</div>{%endblock%}
Gracias por el código, se le pasó al profesor.
Bufff, muy escasa la explicación, trato de hacer comparaciones con Laravel para quienes lo conocen les sea más fácil relacionar conceptos.
Prácticamente el autowiring es la inyección de dependencias de Laravel, es decir, mediante el nombre de la clase puedes pasar por el parámetro de una función lo que necesites.
Por cierto, esto tampoco se explica pero para ver la página tendrías que entrar a /company/new pero te dará un error porque no tenemos ningún template para eso, cosa qué faltó explicar...
Es increíble, me toco leer la explicación del profesor dos veces, luego todos los comentarios de los compañeros, solucionar cada error y lo logré.
Ya puedo adicionar empresas.
De no ser por la ayuda de los compañeros, hubiera sido muy difícil completar esta clase.
Si no se les muesra el formulario y les sale un error de que no encuentra la ruta, la solución es:
Añadir un archivo llamado: new.html.twig dentro de templates/company
Dentro de ese archivo colocar esto:
{{form(form)}}
Con eso debería pintarse su formulario
Es más fácil si usamos
php bin/console make:crud
para crear el controlador con todo lo necesario para listar, editar, modificar y borrar y, además, nos crea el formType y todas las vistas necesarias sin tener que rompernos tanto la cabeza
Como ya comentaron otros ojo porque aquí faltan varias cosas:
relacionado a las notas del profesor, no se está la indicación de agregar los "use" para que funcione el autowiring. Tuve que agregar varios (detallados abajo por RetaxMaster. Además tuve que agregar:
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
En CompanyType.php
No se indica crear el nuevo template (company/new.html.twig). Si no encuentra ese archivo no va a funcionar.
aunque está en el bloque de código de muestra al crear el nuevo método en CompanyController, no se hace mención a la importancia de la ruta ni el uso de parámetros que allí se muestra.
Les dejo mi CompanyController.php con los respectivos use funcionando:
Este curso se merece una mejor explicacion y darle un poquito mas de cariño. No le quito el esfuerzo dado al curso, pero no creo que sea la mejor ruta para aprender, si colocase mini videos o de alguna forma explicar lo que se va a usar en el curso, no solo colocar copie esto y listo, necesitamos esto copie y listo.
Un poco escasa esta parte, ni vista ni declaración del use.
Para el Request, usar: use Symfony\Component\HttpFoundation\Request;
Si están faltando explicaciones y código, gracias a los comentarios de los compañeros, que no soy un novato y a la documentación lo estoy sacando pero es lo que tu dices los que son muy nuevos tienen que estar más perdidos que un pulpo en un garaje ;-).
Tampoco está implementado el arrayAccess y en mi caso da error, así quedaría mi código añadiendo los métodos de la implementación:
use App\Repository\CompanyRepository;use ArrayAccess;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\Common\Collections\Collection;use Doctrine\ORM\MappingasORM;/**
* @ORM\Entity(repositoryClass=CompanyRepository::class)
*/classCompanyimplementsArrayAccess