Source: Ticarte Blog

Ticarte Blog Symfony 5: Tutorial para desarrollar tu primera aplicación web

Symfony es un proyecto PHP de software libre que permite crear aplicaciones y sitios web r&aacute;pidos y seguros de forma profesional.En este tutorial podr&aacute;s iniciarte en el desarrollo de aplicaciones web con Symfony siguiendo los pasos que te indicamos y adapt&aacute;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&oacute;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&oacute;n y los requerimientos de Symfony:symfony check:requirements Creaci&oacute;n de proyectoInformaci&oacute;n ampliada Crear el proyecto completo como aplicaci&oacute;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&aacute;s informaci&oacute;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&oacute;n del controlador de p&aacute;ginaInformaci&oacute;n ampliadaCrear una ruta (Route) para acceder a la p&aacute;gina y un controlador (Controller) que construya la p&aacute;gina. Para crear las rutas utilizaremos anotaciones que nos permitir&aacute;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&oacute;n de un controlador y su plantilla mediante el siguiente comando:php bin/console make:controller M&aacute;s informaci&oacute;n:Toda la informaci&oacute;n sobre routas (Routes)Toda la informaci&oacute;n sobre controladores (Controllers) Renderizaci&oacute;n de plantillasPodemos renderizar la salida de la p&aacute;gina gracias al lenguaje Twig, el cual est&aacute; 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&eacute; 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&aacute;s informaci&oacute;n:Toda la informaci&oacute;n sobre plantillas (Templates) Referencias a recursosInformaci&oacute;n ampliadaEl componente Asset nos permite generar URLs que nos dirijan a recursos est&aacute;ticos de nuestra aplicaci&oacute;n web como hojas de estilos CSS, archivos JavaScript o archivos de im&aacute;genes, así como controlar las distintas versiones de estos archivos. S&oacute;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&oacute;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&aacute;. El comando crear&aacute; la entidad dentro de la carpeta src/Entity y su repositorio dentro de src/Repository:php bin/console make:entity Preparar la migraci&oacute;n de datos y ejecutar la migraci&oacute;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&aacute;ticamente para la entidad, lo que nos crear&aacute; el formulario, el controlador y las plantillas:php bin/console make:crud Personalizar el formulario de creaci&oacute;n/edici&oacute;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&aacute;s informaci&oacute;n:Toda la informaci&oacute;n sobre formularios (Forms)Toda la informaci&oacute;n sobre campos del formulario (Form Types) Personalizar el controlador de creaci&oacute;n/edici&oacute;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&aacute;ginas creadas en templates/product/. Validaci&oacute;n de entidades y formulariosInformaci&oacute;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&oacute;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", *

Read full article »
Est. Annual Revenue
$100K-5.0M
Est. Employees
1-25
CEO Avatar

CEO

Update CEO

CEO Approval Rating

- -/100