Funcionamiento interno

Este capítulo te dirá un poco sobre cómo funciona Silex internamente.

Silex

Aplicación

La aplicación es la interfaz principal de Silex. Implementa la HttpKernelInterface de Symfony2, por lo tanto puedes pasar una Petición al método handle que devolverá una Respuesta.

Esta extiende el contenedor de servicios Pimple, el cual permite flexibilidad tanto en el exterior cómo en el interior. Puedes sustituir cualquier servicio, y también serás capaz de leerlo.

La aplicación usa exhaustivamente el EventDispatcher para engancharse a los eventos HttpKernel de Symfony2. Esto te permite recuperar la Petición, convertir las cadenas de respuesta en objetos Respuesta y manipular excepciones. También lo usamos para despachar algunos eventos personalizados como los semiwares before/after y errores.

Controlador

El Enrutador de Symfony2 en realidad es bastante potente. Puedes nombrar rutas, lo cual te permite generar URL. También puedes tener requisitos para las partes variables. A fin de permitirte una interfaz agradable a través de estos ajustes en el método match (que es utilizado por get, post, etc.) devolviendo una instancia del Controller, que envuelve una ruta.

ControllerCollection

Uno de los objetivos de exponer el RouteCollection era hacerlo mutable, para que los proveedores le puedan agregar cosas. Aquí, el reto es el hecho de que las rutas no saben nada sobre su nombre. El nombre sólo tiene sentido en el contexto de la RouteCollection y no se puede cambiar.

Para resolver este desafío, se nos ocurrió tener una área de estacionamiento para las rutas. La ControllerCollection contiene los controladores hasta que se llama a flush, momento en el cual las rutas se añaden a la RouteCollection. Además, los controladores se congelan. Esto significa que ya no se pueden modificar y producirá una excepción si intentas hacerlo.

Desafortunadamente no se ha podido encontrar una buena manera para vaciarla implícitamente, por lo que el vaciado ahora siempre es explícito. La aplicación se debe vaciar, pero si quieres leer la ControllerCollection antes de que se lleve a cabo la petición, tendrás que llamar a flush tú mismo.

La Appication proporciona un atajo al método flush para vaciar la ControllerCollection.

Truco

En vez de crear tú mismo una instancia de RouteCollection, en su lugar usa la fábrica $app['controllers_factory'].

Symfony2

Silex utiliza los siguientes componentes de Symfony2:

  • HttpFoundation: Para Petición y Respuesta.
  • HttpKernel: Porque necesitamos un corazón.
  • Routing: Para concordancia de las rutas definidas.
  • EventDispatcher: Para conectar al HttpKernel.

Para más información, visita el sitio web de Symfony.

Bifúrcame en GitHub