Este artículo forma parte de la serie Symfony2 y presupone que Ud. ha:
– Instalado y configurado Symfony2 Standard Edition, se recomienda leer: Instalando y configurando Symfony2 en un ambiente compartido
– Instalado y configurado APC se recomienda leer: Instalar Alternative PHP Cache (APC) en CentOS
Partamos de la idea de que estamos desarrollando una API Restful y que deseamos cachear las respuestas de cada acción ejecutada en los Controladores (Controller), para ello:
Configuramos el Listener en nuestro config.yml
... services: # Identificador del Listener request.listener: # Listener Namespace and nombre de la clase class: AcmeDemoBundleEventListenerRequestListener # Inyección de dependencia: Contenedor de servicios calls: - [ setContainer, [ @service_container ] ] # Definición del servicio como Listener: los eventos a observar son kernel.request (cada vez que se realiza una # petición Http), KernelResponse (cada vez que se devuelve una respuesta a la petición Http), kernel.exception # (cada vez que ocurre una excepción) tags: - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } ...
Crear dir EventListener dentro de AcmeDemoBundle
$ mkdir src/Acme/DemoBundle/EventListener
Crear Listener
Nuestra clase debe implementar la interfaz ContainerAwareInterface
class RequestListener implements ContainerAwareInterface
Inyectamos el contenedor de servicios
/** * @var ContainerInterface */ protected $container; public function setContainer(ContainerInterface $container = null) { $this->container = $container; }
Verificamos si existe un Objeto Response cacheado para la Petición correspondiente
/** * This method is executed for every Http Request. If the content is found * in Apc Cache the execution flow is stopped and a Response is returned * inmediately, no controller action is executed. * @param GetResponseEvent $event * @return type */ public function onKernelRequest(GetResponseEvent $event) { // No caching for dev enviroment if ($this->container->getParameter('kernel.environment') === 'dev') { return; } $request = $event->getRequest(); // Cahing only for Http Get method if ('GET' !== $request->getMethod()) { return; } // Build Apc cache key $path = 'controller.' . $request->getPathInfo(); $qs = $request->getQueryString(); // For caching request with query string if you do not aware of it // comment out if (!empty($qs)) { $path .= '.' . sha1($qs); } if (apc_exists($path)) { $event->setResponse(apc_fetch($path)); } }
Cacheamos el Objeto Response
/** * This method is executed after a Controller action and before the Response * is returned to the Browser or to another agent. Stores the Response object, * If it has not been cached * * @param FilterResponseEvent $event * @return type */ public function onKernelResponse(FilterResponseEvent $event) { // No caching for dev enviroment if ($this->container->getParameter('kernel.environment') === 'dev') { return; } $request = $event->getRequest(); // Cahing only for Http Get method if ('GET' !== $request->getMethod()) { return; } // Build Apc cache key $path = 'controller.' . $request->getPathInfo(); // For caching request with query string if you do not aware of it // comment out $qs = $request->getQueryString(); if (!empty($qs)) { $path .= '.' . sha1($qs); } if (!apc_exists($path)) { apc_store($path, $event->getResponse()); } }
Evitamos cachear las excepciones
/* * This method prevent to cache Response when occurs Exceptions */ public function onKernelException(GetResponseForExceptionEvent $event) { $event->stopPropagation(); }
Verificamos que el listener ha sido registrado
$ php app/console container:debug ... request.listener container AcmeDemoBundleEventListenerRequestListener ...
Ahora si ponemos en nuestro navegador:
– http://localhost/symfony-standard/web/app.php/demo/hello/World
e inspeccionamos la cache vemos lo siguiente.
Puedes obtener la clase EventListener en:
Github
disculpa pero en este momento estas programando en java? para enlazarlo a la base de datos ? saludos.
@Argelio no entiendo tu pregunta
lo que pasa es que necesito crear un listener para mi base de datos y no si el listener se crea en java? no se si me explico :s
Esta hecho usando symfony2 (PHP) no necesitas Java