set PATH=%PATH%;C:\your\path\here\
Bin
Dentro de este directorio podemos ejecutar los correspondientes comandos de symfony por consola para la ejecución de crear nuevos controladores, entidades tareas con bases de datos etc.
Config
Se guardan las rutas de nuestra aplicación el archivo routes.yaml y los servicios en el archivo services.yaml
Migrations
Mediante en consola se pueden crear las migraciones correspondientes en de las bases de datos al ejecutar el correspondiente comando para crear migraciones el archivo se guardará en esa ruta.
Public
En este directorio es donde se ve el contenido de la aplicacin lo ideal es tener aqui guardada toda la parte de archivos correspondientes en cuanto css, javascript imágenes etc...
Src
Dentro de esta carpeta es donde se guardan todo aquello relacionado con lo que hacemos mediante consola o directamente como controladores,repositorios,entidades formularios etc...
Templates
Se almacenan las plantillas correspondientes que se son llamadas desde el controlador para la visualicación de resultados usando el lenguaje plantillas twig.
Vendor
Este directorio es el principal de toda la aplicación de symfony por que es donde esta toda la configuración del framework por defecto junto con todos los paquetes que se van instalando mediante
la linea de comando de composer.
-En la raíz de directorios cabe destacar la existencia de dos ficheros muy importantes para el funcionamiento del framework tal como son el composer.json y el archivo .evn.
-El archivo composer .json nos va metiendo todo lo que vamos instalando mediante composer por consola mientras que el archivo .env nos indica el entorno de desarrollo o producción del framework junto con la configuración de la base de datos.
Este punto .env para tenerlo configurado mediante correctamente en cada uno de los modos que estemos usando ya sea en producción o en desarrollo tenemos que usar cualquiera de estos dos comandos.
Para tenerlo en producción
composer dump-env prod
Para tenerlo en desarrollo
composer dump-env dev
Y en la parte correspondiente a la base de datos dependiendo de la base de datos que usemos tenemos que poner los datos de conexion correspondientes como por ejemplo en este caso para mysql de manera genérica y orientativa.
DATABASE_URL="mysql://usuario:password@localhost:3306/basededatos?serverVersion=5.7"
Otra parte importante en el framework es poder personalizar las páginas 404 la cuáles se modifican
en la siguiente ruta.La página 404 de error.html.php
Ruta de Errores
vendor\symfony\error-handler\Resources\views
Nos metemos directamente en la carpeta raíz de nuestro 3 en uno de php apache y mysql, ya sea xampp wampp o appserv y dentro de la raíz de la correspodiente carpeta de aplicación en nuestro caso xampp e instalamos el skeleton del framework.
-Nos colocamos en nuestro caso en la raíz de xampp cd: c:\xampp\htdocs
-Comprobamos que nos funciona la consola de composer viendo el listado de comando mediante la siguiente instrucción.
composer php bin/console list
Y si queremos ver ya cualquier comando en particular
console list comando
Una vez que composer está funcionando correctamente introducimos el comando correspondiente para la descarga en nuestro caso el proyecto se llamará ejemplo que ha sido el nombre que le hemos dado antes al virtual host.
composer create-project symfony/website-skeleton ejemplo
Esto nos creará en la raíz la carpeta ejemplo con la configuración base para poder ir trabajando con symfony en caso de querer instalar más paquetes en la carpeta vendor lo iremos haciendo poco a poco mediante la documentación de symfony
composer require symfony/asset
composer require symfony/browser-kit
composer require symfony/cache
composer require symfony/config
composer require symfony/cache-contracts
composer require symfony/event-dispatcher-contracts
composer require symfony/deprecation-contracts
composer require symfony/http-client-contracts
composer require symfony/service-contracts
composer require symfony/translation-contracts
composer require symfony/css-selector
composer require symfony/dependency-injection
composer require symfony/dom-crawler
composer require symfony/event-dispatcher
composer require symfony/expression-language
composer require symfony/filesystem
composer require symfony/finder
composer require symfony/form
composer require symfony/http-client
composer require symfony/http-foundation
composer require symfony/http-kernel
composer require symfony/intl
composer require symfony/ldap
composer require symfony/lock
composer require symfony/messenger
composer require symfony/mime
composer require symfony/notifier
composer require --dev symfony/phpunit-bridge
composer require symfony/security-bundle
composer require --dev symfony/maker-bundle
composer require symfony/security-bundle
composer require symfony/process
composer require symfony/property-access
composer require symfony/runtime
composer require symfony/serializer
composer require symfony/translation
composer require symfony/uid
composer require symfony/validator
composer require --dev symfony/var-dumper
composer require --dev symfony/maker-bundle
composer require symfony/maker-bundle
composer require doctrine maker
Como las rutas se asocian a controladores es necesario,pese a que se volverá explicar después, como se relaciona una ruta con un controlador y para ello es necesario crear el controlador y la correspondiente vista. En este caso vamos a tratar de explicar lo que es una vista sencilla.
Como se puede observar se ha creado el correspondiente controlador con este comando
php bin/console make:controller InicioController
al cual se le ha llamado en este caso InicioController y nos ha creado el controlador junto template correspondiente y su carpeta inicio debajo de la carpeta template.
En el archivo routes.yaml podemos vincular la ruta al controlador y metodo indicado por ejemplo en este caso seria al controlador InicioController y a su metodo index
index: path: / controller: App\Controller\InicioController::index
Por otro lado la clase que se ha creado mediante composer en la carpeta src y que a su vez ha creado en templates la carpeta inicio con su archivo index.html.twig mediante esta asociación entre rutas y la clase Inicio Controller en el navegador nos va a permitir ver el contenido correspondiente.
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class InicioController extends AbstractController { #[Route('/inicio', name: 'inicio')] public function index(): Response { return $this->render('inicio/index.html.twig'); } }
En este caso deseamos pasar un valor por la url y que lo coja en en el método valor pasado InicioController del objeto InicioController. Por lo que escribimos esto a continuación la siguiente ruta en config/routes.yaml inicioget:
path: /inicio/{valor1} controller: App\Controller\InicioController::valorpasado
Y este es el código que va en el método del controlador
class InicioController extends AbstractController { public function valorpasado($valor1): Response { return $this->render('inicio/inicioget.html.twig', [ 'valor1' => $valor1 ]); } }
Luego en el archivo inicioget.html.twig imprimos el valor {{ valor1 }} de la manera que se indica con los dobles corchetes, en las plantillas también podemos pasar mediante el controlador vectores que luego en el template de twig se tienen que recorrer mediante la estructura for in que se muestra a continuación
Como se indica en el ejemplo y se puede ver en la documentación de twig para un vector pasado a la vista que se llame users y que tenga un campo que se llame username se mostraría de la siguiente manera.
Por ejemplo esta sería una ruta mas compleja con valores predeterminados pasados por get en el routes.yaml se pondría de la siguiente manera.
anunciosget2: path: /anuncios2/{valor2}/{valor2b} controller: App\Controller\InicioController::valorpasado2 defaults: { valor2: 'valor2', valor2b: 'valor2b'}
Dentro del inicio controller por ejemplo debemos de poner el siguiente método que recibe la llamada del yaml que dentro del archivo index2.html.twig se visualizaría imprimiendo entre corchetes los valores y recibiendo los valores fijos por get
public function valorpasado2($valor2,$valor2b): Response { $fecha=date('Y'); return $this->render('inicio/index2.html.twig', [ 'valor2' => $valor2, 'valor2b' => $valor2b ]); }
En esta ruta pasariamos dos valores simples que se cogerían por get en el routes.yaml
y luego en el método valorpasado3 del objeto InicioController lo recogería.
inicio3: path: /inicio3/{valor3}/{valor3b} controller: App\Controller\InicioController::valorpasado3
En el iniciocontroller cogemos los valores pasado por get mediante el routes yaml
y los pasamos al método que a su vez los pasará a la vista para imprimirlos.
public function valorpasado3($valor3,$valor3b): Response { $fecha=date('Y'); return $this->render('inicio/index3.html.twig', [ 'valor3'=> $valor3, 'valor3b'=> $valor3b ]); }
Mediante Symfony y composer podemos junto a su podera consola podemos crear todo tipo de código como Entitades,Controladores,Vistas,Bases de datos,Consultas Sql. La consola nos ahorra faena en cuanto a la creación inicial de estos contenidos pero lo ideal es poder saberlo hacer tanto con la consola como desde cero para poder detectar los posibles problemas que puedan surgir durante el desarrollo
Crear controladores
Para crear controladores debemos de ejecutar un comando como este sustituyendo la última palabra
de InicioController por el nombre de NuestroControlador con el correspondiente formato CamelCase
Con esto se nos creará el controlador debajo de src/controller y la correspondiente
carpeta de vista con su nombre debajo de templates/inicio/index.html.twig
php bin/console make:controller InicioController.
Crear Entidades
Para crear una entidad debemos por ejemplo llamada Anuncios deberíamos ejecutar el siguiente comando:
php bin/console make:entity
Se nos crean dos archivos como se muestran en la imagen.El archivo anuncios en src/entity/anuncios como Anuncios.php.
Y el src/Repository/AnunciosRepository que usaremos para obtener los datos
de la base de datos usándolo como si fuese un modelo en el que meter nuestras métodos sueltos, o combinándolo junto con anuncios.php invocados desde la parte de repository a los correspondientes namespace de anuncios, junto a los métodos que crea el querybuilder de doctrine.
Los métodos se crean en consola para sacar los datos correspondientes de la base de datos. Si quisieramos tener modelos sueltos si usar esta parte de las entidades aunque sea poco recomendable deberíaamos respetar la jerarquía del framework y con los namespaces correspondientes crear una carpeta que se llamase Model/AnuciosModel.php por ejemplo y ahi crear los métodos que necesitaramos
en ese momento.
A la hora de meter el comando para crear la entidad doctrine nos pide los nombres de los campos
y los formatos para cada uno de ellos si se desea saber el formato para cada uno de ellos se puede
obtener la información simplemente pulsando ? y así ya sabemos cuál es el tipo de datos que se ajusta más a nuestros deseos. Mediante doctrine podemos meter el tipo de tabla con su relación claves relacionadas etc y si tenemos creada y configurada bien nuestra base de datos(la cuál se puede hacer también por doctrine) se nos creará la estructura que le digamos.
A continuación dejamos un link a la documentación las múltiples tareas que se pueden hacer doctrine.
Doctrine nos permite hacer de todo Crear entidades bases de datos consultas aligerando mucho las tareas a realizar.
Actualizar la base de datos y ejecutar entidades Si queremos ejecutar los cambios que hemos hecho en la entidad o entidades correspondientes en nuestras bases de datos bastaría con ejecutar lo siguiente. php bin/console doctrine:schema:update --force
Lo interesante de poder combinar las entidades y los repositorios es poder usar la mezcla de ambos para la obtención de los datos queremos de manera sencilla por ejemplo para una entidad llamada anuncios, ya directamente mediante doctrine. En la entidad anuncios se nos carga lo siguiente en src\entity\anuncios
namespace App\Entity; use App\Repository\AnunciosRepository; use Doctrine\ORM\Mapping as ORM;Declaramos la entidad y llamamos mediante los namespace a Anuncios Repository que hay en src\respository\AnunciosRepository, junto a la correspondiente declaración del ORM de doctrine.
Mediante este código incrustado preferiblemente en el controlador e incoporando el namespace correspondiente de Entity\anuncios que llama mediante su correspondiente namespace de Repository\AnunciosRepository
$Anuncios=$this->getDoctrine()->getRepository(Anuncios::Class);
Mediante este código incrustado preferiblemente en el controlador e incoporando el namespace correspondiente de Entity\anuncios que llama mediante su correspondiente namespace de Repository\AnunciosRepository
/*cargamos el repositorio*/ $Anuncios=$this->getDoctrine()->getRepository(Anuncios::Class); $TodosAnuncios=$Anuncios->findAll();Mediante este codigo podriamos usar anuncios y anuncios repository sacado todo el contenido. El propio código de la clase AnunciosRepository nos muestra los métodos a los que llamar y el método que se puede crear con el propio query builder.
$An2=$Anuncios->findAll(); /** * @method Anuncios|null find($id, $lockMode = null, $lockVersion = null) * @method Anuncios|null findOneBy(array $criteria, array $orderBy = null) * @method Anuncios[] findAll() * @method Anuncios[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) */ class AnunciosRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, Anuncios::class); } // /** // * @return Anuncios[] Returns an array of Anuncios objects // */ public function findByExampleField($value) { return $this->createQueryBuilder('a') ->andWhere('a.exampleField = :val') ->setParameter('val', $value) ->orderBy('a.id', 'ASC') ->setMaxResults(10) ->getQuery() ->getResult() ; } /* public function findOneBySomeField($value): ?Anuncios { return $this->createQueryBuilder('a') ->andWhere('a.exampleField = :val') ->setParameter('val', $value) ->getQuery() ->getOneOrNullResult() ; } */ }Para poder obtener más información sobre el uso de query builder a continuación se deja un link a la documentación. Ver Query Builder
Otros comandos de composer que se pueden usar y que son interesantes para usar son:
Para crear base de datos
php bin/console doctrine:database:create
Configurar la base de datos
php bin/console symfony configure:database "mysql:host=localhost;dbname=bbdd" usario mi_password
Consultas sql en consola
php bin/console doctrine:query:"select * from tabla"
Realizar migraciones
php bin/console make:migration
php bin/console doctrine:migrations:migrate
Finalmente la última parte importante que nos queda por mencionar es como hacer consultas con sql nativo en symfony para ello hay que tener en el namespace de doctrine y ejecutar los comandos correspondientes y con un código sencillo como el que hay abajo se puede trabajar.
use Doctrine\ORM\Mapping as ORM; $conn=$this->getDoctrine()->getConnection(); $connection=$this->connectionbd(); $query = "SELECT * FROM tabla"; $prepararconsulta=$connection->prepare($query); $prepararconsulta->execute(); $resultado=$prepararconsulta->fetchall();
Hay multitud de componentes comandos, formularios y otras tareas para poder realizar con symfony en las que ya hay que mira la documentación en mayor profundidad pero con este tutorial ya se tiene una descripción guiada para poder empezar en condiciones con el framework Documentación Symfony