Entidades y bases de datos

En el archivo de configuración tenemos que poner la ruta a nuestra base de datos:

.env

DATABASE_URL=mysql://root:@127.0.0.1:3306/symfony

Para crear una entidad usamos lo siguiente:

php bin/console make:entity

Nos preguntará el nombre de la entidad y los campos ¡Ojo! que el id ya lo crea él.

Cuando ya hayamos creado todas las entidades que necesitamos tenemos que hacer una migración:

php bin/console make:migration

Esto nos crea un archivo Migration dentro de src/MIgrations con el sql que se tendría que ejecutar. Todavía no se ha mandado a la base de datos, se podría revisar. Para ejecutarlo tenemos que hacer lo siguiente:

php bin/console doctrine:migrations:migrate

Ojo, que esto nos afecta a la base de datos y nos podemos cargar cosas.

Aquí el mapeo de tipos: https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#doctrine-mapping-types

Para crear una entidad en la base de datos. Primero la usamos:

use App\Entity\Producto;

Y después hacemos lo siguiente:

$entityManager = $this->getDoctrine()->getManager();

$product = new Producto();
$product->setNombre(‘Keyboard’);
$product->setPrecio(1999);

// Guardamos el producto
$entityManager->persist($product);

// Actualizamos los datos en la BD
$entityManager->flush();

Para buscar un producto por id:

$product = $this->getDoctrine()
->getRepository(Producto::class)
->find($id);

Buscar un elemento:

$product = $this->getDoctrine()
->getRepository(Producto::class)
->findOneBy([‘nombre’ => ‘Keyboard’]);

Otras opciones:
$product = $this->getDoctrine()
->getRepository(Producto::class)
->findBy(
[‘name’ => ‘Keyboard’],
[‘price’ => ‘ASC’]
);

// Todos
$product = $this->getDoctrine()
->getRepository(Producto::class)->findAll();

https://symfony.com/doc/current/doctrine.html

Como hacer ingeniería inversa, obtener las entidades de una base de datos ya existente.

https://symfony.com/doc/current/doctrine/reverse_engineering.html

Plantillas con twig

Symfony usa como plantillas la librería externa twig.

Dispone de una serie de elementos que nos permiten hacer algo de programación pero toda orientada al diseño. Así, tenemos bucles o estructuras de control, filtros que podemos aplicar a las variables, pero no disponemos de las funciones de php.

Para imprimir una variable usamos {{ … }}

Para una etiqueta de programación usamos {% … %}

Para un comentario usamos {# … #}

Algunos ejemplos:

{% if users %}
    <ul>
        {% for user in users %}
            <li>{{ user.username|e }}</li>
        {% endfor %}
    </ul>
{% endif %}
{% if temperature > 18 and temperature < 27 %}
    <p>It's a nice day for a walk in the park.</p>
{% endif %}
{% for i in 0..10 %}
    * {{ i }}
{% endfor %}

Rutas en symfony

Hay muchas maneras de indicar las rutas en symfony, pero la más cómoda es usar annotations como hemos hecho en el ejemplo anterior:


 /**
* @Route("/hola/saludo")
*/

También podemos recuperar parámetros:


class HolaController
{
/**
* @Route("/hola/saludo/{nombre}")
*/
public function saludo($nombre)
{
$texto="Hola $nombre que tal";

return new Response(
'&lt;html&gt;&lt;body&gt;&lt;h1&gt; '.$texto.'&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;'
);
}
}

En nombre podemos usar un valor por defecto:

<strong>public function saludo($nombre='')[/php</strong>]

Y podemos usar expresiones regulares para indicar que queremos un tipo concreto de parámetro:

[php]</pre>
class HolaController
{
/**
* @Route("/hola/saludo/{numero<\d+>}")
*/
public function saludos($numero=1)
{
$texto="<h1>Hola que tal</h1>";
$res="";
for($i=0;$i<$numero;$i++){
$res.=$texto;
}
return new Response(
'<html><body>'.$res.'</body></html>'
);
}
/**
* @Route("/hola/saludo/{nombre}")
*/
public function saludo($nombre='')
{
$texto="Hola $nombre que tal";

return new Response(
'<html><body><h1> '.$texto.'</h1></body></html>'
);
}

}
<pre>

Primera página en symfony

Como vimos en el ejemplo de MVC desde cero, necesitamos una ruta y un controlador. Lo haremos todo junto.

Dentro de src\controller creamos una página llamada HolaController:


<?php
// src/Controller/HolaController.php
namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HolaController
{
/**
* @Route("/hola/saludo")
*/
public function saludo()
{
$texto="Hola que tal";

return new Response(
'<html><body><h1> '.$texto.'</h1></body></html>'
);
}
}

 

Si ahora vamos a la siguiente dirección, deberíamos ver el saludo:

http://localhost:8000/hola/saludo

Otra manera de crear un controlador es desde la consola:

 php bin/console make:controller adios

Esto nos crea lo siguiente:


<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

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

Instalar Symfony

Primero, instalar composer:

https://getcomposer.org/download/

Comprobar que tenemos php 7.1 o superior. Si no es así, debemos instalarla. La podemos instalar en otra carpeta.

Nos colocamos en htdocs, abrimos la consola y escribimos lo siguiente:

composer create-project symfony/website-skeleton mi_symfony

Para ejecutar nuestro symfony debemos hacer lo siguiente:

 cd mi_symfony
 php bin/console server:run

Y lo podremos ver en localhost:8000

Ejemplos de búsquedas en symfony

Una vez que obtienes el repositorio, tienes acceso a todo tipo de métodos útiles:

// consulta por la clave principal (generalmente 'id')
$product = $repository->find($id);
 
// métodos con nombres dinámicos para buscar un valor en función de alguna columna
$product = $repository->findOneById($id);
$product = $repository->findOneByName('foo');
 
// obtiene todos los productos
$products = $repository->findAll();
 
// busca productos basándose en el valor de una columna
$products = $repository->findByPrice(19.99);

También puedes utilizar los métodos findBy y findOneBy para obtener objetos en función de varias condiciones:

// busca un producto con ese nombre y ese precio
$product = $repository->findOneBy(array(
    'name'  => 'foo', 'price' => 19.99
));
 
// obtiene todos los productos con un nombre determinado
// y ordena los resultados por precio
$product = $repository->findBy(
    array('name'  => 'foo'),
    array('price' => 'ASC')
);
$repository = $this->getDoctrine()
    ->getRepository('AcmeStoreBundle:Product');
 
$query = $repository->createQueryBuilder('p')
    ->where('p.price > :price')
    ->setParameter('price', '19.99')
    ->orderBy('p.price', 'ASC')
    ->getQuery();
 
$products = $query->getResult();
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
    'SELECT p
       FROM AcmeStoreBundle:Product p
      WHERE p.price > :price
   ORDER BY p.price ASC'
)->setParameter('price', '19.99');
 
$products = $query->getResult();