Symfony es un proyecto PHP de software libre que permite crear aplicaciones y sitios web rápidos y seguros de forma profesional.En este tutorial podrás iniciarte en el desarrollo de aplicaciones web con Symfony siguiendo los pasos que te indicamos y adaptándolos al sitio que desees construir. Requisitos previosAntes de instalar el ejecutable de Symfony, debemos tener instalado lo siguiente:Control de versiones GIT.Servidor web XAMPP o similar.Gestor de paquetes Composer.La ruta de los ejecutables de los anteriores programas debe estar incluida en la variable de entorno PATH. InstalaciónDescargar el instalador de Symfony:https://symfony.com/downloadSi el instalador no lo ha hecho, incluir la carpeta de Symfony en la variable de entorno PATH del sistema:Linux: export PATH="$HOME/.symfony/bin:$PATH"Windows: "C:\Archivos de Programa\Symfony"Comprobar la instalación y los requerimientos de Symfony:symfony check:requirements Creación de proyectoInformación ampliada Crear el proyecto completo como aplicación web:symfony new my_project_name --full Comprobar las características del proyecto creado:php bin/console about Crear en el proyecto soporte para ser servido por un servidor Apache (más información):composer require symfony/apache-pack Crear un Alias o un VirtualHost en Apache que apunte a la carpeta public del proyecto y visitar el proyecto desde un navegador web. Creación del controlador de páginaInformación ampliadaCrear una ruta (Route) para acceder a la página y un controlador (Controller) que construya la página. Para crear las rutas utilizaremos anotaciones que nos permitirán definirlas en los comentarios dentro del propio controlador.Instalar anotaciones:composer require annotations Crear el controlador en la carpeta del proyecto src/Controller/:<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
/**
* @Route("/lucky/number")
*/
public function number()
{
$number = random_int(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
} Comprobar las rutas creadas en el proyecto:php bin/console debug:router Podemos automatizar la creación de un controlador y su plantilla mediante el siguiente comando:php bin/console make:controller Más información:Toda la información sobre routas (Routes)Toda la información sobre controladores (Controllers) Renderización de plantillasPodemos renderizar la salida de la página gracias al lenguaje Twig, el cual está preparado para trabajar con plantillas, utilizar variables, sentencias de control, etc.Instalar Twig:composer require twig Definir el controlador para que renderice la salida:<?php
// src/Controller/LuckyController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class LuckyController extends AbstractController
{
/** * @Route("/lucky/number") */ public function number()
{
$number = random_int(0, 100);
return $this->render('lucky/number.html.twig', [
'number' => $number,
]);
}
} Crear las plantillas de Twig en la carpeta templates/:{# templates/lucky/number.html.twig #}
<h1>Your lucky number is {{ number }}</h1> Hacer que la plantilla herede el contenido de base.html.twig, que contiene la estructura general de un documento HTML. Hay que indicar en qué bloque de la plantilla padre se incluye el contenido:{# templates/lucky/number.html.twig #}
{% extends 'base.html.twig' %}
{% block body %}
<h1>Your lucky number is {{ number }}</h1>
{% endblock %} Más información:Toda la información sobre plantillas (Templates) Referencias a recursosInformación ampliadaEl componente Asset nos permite generar URLs que nos dirijan a recursos estáticos de nuestra aplicación web como hojas de estilos CSS, archivos JavaScript o archivos de imágenes, así como controlar las distintas versiones de estos archivos. Sólo vamos a utilizar la funcionalidad que nos permite hacer referencia a archivos desde las plantillas Twig. Instalar los paquetes necesarios:composer require symfony/asset Copiar los recursos (css, js, jpg, etc.) dentro de la carpeta public. Hacer referencia a los recursos desde las plantillas, por ejemplo, templates/base.html.twig:html>
<head>
<link href="{{ asset('css/main.css') }}" rel="stylesheet" /> Almacenamiento en base de datosInformación ampliadaSymfony utiliza el paquete Doctrine como ORM para el mapeo de datos entre objetos y bases de datos relacionales. Instalar los paquetes necesarios:composer require symfony/orm-pack
composer require symfony/maker-bundle Configurar el acceso a la base de datos en el fichero de variables del proyecto .env:# .env
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name" Crear la base de datos desde la consola:php bin/console doctrine:database:create Crear la entidad de datos con la que vamos a trabajar y añadimos todas las propiedades que poseerá. El comando creará la entidad dentro de la carpeta src/Entity y su repositorio dentro de src/Repository:php bin/console make:entity Preparar la migración de datos y ejecutar la migración para que se creen las tablas:php bin/console make:migration
php bin/console doctrine:migrations:migrate Para añadir nuevas propiedades a la entidad repetir los pasos anteriores, indicando al comienzo del comando el nombre de la entidad ya existente:php bin/console make:entity
php bin/console make:migration
php bin/console doctrine:migrations:migrate Crear el sistema CRUD automáticamente para la entidad, lo que nos creará el formulario, el controlador y las plantillas:php bin/console make:crud Personalizar el formulario de creación/edición de objetos de la entidad creado en src/Form/ProductType.php:namespace App\Form;
use App\Entity\Product;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ProductType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('Name', TextType::class, [
'label' => 'Name:',
'help' => 'Make sure to add a valid product name',
])
->add('Price', NumberType::class, [
'label' => 'Price:',
'help' => 'Add a decimal value',
])
->add('Description', TextareaType::class, [
'label' => 'Description:',
'help' => 'Explain your details',
'required' => false,
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Product::class,
]);
}
} Más información:Toda la información sobre formularios (Forms)Toda la información sobre campos del formulario (Form Types) Personalizar el controlador de creación/edición de objetos de la entidad creado en src/Controller/ProductController.php. Por ejemplo, añadir una nueva ruta que inserte un nuevo objeto en la base de datos directamente sin utilizar el formulario:/** * @Route("/new/example", name="product_new_example") */public function newExample(): Response
{
// you can fetch the EntityManager via $this->getDoctrine()
// or you can add an argument to the action: createProduct(EntityManagerInterface $entityManager)
$entityManager = $this->getDoctrine()->getManager();
$product = new Product();
// This will trigger an error: the column isn't nullable in the database
$product->setName('Laptop Lenovo');
// This will trigger a type mismatch error: an integer is expected
$product->setPrice('500');
$product->setDescription('Lenovo Ideapad 250');
// tell Doctrine you want to (eventually) save the Product (no queries yet)
$entityManager->persist($product);
// actually executes the queries (i.e. the INSERT query)
$entityManager->flush();
return new Response('Saved new product with id '.$product->getId());
} Personalizar las plantillas de las diferentes renderizaciones de páginas creadas en templates/product/. Validación de entidades y formulariosInformación ampliadaSymfony posee su propio mecanismo para validar tanto entidades como formularios. Instalar los paquetes necesarios:composer require symfony/validator doctrine/annotations Configurar la validación:# config/packages/framework.yaml
framework:
validation: { enable_annotations: true } Incluir las validades en la entidad mediante las anotaciones @Assert (listado de validaciones - Contraints):namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/** * @ORM\Entity(repositoryClass="App\Repository\ProductRepository") */class Product
{
/** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id;
/** * @Assert\NotBlank * @Assert\Length( * min = 2, * max = 255, * minMessage = "Your first name must be at least {{ limit }} characters long", * maxMessage = "Your first name cannot be longer than {{ limit }} characters" * ) * @Assert\NotEqualTo( * "Tablet", *