Eventi del framework Symfony

Quando il framework Symfony (o qualsiasi altra cosa che usi Symfony\Component\HttpKernel\HttpKernel) gestisce una richiesta, alcuni eventi sono distribuiti, in modo che sia possibile aggiungere ascoltatori lungo il processo. Questi prendono il nome di “eventi del kernel”. Per maggiori dettagli, vedere Il componente HttpKernel.

Eventi del kernel

Ogni evento distribuito dal kernel è una sottoclasse di Symfony\Component\HttpKernel\Event\KernelEvent. Quindi ogni evento ha accesso alle seguenti informazioni:

getRequestType()
Restituisce il tipo di richiesta (HttpKernelInterface::MASTER_REQUEST o HttpKernelInterface::SUB_REQUEST).
getKernel()
Restituisce il Kernel che sta gestendo la richiesta.
getRequest()
Restituisce la richiesta gestita.

kernel.request

Classe evento: Symfony\Component\HttpKernel\Event\GetResponseEvent

Evento distribuito molto presto in Symfony, prima che venga determinato il controllore.

Vedi anche

Saperne di più sull’evento kernel.request.

Ecco gli ascoltatori che Symfony registra su questo evento:

Nome classe ascoltatore Priorità
Symfony\Component\HttpKernel\EventListener\ProfilerListener 1024
Symfony\Bundle\FrameworkBundle\EventListener\TestSessionListener 192
Symfony\Bundle\FrameworkBundle\EventListener\SessionListener 128
Symfony\Component\HttpKernel\EventListener\RouterListener 32
Symfony\Component\HttpKernel\EventListener\LocaleListener 16
Symfony\Component\Security\Http\Firewall 8

kernel.controller

Classe evento: Symfony\Component\HttpKernel\Event\FilterControllerEvent

Questo evento può essere un punto di ingresso per modificare il controllore da eseguire:

use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

public function onKernelController(FilterControllerEvent $event)
{
    $controller = $event->getController();
    // ...

    // si può sostituire il controllore con qualsiasi Callable PHP
    $event->setController($controller);
}

Vedi anche

Saperne di più sull’evento kernel.controller.

Symfony registra un ascoltatore legato a questo evento:

Nome classe ascoltatore Priorità
Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector 0

kernel.view

Classe evento: Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent

Questo evento non è usato da FrameworkBundle, ma può essere usato per implementare un sistema di sottoviste. Questo evento è richiamato solo se il controllore non restituisce un oggetto Response. Lo scopo di questo evento è quello di dare la possibilità a un qualche altro valore restituito di essere convertito in Response.

Il valore restituito dal controllore è acccessibile tramite il metodo getControllerResult:

use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpFoundation\Response;

public function onKernelView(GetResponseForControllerResultEvent $event)
{
    $val = $event->getControllerResult();
    $response = new Response();

    // ... personalizzare in qualche modo la risposta, a partire da $val

    $event->setResponse($response);
}

Vedi anche

Saperne di più sull’evento kernel.view.

kernel.response

Classe evento: Symfony\Component\HttpKernel\Event\FilterResponseEvent

Lo scopo di questo evento è quello di consentire ad altri sistemi di modificare o sostituire l’oggetto Response, dopo la sua creazione:

public function onKernelResponse(FilterResponseEvent $event)
{
    $response = $event->getResponse();

    // ... modificare l'oggetto Response
}

FrameworkBundle registra vari ascoltatori:

Symfony\Component\HttpKernel\EventListener\ProfilerListener
Raccoglie dati per la richiesta corrente.
Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener
Inietta la barra di debug del web.
Symfony\Component\HttpKernel\EventListener\ResponseListener
Aggiusta il Content-Type della risposta, in base al formato della richiesta.
Symfony\Component\HttpKernel\EventListener\EsiListener
Aggiunge un header HTTP Surrogate-Control quando la risposta deve essere analizzata alla ricerca di tag ESI.

Vedi anche

Saperne di più sull’evento kernel.response.

Symfony registra i seguenti ascoltatori per questo evento:

Nome classe ascoltatore Priorità
Symfony\Component\HttpKernel\EventListener\EsiListener 0
Symfony\Component\HttpKernel\EventListener\ResponseListener 0
Symfony\Bundle\SecurityBundle\EventListener\ResponseListener 0
Symfony\Component\HttpKernel\EventListener\ProfilerListener -100
Symfony\Bundle\FrameworkBundle\EventListener\TestSessionListener -128
Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener -128
Symfony\Component\HttpKernel\EventListener\StreamedResponseListener -1024

kernel.terminate

Classe evento: Symfony\Component\HttpKernel\Event\PostResponseEvent

Loscopo di questo evento è quello di eseguire alcuni compiti dopo che la risposta è stata servita al client.

Vedi anche

Saperne di più sull’evento kernel.terminate.

Symfony registra un ascoltatore di questo evento:

Nome classe ascoltatore Priorità
EmailSenderListener 0

kernel.exception

Classe evento: Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent

TwigBundle registra Symfony\Component\HttpKernel\EventListener\ExceptionListener, che gira Request a un controllore dato, definito dal parametro exception_listener.controller.

Un ascoltatore su questo evento può creare e impostare un oggetto Response, creare e impostare un nuovo oggetto Exception oppure non fare nulla:

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    $response = new Response();
    // prepara l'oggetto Response in base all'eccezione catturata
    $event->setResponse($response);

    // in alternativa, si può impostare una nuova eccezione
    // $exception = new \Exception('Una nuova eccezione');
    // $event->setException($exception);
}

Nota

Poiché Symfony imposta il codice di stato della risposta con il valore più appropriato (a seconda dell’eccezione), non bisogna impostare lo stato della risposta. Se si vuole ridefinire il codice di stato (solo se si ha una buona ragione), impostare l’header X-Status-Code:

$response = Response(
    'Error',
    404 // ignorato,
    array('X-Status-Code' => 200)
);

Vedi anche

Saperne di più sull’evento kernel.exception.

Questi ascoltatori sono registrati da Symfony su questo evento:

Nome classe ascoltatore Priorità
Symfony\Component\HttpKernel\EventListener\ProfilerListener 0
Symfony\Component\HttpKernel\EventListener\ExceptionListener -128

Tabella dei contenuti

Argomento precedente

I tag della dependency injection

Argomento successivo

Requisiti per far girare Symfony

Questa pagina