[START CHUNK 1/4]
### test.txt ###

Events and Event Listeners
Edit this page
During the execution of a Symfony application, lots of event notifications are triggered. Your application can listen to these notifications and respond to them by executing any piece of code.

Symfony triggers several events related to the kernel while processing the HTTP Request. Third-party bundles may also dispatch events, and you can even dispatch custom events from your own code.

All the examples shown in this article use the same KernelEvents::EXCEPTION event for consistency purposes. In your own application, you can use any event and even mix several of them in the same subscriber.

Creating an Event Listener
The most common way to listen to an event is to register an event listener:

 Copy
// src/EventListener/ExceptionListener.php
namespace App\EventListener;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

class ExceptionListener
{
 public function \_\_invoke(ExceptionEvent $event): void
 {
 // You get the exception object from the received event
 $exception = $event->getThrowable();
 $message = sprintf(
 'My Error says: %s with code: %s',
 $exception->getMessage(),
 $exception->getCode()
 );

 // Customize your response object to display the exception details
 $response = new Response();
 $response->setContent($message);

 // HttpExceptionInterface is a special type of exception that
 // holds status code and header details
 if ($exception instanceof HttpExceptionInterface) {
 $response->setStatusCode($exception->getStatusCode());
 $response->headers->replace($exception->getHeaders());
 } else {
 $response->setStatusCode(Response::HTTP\_INTERNAL\_SERVER\_ERROR);
 }

 // sends the modified response object to the event
 $event->setResponse($response);
 }
}
Now that the class is created, you need to register it as a service and notify Symfony that it is an event listener by using a special "tag":

 Copy
# config/services.yaml
services:
 App\EventListener\ExceptionListener:
 tags: [kernel.event\_listener]
Symfony follows this logic to decide which method to call inside the event listener class:

If the kernel.event\_listener tag defines the method attribute, that's the name of the method to be called;
If no method attribute is defined, try to call the \_\_invoke() magic method (which makes event listeners invokable);
If the \_\_invoke() method is not defined either, throw an exception.
There is an optional attribute for the kernel.event\_listener tag called priority, which is a positive or negative integer that defaults to 0 and it controls the order in which listeners are executed (the higher the number, the earlier a listener is executed). This is useful when you need to guarantee that one listener is executed before another. The priorities of the internal Symfony listeners usually range from -256 to 256 but your own listeners can use any positive or negative integer.

There is an optional attribute for the kernel.event\_listener tag called event which is useful when listener $event argument is not typed. If you configure it, it will change type of $event object. For the kernel.exception event, it is ExceptionEvent. Check out the Symfony events reference to see what type of object each event provides.

With this attribute, Symfony follows this logic to decide which method to call inside the event listener class:

If the kernel.event\_listener tag defines the method attribute, that's the name of the method to be called;
If no method attribute is defined, try to call the method whose name is on + "PascalCased event name" (e.g. onKernelException() method for the kernel.exception event);
If that method is not defined either, try to call the \_\_invoke() magic method (which makes event listeners invokable);
If the \_\_invoke() method is not defined either, throw an exception.
Defining Event Listeners with PHP Attributes
An alternative way to define an event listener is to use the AsEventListener PHP attribute. This allows to configure the listener inside its class, without having to add any configuration in external files:

 Copy
namespace App\EventListener;

use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

#[AsEventListener]
final class MyListener
{
 public function \_\_invoke(CustomEvent $event): void
 {
 // ...
 }
}
You can add multiple #[AsEventListener()] attributes to configure different methods:

 Copy
namespace App\EventListener;

use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

#[AsEventListener(event: CustomEvent::class, method: 'onCustomEvent')]
#[AsEventListener(event: 'foo', priority: 42)]
#[AsEventListener(event: 'bar', method: 'onBarEvent')]
final class MyMultiListener
{
 public function onCustomEvent(CustomEvent $event): void
 {
 // ...
 }

 public function onFoo(): void
 {
 // ...
 }

 public function onBarEvent(): void
 {
 // ...
 }
}
AsEventListener can also be applied to methods directly:

 Copy
namespace App\EventListener;

use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

final class MyMultiListener
{
 #[AsEventListener()]
 public function onCustomEvent(CustomEvent $event): void
 {
 // ...
 }

 #[AsEventListener(event: 'foo', priority: 42)]
 public function onFoo(): void
 {
 // ...
 }

 #[AsEventListener(event: 'bar')]
 public function onBarEvent(): void
 {
 // ...
 }
}
Note that the attribute doesn't require its event parameter to be set if the method already type-hints the expected event.

Creating an Event Subscriber
Another way to listen to events is via an event subscriber, which is a class that defines one or more methods that listen to one or various events. The main difference with the event listeners is that subscribers always know the events to which they are listening.

If different event subscriber methods listen to the same event, their order is defined by the priority parameter. This value is a positive or negative integer which defaults to 0. The higher the number, the earlier the method is called. Priority is aggregated for all listeners and subscribers, so your methods could be called before or after the methods defined in other listeners and subscribers. To learn more about event subscribers, read The EventDispatcher Component.

The following example shows an event subscriber that defines several methods which listen to the same kernel.exception event:

 Copy
// src/EventSubscriber/ExceptionSubscriber.php
namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class ExceptionSubscriber implements EventSubscriberInterface
{
 public static function getSubscribedEvents(): array
 {
 // return the subscribed events, their methods and priorities
 return [
 KernelEvents::EXCEPTION => [
 ['processException', 10],
 ['logException', 0],
 ['notifyException', -10],
 ],
 ];
 }

 public function processException(ExceptionEvent $event)
 {
 // ...
 }

 public function logException(ExceptionEvent $event)
 {
 // ...
 }

 public function notifyException(ExceptionEvent $event)
 {
 // ...
 }
}
That's it! Your services.yaml file should already be setup to load services from the EventSubscriber directory. Symfony takes care of the rest.

If your methods are not called when an exception is thrown, double-check that you're loading services from the EventSubscriber directory and have autoconfigure enabled. You can also manually add the kernel.event\_subscriber tag.

Request Events, Checking Types
A single page can make several requests (one main request, and then multiple sub-requests - typically when embedding controllers in templates). For the core Symfony events, you might need to check to see if the event is for a "main" request or a "sub request":

 Copy
// src/EventListener/RequestListener.php
namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\RequestEvent;

class RequestListener
{
 public function onKernelRequest(RequestEvent $event)
 {
 if (!$event->isMainRequest()) {
 // don't do anything if it's not the main request
 return;
 }

 // ...
 }
}
Certain things, like checking information on the real request, may not need to be done on the sub-request
[END CHUNK 1/4]
Reply with OK: [CHUNK x/TOTAL], don't reply anything else, don't explain the text!
[시작 청크 1/4]test.txt ### ###이벤트 및 이벤트 리스너이 페이지 편집Symfony 애플리케이션을 실행하는 동안 많은 이벤트 알림이 트리거됩니다. 애플리케이션은 이러한 알림을 수신하고 코드를 실행하여 응답할 수 있습니다.Symfony는 HTTP 요청을 처리하는 동안 커널과 관련된 여러 이벤트를 트리거합니다. 타사 번들에서도 이벤트를 디스패치할 수 있으며, 자체 코드에서 사용자 정의 이벤트를 디스패치할 수도 있습니다.이 문서에 표시된 모든 예제에서는 일관성을 위해 동일한 KernelEvents::EXCEPTION 이벤트를 사용합니다. 자체 애플리케이션에서는 모든 이벤트를 사용할 수 있으며 동일한 구독자에서 여러 이벤트를 혼합할 수도 있습니다.이벤트 리스너 생성하기이벤트를 수신하는 가장 일반적인 방법은 이벤트 리스너를 등록하는 것입니다: 복사// src/EventListener/ExceptionListener.php네임스페이스 App\EventListener;사용 심포니\컴포넌트\HttpFoundation\응답;사용 심포니\컴포넌트\Http커널\이벤트\예외이벤트;사용 Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;예외 리스너 클래스{ public function \_\_invoke(ExceptionEvent $event): void { // 수신된 이벤트에서 예외 객체를 가져옵니다. 예외 = $event->getThrowable(); message = sprintf( '내 오류는 다음과 같습니다: %s 코드: %s', 예외->getMessage(), 예외->getCode() ); // 예외 세부 정보를 표시하도록 응답 객체를 사용자 정의합니다. 응답 = 새 응답(); 응답->설정내용($메시지); // HttpExceptionInterface는 특수한 유형의 예외입니다. // 상태 코드와 헤더 세부 정보를 보유합니다. if ($exception instanceof HttpExceptionInterface) { 응답->설정상태코드($ 예외->겟상태코드()); 응답->헤더->교체($exception->getHeaders()); } else { 응답->설정 상태 코드(응답::HTTP\_INTERNAL\_SERVER\_ERROR); } // 수정된 응답 객체를 이벤트에 전송합니다. event->setResponse($response); }}이제 클래스가 생성되었으므로 서비스로 등록하고 특별한 "태그"를 사용하여 Symfony에 이벤트 리스너임을 알려야 합니다: 복사# config/services.yaml서비스를 복사합니다: App\EventListener\ExceptionListener: 태그를 추가합니다: [kernel.event\_listener]Symfony는 이 로직에 따라 이벤트 리스너 클래스 내에서 호출할 메서드를 결정합니다:kernel.event\_listener 태그에 메서드 속성이 정의되어 있으면 호출할 메서드의 이름입니다;메서드 속성이 정의되어 있지 않으면 이벤트 리스너를 호출할 수 있는 매직 메서드인 \_\_invoke()를 호출해 보세요;만약 \_\_invoke() 메서드도 정의되지 않았다면, 예외를 던집니다.kernel.event\_listener 태그에는 우선순위라는 선택적 속성이 있는데, 기본값은 0인 양수 또는 음수이며 리스너가 실행되는 순서를 제어합니다(숫자가 높을수록 리스너가 더 일찍 실행됩니다). 이는 한 리스너가 다른 리스너보다 먼저 실행되도록 보장해야 할 때 유용합니다. 내부 심포니 리스너의 우선 순위는 일반적으로 -256에서 256 범위이지만, 자체 리스너는 양수 또는 음수 정수를 사용할 수 있습니다.리스너 $event 인수를 입력하지 않은 경우 유용하게 사용할 수 있는 event라는 kernel.event\_listener 태그의 선택적 어트리뷰트가 있습니다. 이 속성을 구성하면 $event 객체의 유형이 변경됩니다. kernel.exception 이벤트의 경우 ExceptionEvent입니다. 각 이벤트가 제공하는 객체 유형을 확인하려면 Symfony 이벤트 참조를 확인하세요.이 속성을 사용하면 Symfony는 이 로직을 따라 이벤트 리스너 클래스 내에서 호출할 메서드를 결정합니다:kernel.event\_listener 태그에 메서드 속성이 정의되어 있으면 호출할 메서드의 이름입니다;메서드 속성이 정의되어 있지 않으면, 이름이 on + "파스칼 대/소문자 이벤트 이름"인 메서드를 호출해 보세요(예: kernel.exception 이벤트에 대한 onKernelException() 메서드);해당 메서드도 정의되어 있지 않으면 이벤트 리스너를 호출할 수 있는 \_\_invoke() 매직 메서드를 호출해 보십시오;만약 \_\_invoke() 메서드도 정의되어 있지 않다면 예외를 던집니다.PHP 어트리뷰트로 이벤트 리스너 정의하기이벤트 리스너를 정의하는 또 다른 방법은 AsEventListener PHP 속성을 사용하는 것입니다. 이렇게 하면 외부 파일에 구성을 추가할 필요 없이 클래스 내부에서 리스너를 구성할 수 있습니다: 복사네임스페이스 App\EventListener;심포니\컴포넌트\이벤트디스패처\어트리뷰트\AsEventListener를 사용합니다;#[AsEventListener]최종 클래스 MyListener{ public function \_\_invoke(CustomEvent $event): void { // ... }}여러 #[AsEventListener()] 어트리뷰트를 추가하여 다양한 메서드를 구성할 수 있습니다: 복사네임스페이스 App\EventListener;심포니\컴포넌트\이벤트디스패처\어트리뷰트\AsEventListener를 사용합니다;#[AsEventListener(event: CustomEvent::class, method: 'onCustomEvent')]]#[AsEventListener(event: 'foo', priority: 42)]]#[AsEventListener(event: 'bar', method: 'onBarEvent')]]최종 클래스 MyMultiListener{ public function onCustomEvent(CustomEvent $event): void { // ... } public function onFoo(): void { // ... } public function onBarEvent(): void { // ... }}AsEventListener는