Symfony 5 framework php primeros pasos

Instalación básica Symfony 5 php framework desde cero.

07/08/2020

Symfony es un conjunto de componentes de PHP, y un Framework MVC (Modelo vista controlador) para aplicaciones web con cada vez más aceptación y que utilizamos en Indicus Software en muchos proyectos web.

Symfony es una herramienta adoptada por la mayoría de los proyectos de PHP más importantes del mercado. Los siguientes son algunos ejemplos:

  • Drupal
  • Joomla
  • Magento
  • Prestashop
  • Google API
  • Facebook API
  • Composer
  • phpMyAdmin

 

En esta publicación vamos a comentar cómo serían los primeros pasos con Symfony 5.

Symfony 5 utiliza Flex, y ya se puede considerar como una versión estable. No tiene demasiados cambios con respecto a la versión 4, pero sí que hay bastantes cambios respecto a versiones anteriores.

Respecto a la versión 3, Symfony cambia la filosofía, en el sentido de que solamente instalamos lo que necesitamos. Esto que es una gran noticia, pues no es necesario sobrecargar los servidores con recursos que no se van a utilizar, pero puede ser también un quebradero de cabeza para los programadores familiarizados con versiones anteriores, ya que utilidades que no requerían instalaciones de paquetes extra ahora, evidentemente lo requieren, conviene tener esto en cuenta.

Vamos a instalar Symfony. Recordemos que Symfony es un framework para trabajar con PHP, por lo que es indispensable tener PHP instalado.

Lo primero es repasar los requisitos.

Para programar con Symfony es necesario tener: Composer, Symfony y Git  además de un IDE de programación.

 

Instalación de Composer

Composer es un sistema de gestión de paquetes para trabajar con PHP. Permite instalar aplicaciones de packagist. Instala paquetes y dependencias desde línea de comando. Para instalar Composer iremos a la página principal https://getcomposer.org/

Una vez instalado ejecutaremos composer self-update

Con ello comprobamos que tenemos una versión estable de Composer.

 

Instalación de Symfony

Podemos instalar Symfony de aquí: https://symfony.com/download y aquí tenemos toda la documentación necesaria:  https://symfony.com/doc/current/setup.html

Debemos de asegurarnos de que Symfony está en la variable de entorno PATH del sistema, si no es así debemos incluirla.

Comprobaremos la instalación y los requerimientos de Symfony con esta sentencia: symfony check:requirements

Las recomendaciones que nos hacen para configurar el servidor PHP son muy útiles y conviene tenerlas en cuenta.

 

Ya estamos en disposición de crear un proyecto con Symfony. Podemos utilizar el servidor que tenemos con la instalación o bien un servidor como Xampp. Vamos a utilizar la segunda opción pues nos servirá para tener rodaje en las posteriores puestas en producción. Así instalaremos Xampp con la versión PHP 7.4 https://www.apachefriends.org/es/index.html

 

Vamos a crear un proyecto. Abriremos una consola dentro de la ubicación donde hemos instalado Xampp en la carpeta httdocs y ejecutamos:

symfony new nombre_proyecto –full

De este modo estaremos creando un proyecto web completo.

Esta sentencia creará todas las carpetas del proyecto.

 

Comprobar las características del proyecto creado:

php bin/console about

 

 

Lo siguiente es modificar el proyecto para ser servido por un servidor Apache:

composer require symfony/apache-pack

Esto antes venía de serie y ahora no, podemos desarrollar todo el proyecto web desplegándolo localmente desde el server interno que nos proporciona Symfony pero no desde un servidor como Xampp, si no hacemos esto no funcionarán las rutas desde un servidor apache, aunque instalemos ‘annotations’ (del que hablaremos después).

Creamos un host virtual para que sea lo más parecido a un server de producción: añadimos a nuestro host la línea (sólo describiremos el caso de Windows):

127.0.0.1 miproyecto.local.com
Y dentro de php en apache/config/extra/httpd-vhosts.conf damos de alta un host virtual
<VirtualHost *:80>
    ServerName miproyecto.local.com
    DocumentRoot "C:/servidores_php/xampp7_4/htdocs/miproyecto/public"
    <Directory "C:/servidores_php/xampp7_4/htdocs/miproyecto/public">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog "logs/miproyecto-error.log"
    CustomLog "logs/miproyecto-access.log" common
</VirtualHost>

 

Y con esto tenemos preparada nuestra web en la url: http://miproyecto.local.com/

 

Crear una página web.

 

En Symfony se sigue en modelo MVC, las vistas son cargadas por un controlador, y para acceder a ellas se hace mediante rutas, bien desde un archivo yaml, o en formato comentario justo encima del método del controlador.  Para poder utilizarlas es necesario que el proyecto tenga instalados los paquetes de annotations:

composer require annotations

Nota de interés:

Vemos que siempre aparece la frase composer.json has been updated. Esto significa que para cualquier futura instalación al ejecutar composer install (o composer update) todos estos paquetes serán instalados. Si algún usuario instala algo nuevo al subir al repositorio composer.json deja estas librerías preparadas para los demás, con un composer update, cada desarrollador tendrá las librerías disponibles. De este modo las librerías no son subidas al repositorio y solo son descargadas en la instalación.

 

De este modo podremos crear las rutas. En este momento estamos preparados para poder programar, es el momento de decidir el IDE. PHP es un lenguaje muy flexible en esto, se puede utilizar cualquier IDE con el que estemos familiarizados. El más aconsejado y utilizado puede ser Phpstorm, pero puede funcionar igualmente NetBeans. Cualquiera con el que estés acostumbrado sirve, la ventaja del Phpstorm pueden ser los pluggines que faciliten el trabajo, sobre todo si no se está familiarizado con el lenguaje, pero puede ser que ya estemos acostumbrados a los atajos de teclado de otro o simplemente el l&f, no es problema.

Empezaremos creando un controlador dentro de la carpeta Controller. En versiones anteriores, esta clase debía extender de Controller, ahora no hace falta. También los métodos debían tener su nombre acabado en ‘Action’ tampoco es a necesario ya. Es importante empezar a escribir la ruta entre ‘/** */’, que son los comentarios de php. E importar las librerías necesarias, con este sencillo código tendremos nuestra primera página.

Vemos el resultado:

En la práctica lo que vamos a hacer es crear una ruta y mostrar una página hecha con twig. Para ello deberíamos actualizar nuestro Symfony para que renderice plantillas twig… bla bla… pero podemos hacerlo todo automático con el comando:
php bin/console make:controller

Este comando nos creará todo lo necesario, además de un controlador y su plantilla, además del código para acceder a ella:

Y aquí el resultado:

Y el código en Micontrolador

/**
 * @Route("/micontrolador", name="micontrolador")
 */
public function index()
{
    return $this->render('micontrolador/index.html.twig', [
        'controller_name' => 'MicontroladorController',
    ]);
}

 

Un twig es un archivo muy parecido al html al que podemos inyectar desde el controlador varibles. Puede extender de otro twig que llamaremos base. Sería algo parecido al concepto de master en las páginas asp.

 

Conexión con una Base de datos MySQl

Symfony utiliza el ORM doctrine para el mapeo de datos (https://symfony.com/doc/current/doctrine.html).

De nuevo es necesario instalar las librerías necesarias en el proyecto:

composer require symfony/orm-pack

composer require --dev symfony/maker-bundle

 

Ahora debemos configurar el acceso a la base de datos para ello abriremos el archivo .env y configuramos la url que viene de ejemplo. Esto también ha cambiado con versiones anteriores, ya no se utiliza el archivo parameters.

Existe mucha documentación para crear tablas a partir de entidades, pero no tanta en sentido contrario. Para realizar el mapeo se utilizará una sentencia como esta:

php bin/console doctrine:mapping:import "App\Entity" xml --path=config/doctrine

Con ello quedarán generados los archivos xml, con anterioridad se utilizaban yml, pero ya están deprecados.

 Y a continuación las entidades:

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

Ya tenemos las entidades y los descriptores.

Ahora vamos a acceder a un sp desde el respositorio. Symfony nos aporta métodos que nos devuelven listas findAll, findby… etc, si lo que necesitamos es acceder a un sp no es tan sencillo.

A modo de recordatorio, con Symfony 3 bastaba con crear una clase que extendida de EntityRepository y en el archivo de mapeo yml se añade una línea: repositoryClass: AppBundle\Repository\Miclase

Dentro de esa clase podemos poner los métodos que deseemos y teníamos disponibles estos y los que por defecto tiene cualquier entidad.

Desde Symfony 4 no podemos hacer ya esto, y  debemos hacer lo siguiente:

Primero la clase donde construimos nuestros métodos, que debe ser como esta, la pondremos en la carpeta repository:

Y en la entidad definimos su repository-class (siendo cuidadoso con el namespace):

Ya solo nos queda instanciarlo en el controller. No describimos el método getFamilias pero sería una llamada a un sp de mysql que nos devolvería una lista de familias.

/**
 * @Route("/connect", name="connect_ggdd")
 */
public function conect()
{
   // $entityManager = $this->getDoctrine()->getManager();

    $idPais = 1;
    $familiasRepository =$this->getDoctrine()->getRepository("App:FamiliasProductos");
    $familias = $familiasRepository->getFamilias($idPais);
   
   return $this->render('micontrolador/index.html.twig', array("familias" => $familias));

}

 

Así quedaría el twig:

 
{% extends 'base.html.twig' %}

{% block title %}Hello MicontroladorController!{% 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">

    {% for familia in familias %}
        Producto: {{ familia.id_familia_producto }}. Familia: {{ familia.nombre }}<br>
    {% endfor %}
</div>
{% endblock %}

 

Y por fin el resultado:

 

Y esto es todo.

 

Juan Antonio Martín , es desarrollador full stack PHP y tan apasionado de las matemáticas como de los toros.

¿Te ha gustado el artículo? ¡Compártelo!