Buceando en Symfony 2

Los marcos son temas candentes en la industria web y lo han sido durante algún tiempo. En este vasto mar de sabores está Symfony, un extenso framework PHP que sigue el siempre popular paradigma MVC. Su curva de aprendizaje es probablemente un poco más pronunciada que la de sus competidores, como CodeIgniter. No se preocupe, una vez que crezca en usted, se sentirá más poderoso que nunca y podrá desarrollar aplicaciones fantásticas..


1. Requisitos

En este artículo tendrás que usar un programa de consola. Personalmente me gusta Git Bash, pero cualquiera lo hará. También necesitarás tener rizo instalado para instalar Composer.

Si usted es un usuario de Windows, puede obtener todos los paquetes anteriores instalando Git para Windows, que está disponible aquí: Descargas de Git.


2. Lo que aprenderás

Durante este artículo aprenderás más sobre:

  • El flujo de aplicaciones de Symfony.
  • Instalando Symfony 2.1 utilizando Composer
  • La estructura de archivos de Symfony y los paquetes
  • La consola
  • Rutas y controladores
  • Respuestas
  • Ramita

3. Un ciclo de vida de Symfony

Antes de ensuciarnos las manos, quiero aprovechar un momento para explicar el flujo del ciclo de vida de Symfony.


La solicitud

Como todo lo demás en la web, todo comienza con una solicitud. Esto lo recoge Symfony, que coincidirá con nuestras rutas definidas (no se preocupe, esto se explicará más adelante), que luego se combinan con los controladores. Entonces le decimos a Symfony qué URL queremos que coincida con ciertos controladores y sus funciones..

El kernel

Aquí es donde ocurre la magia. Symfony analizará la URL y la relacionará con una de nuestras rutas. A continuación, cargará el controlador que hemos asignado a la ruta..

El controlador

El controlador se carga y se ejecuta una acción determinada según la ruta.

La respuesta

Al igual que con una solicitud HTTP normal, una solicitud de Symfony debe devolver un objeto de respuesta.
El objeto de respuesta se puede formar de varias formas, por ejemplo con encabezados.
Una acción debe devolver un objeto de respuesta válido o, de lo contrario, se lanzará una excepción..

Así que ahora has tenido una breve introducción a la mecánica de Symfony, ahora es el momento de sumergirte..


4. Instalación a través de Composer

Una de las cosas hermosas sobre el desarrollo web de hoy en día, son las herramientas disponibles para facilitar su proceso. Uno de ellos es Composer, un gestor de paquetes para PHP. Este artículo no incluirá los detalles del uso de Composer, pero si está interesado, esta es una excelente introducción: Easy Package Management with Composer

En primer lugar, si no tiene Composer instalado globalmente, puede descargar una instalación local ejecutando el siguiente comando:

 curl -s http://getcomposer.org/installer | php

Probar que la instalación funcionó escribiendo:

 php composer.phar

Si todo salió bien, debería ver un menú de comandos disponibles. Si no, verifique que haya configurado PHP en sus variables de entorno.

Ahora pasaremos a la instalación de Symfony. Reemplazar tu carpeta Con cualquier nombre de carpeta que desee para su proyecto. También puede reemplazar la versión al final con cualquiera de su elección. Recomiendo consultar Packagist: Symfony Framework Standard Edition para la última versión estable.

 php composer.phar create-project symphony / framework-standard-edition your-folder / 2.1.4

Ahora debería ver Composer descargando dependencias en la carpeta. Si su instalación salió bien, vaya a your-project.local / web / config.php - Aquí Symfony le informará sobre los requisitos del servidor que faltan o las extensiones opcionales que podrían mejorar el rendimiento o facilitar su desarrollo..

Cuando haya habilitado las extensiones requeridas y opcionales, vaya a /web/app_dev.php donde debería ver una pantalla de bienvenida con enlaces para varias experiencias de aprendizaje. Esto significa que Symfony fue instalado exitosamente - felicidades!


5. Introducción a la estructura de archivos de Symfony y paquetes

A primera vista, su carpeta raíz puede parecer un poco confusa. No te preocupes, hay una explicación lógica detrás de la estructura. Su raíz debe consistir en estas cuatro carpetas y algunos archivos. Puedes ignorar los archivos, ya que no son importantes en este momento.

 app / src / vendor / web /

El directorio de aplicaciones

Aquí es donde va la configuración de alto nivel de su proyecto. Por ejemplo, esta es la casa de la AppKernel clase que carga todo su código y bibliotecas de terceros en el marco para su uso.

los aplicación El directorio también contiene todos los archivos de configuración principales, que contienen información sobre el inicio de sesión en la base de datos, los modelos de seguridad, el enrutamiento y mucho más..

Su diseño HTML base también reside aquí.

El Directorio de Src

los src El directorio es el hogar de todo su propio código, que se agrupa en paquetes..

¿Quién o qué es un paquete??

Todo el código de Symfony se agrupa de forma lógica en lo que se conoce como paquetes. Por ejemplo, digamos que su proyecto tiene un sistema de usuario, entonces todos sus controladores orientados al usuario, CSS, JavaScript, entidades de base de datos, etc., estarán contenidos en un UserBundle. Lo bueno de este sistema es que puede tomar un paquete (por ejemplo, un paquete de administración de usuarios) y conectarlo a cualquier proyecto de Symfony..

Incluso puede descargar paquetes listos para usar de sitios web como los paquetes KNP. Entre las opciones populares están los paquetes de sistemas de usuario y los paquetes de generador de CRUD de administración. En el momento de escribir este artículo, el sitio tiene 1779 paquetes y 4068 desarrolladores..

El Directorio de Proveedores

Aquí almacenaremos todas las bibliotecas de terceros. Esto ya está lleno de bibliotecas, por ejemplo, Symfony, Doctrine, Assetic y más.

El directorio web

Este debe ser el directorio raíz de su dominio porque es el único directorio de acceso público de su proyecto. Esta es la casa de tus controladores frontales. app.php y app_dev.php archivos, que son los dos puntos de acceso público a su aplicación. Un usuario ingresará a su sitio a través de una URL como /app.php/products/jeans.

  • app_dev.php Es el punto de entrada principal al desarrollar tu aplicación. Cuando estés usando esto como tu punto de entrada, Symfony omitirá el almacenamiento en caché y te proporcionará una increíble barra de herramientas de desarrollo.
  • app.php Es el punto de entrada para el modo de producción. Esto se hace opcional a través de mod_rewrite, entonces las URLs /app.php/products/jeans y / productos / jeans En realidad, ambos apuntan a la misma ubicación.

6. Codificación con la consola ... Espera, ¿qué??

La consola ha demostrado ser una herramienta brillante en mi proceso de desarrollo y, por lo tanto, te digo: No debes temer a tu consola, porque eres el creador de todas las cosas..

Para mí, una de las cosas (maravillosamente) extrañas de cambiar a Symfony fue el uso intensivo de la consola..

Vamos a sumergirnos en ello. Abre tu consola y localiza la raíz del proyecto. Ingrese este comando:

 aplicación php / consola

Estos son los comandos a tu disposición. En su mayoría, estará utilizando los generadores, la caché y la gestión de activos. También utilizará esto para generar paquetes, generar esquemas de base de datos, depurar rutas, borrar caché y más.


7. Basta de hablar. Quiero codificar!

Con algunos conocimientos básicos sobre la estructura y la consola, ahora estás listo para sumergirte en Symfony!

Ir app_dev.php. La pantalla de bienvenida que ve aquí es en realidad un paquete, como el que crearemos en un minuto. Ir src / y borrar el directorio Cumbre. Si actualizas la página, verás un error. Esto es porque el AppKernel La clase está intentando cargar el paquete que acabamos de eliminar. Cada vez que agregue o elimine un paquete, deberá editar el AppKernel clase.

Tan abierto app / AppKernel.php. Verás una matriz como esta:

 $ bundles = array (new Symfony \ Bundle \ FrameworkBundle \ FrameworkBundle (), // ... Otros paquetes aquí);

Aquí es donde inicializarás nuevos paquetes. Si creas un paquete a través de la consola, se agregará automáticamente.

Más abajo debería ver un bloque de if como este:

 if (in_array ($ this-> getEnvironment (), array ('dev', 'test'))) $ bundles [] = new Acme \ DemoBundle \ AcmeDemoBundle (); // ... Otros paquetes aquí

Estos son paquetes de desarrollo, es decir, paquetes que solo se cargan cuando estás en el entorno de desarrollo (app_dev.php). Verás que aquí es donde se inicializa nuestro paquete eliminado. Eliminar el AcmeDemoBundle alinea y guarda el archivo.

Si actualizas, ahora verás la página de excepciones de Symfony. Aquí es donde todas las excepciones detectadas lo redireccionarán y mostrarán más información. Verás una excepción que dice algo como esto:

 No se puede importar el recurso "@ AcmeDemoBundle / Controller / SecuredController.php" ... 

Esto se debe a que Symfony busca rutas definidas en el archivo del controlador. SecuredController.php (que estaba en el AcmeDemoBundle eliminado).

Entonces, ¿qué es una ruta?

Ahora es probablemente un buen momento para explicar un poco más sobre las rutas. Básicamente una ruta es una plantilla de URL. Imagina que tienes un blog, con publicaciones, por diferentes categorías. Así que querrás que el usuario ingrese en una URL como esta:

 www.myblog.com/categories/Category1 www.myblog.com/categories/Category2 y así sucesivamente ... 

En Symfony puedes definir plantillas de URL que coincidan con un controlador. Imagina el ejemplo anterior. Necesitaría una función, a la que se le dio el nombre de la categoría y buscó las publicaciones de blog que la usaban. En una aplicación MVC, y por lo tanto en Symfony, esta función está envuelta en un controlador. Así que básicamente se vería así:

 clase ControllerExample función pública showCategory ($ category_name) // Saque las publicaciones del blog por nombre de categoría y muéstrelas

Nota: este no es un código de Symfony válido, sino solo un ejemplo de un controlador de blog simple.

Ahora solo tendrá que vincular la acción del controlador y la URL. Esto se hace por rutas. La ruta en este caso se vería así:

 / categories / nombre

Cuando una cadena se escribe entre llaves, se interpreta como una variable, que luego se pasa a la acción dada. En Symfony puedes definir rutas en XML, YML o por anotaciones. Para mantenerlo simple, solo usaremos anotaciones en este tutorial.

Puede ver todas las rutas definidas usando el siguiente comando en la consola:

 aplicación php / consola enrutador: depuración

Pero recuerda, tuvimos un error. Esto se debe a que Symfony sigue buscando las rutas definidas en nuestro AcmeDemoBundle controlador (que no existe). Asi que abre app / config / routing_dev.yml y por ahora, todo lo que necesita saber es que todas las rutas están definidas o importadas en routing.yml y routing_dev.yml. Eliminar el _manifestación, _Bienvenido y _demo_secured llaves. Si actualizas, ahora verás Ninguna ruta encontrada para "GET /". Esto se debe a que no hay rutas que coincidan con la URL actual, así que hagamos una que lo haga.

Pero primero, un controlador

Al escribir rutas como anotaciones, escríbalas justo encima de la acción que deseará ejecutar cuando un usuario ingrese la ruta dada. Por lo tanto, lo que necesitamos ahora es un paquete, que mantendrá nuestro controlador y nuestra acción..

Abre tu consola e ingresa el siguiente comando:

 php app / console genera: paquete

Primero, debes ingresar el espacio de nombres de tu paquete. La plantilla general para esto es:

 Proveedor / BundleName

El vendedor es el autor del paquete. Aquí puedes poner el nombre de tu empresa o lo que quieras. Me gusta usar mis iniciales EP. Use lo que quiera, pero sea breve.

El nombre del paquete debe terminar con el paquete. Así que entraré en lo siguiente:

 EP / BlogBundle

A continuación, puede elegir el nombre que desea usar al identificar el paquete en su código.
Generalmente omito el nombre del proveedor, pero por el bien de este tutorial, simplemente presione enter.
Hay más pasos en el generador, pero querrá los valores predeterminados para este tutorial, así que simplemente presione Enter hasta que haya terminado..

Ahora abierto src / YourVendorName / BlogBundle / en tu editor Verás que se ha creado una estructura de paquete básica para ti. Ahora mismo, omitiremos los detalles y nos dirigiremos directamente al directorio del controlador. Abierto DefaultController.php en el controlador /.

Esto se parece mucho al ejemplo básico que escribí antes, excepto que el controlador es un derivado del Controlador, una clase del paquete de framework Symfony, que contiene la funcionalidad básica de un controlador.

Si observas la acción, notarás algunas anotaciones que se ven así:

 / ** * @Route ("/ hello / name") * @Template () * /

los @Ruta La anotación le dice a Symfony que queremos que coincida con la ruta / hola / nombre con la acción \ EP \ BlogBundle \ Controller \ DefaultController :: indexAction () y que hay una variable llamada nombre en la URL. Así que si alguien ingresa en URLs similares a estas:

 www.myblog.com/hello/Esben www.myblog.com/hello/Santa www.myblog.com/hello/Jesus

... todos irán al mismo lugar, porque todos se combinarán con el / hola / nombre ruta.

los @Modelo La anotación le dice a Symfony qué vista usar. Cuando se deja en blanco, Symfony adivinará qué vista usar vista según el nombre del controlador y el nombre de la acción.

Pero no todas las acciones deben devolver un objeto de respuesta válido?

El observador Padawan habrá notado ya que no hay un objeto de respuesta devuelto en esta acción, lo que afirmé que era un requisito anteriormente en el artículo.

Una respuesta es un objeto que contiene el código que desea mostrar, códigos de servicio, encabezados, etc. Por ejemplo, si desea mostrar una página "Hola mundo", hará algo como esto:

 devolver nueva respuesta ('Hello World!', 200);

Si desea crear una página para una llamada AJAX, se podría hacer así:

 devolver nueva respuesta (json_encode (array ('some_variable' => 'some value')), 200, array ('content-type' => 'application / json'));

Si desea redireccionar al usuario, puede hacerlo con un Redireccionar respuesta objeto.

Nota: Siempre puede modificar su respuesta para satisfacer sus necesidades: códigos de estado, encabezados y más. Nada esta fuera de limites.

Normalmente, si desea generar una vista para el usuario, devolverá un nuevo objeto de respuesta como este:

 return $ this-> container-> get ('templating') -> renderResponse ('EPBlogBundle: Predeterminado: index.html.twig', array ('name' => $ name));

Este es un acceso directo largo que devuelve un objeto de respuesta con una plantilla renderizada como su contenido. Afortunadamente, la clase de controlador base, a la que se extiende nuestro controlador, tiene muchas funciones de acceso rápido ingeniosas. Podemos usar su hacer() Método para ahorrarnos algo de tiempo:

 devuelva $ this-> render ('EPBlogBundle: Predeterminado: index.html.twig', array ('name' => $ name));

Esto es solo un atajo al primer método que mostré anteriormente. El primer parámetro es la vista para renderizar. Todas nuestras vistas están dentro de nuestro paquete en Recursos / vistas /. Las vistas se dividen en directorios según el controlador responsable de la vista. De ahí la convención de nombres. Paquete: Controlador: Ver.

Su vista de diseño base (la plantilla principal de su aplicación) está en app / Recursos / vistas /. Dado que esto no se encuentra en ningún directorio de Bundle ni Controller, simplemente se lo denomina :: base.html.twig. Una vista en su paquete, que se coloca en el directorio raíz de vistas de paquete, se denomina Paquete :: Vista.

 app / Resources / views / base.html.twig // :: base.html.twig src / BlogBundle / Resources / views / someView.html.twig // EPBlogBundle :: someView.html.twig src / BlogBundle / Resources / views /Default/index.html.twig // EPBlogBundle: Predeterminado: index.html.twig

Y por último, el segundo parámetro de nuestra hacer() La función son las variables que queremos que podamos acceder en nuestra Vista..

Plantillas con ramita

Twig es un motor de plantillas creado por Sensiolabs, los creadores de Symfony. Symfony viene incluido con Twig, aunque no es un requisito para usarlo.

Twig presenta una gran cantidad de funcionalidades agradables que están fuera del alcance de este artículo, pero puedes consultarlas en el sitio web oficial de Twig..

Si abres EPBlogBundle: Predeterminado: index.html.twig Verás un código que se ve así:

 Hola nombre!

Usos de la ramita y %% Como etiquetas de inicio y fin. Los frenos dobles hacen que salga algo, similar al equivalente de PHP de . Asi que nombre Significa generar el valor de nuestra variable. $ nombre (que le dijimos a Symfony que queríamos usar cuando creamos nuestro objeto de respuesta).

Para darte una pequeña muestra de la genialidad de Twig, te mostraré algunos filtros. Un filtro es una función que puedes aplicar a una variable. Se aplica utilizando esta sintaxis. var | filtro. Aquí hay unos ejemplos.

 name | upper // devuelve la variable en MAYÚSCULAS name | length // devuelve la longitud de la variable name | url_encode // devuelve la versión codificada en URL de la variable

Puede ver una lista completa de etiquetas, filtros y funciones en la documentación oficial de Twig. Lo que realmente hace a Twig increíble es que en realidad es muy fácil crear tus propios filtros y funciones. Pero tendrá que esperar por otro tutorial para obtener más información sobre Twig y su extensibilidad..


Conclusión

Este es el final de nuestro magnífico viaje, y ¡qué aventura!!

No solo hemos aprendido sobre la estructura de Symfony y los paquetes, sino también sobre el poder de las rutas y sus controladores. ¡Espolvorea esto con un poco de Twig y has sido presentado a Symfony! Volveré en breve con tutoriales más profundos sobre temas más específicos como la gestión de activos con Assetic y la plantilla con Twig. Gracias por leer.