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

$token);
 }
}
Now, configure the subscriber to listen to another event and add onKernelResponse(). This will look for the auth\_token flag on the request object and set a custom header on the response if it's found:

 Copy
// add the new use statement at the top of your file
use Symfony\Component\HttpKernel\Event\ResponseEvent;

public function onKernelResponse(ResponseEvent $event)
{
 // check to see if onKernelController marked this as a token "auth'ed" request
 if (!$token = $event->getRequest()->attributes->get('auth\_token')) {
 return;
 }

 $response = $event->getResponse();

 // create a hash and set it as a response header
 $hash = sha1($response->getContent().$token);
 $response->headers->set('X-CONTENT-HASH', $hash);
}

public static function getSubscribedEvents()
{
 return [
 KernelEvents::CONTROLLER => 'onKernelController',
 KernelEvents::RESPONSE => 'onKernelResponse',
 ];
}
That's it! The TokenSubscriber is now notified before every controller is executed (onKernelController()) and after every controller returns a response (onKernelResponse()). By making specific controllers implement the TokenAuthenticatedController interface, your listener knows which controllers it should take action on. And by storing a value in the request's "attributes" bag, the onKernelResponse() method knows to add the extra header. Have fun!

How to Customize a Method Behavior without Using Inheritance
If you want to do something right before, or directly after a method is called, you can dispatch an event respectively at the beginning or at the end of the method:

 Copy
class CustomMailer
{
 // ...

 public function send($subject, $message)
 {
 // dispatch an event before the method
 $event = new BeforeSendMailEvent($subject, $message);
 $this->dispatcher->dispatch($event, 'mailer.pre\_send');

 // get $subject and $message from the event, they may have been modified
 $subject = $event->getSubject();
 $message = $event->getMessage();

 // the real method implementation is here
 $returnValue = ...;

 // do something after the method
 $event = new AfterSendMailEvent($returnValue);
 $this->dispatcher->dispatch($event, 'mailer.post\_send');

 return $event->getReturnValue();
 }
}
In this example, two events are dispatched:

mailer.pre\_send, before the method is called,
and mailer.post\_send after the method is called.
Each uses a custom Event class to communicate information to the listeners of the two events. For example, BeforeSendMailEvent might look like this:

 Copy
// src/Event/BeforeSendMailEvent.php
namespace App\Event;

use Symfony\Contracts\EventDispatcher\Event;

class BeforeSendMailEvent extends Event
{
 public function \_\_construct(
 private $subject,
 private $message,
 ) {
 }

 public function getSubject()
 {
 return $this->subject;
 }

 public function setSubject($subject)
 {
 $this->subject = $subject;
 }

 public function getMessage()
 {
 return $this->message;
 }

 public function setMessage($message)
 {
 $this->message = $message;
 }
}
And the AfterSendMailEvent even like this:

 Copy
// src/Event/AfterSendMailEvent.php
namespace App\Event;

use Symfony\Contracts\EventDispatcher\Event;

class AfterSendMailEvent extends Event
{
 public function \_\_construct(
 private $returnValue,
 ) {
 }

 public function getReturnValue()
 {
 return $this->returnValue;
 }

 public function setReturnValue($returnValue)
 {
 $this->returnValue = $returnValue;
 }
}
Both events allow you to get some information (e.g. getMessage()) and even change that information (e.g. setMessage()).

Now, you can create an event subscriber to hook into this event. For example, you could listen to the mailer.post\_send event and change the method's return value:

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

use App\Event\AfterSendMailEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MailPostSendSubscriber implements EventSubscriberInterface
{
 public function onMailerPostSend(AfterSendMailEvent $event)
 {
 $returnValue = $event->getReturnValue();
 // modify the original ``$returnValue`` value

 $event->setReturnValue($returnValue);
 }

 public static function getSubscribedEvents()
 {
 return [
 'mailer.post\_send' => 'onMailerPostSend',
 ];
 }
}
That's it! Your subscriber should be called automatically (or read more about event subscriber
[END CHUNK 3/4]
Reply with OK: [CHUNK x/TOTAL], don't reply anything else, don't explain the text!
시작 청크 3/4]### test.txt ###토큰); }}이제 구독자가 다른 이벤트를 수신하도록 구성하고 onKernelResponse()를 추가합니다. 그러면 요청 객체에서 auth\_token 플래그를 찾고, 이 플래그가 발견되면 응답에 사용자 지정 헤더를 설정합니다: Copy// 파일 상단에 새로운 사용 문을 추가합니다.사용 심포니\컴포넌트\Http커널\이벤트\응답이벤트;공개 함수 onKernelResponse(ResponseEvent $event){ // onKernelController가 이를 토큰 "인증" 요청으로 표시했는지 확인합니다. if (!$token = $event->getRequest()->attributes->get('auth\_token')) { return; } response = $event->getResponse(); // 해시를 생성하고 응답 헤더로 설정합니다. 해시 = sha1($response->getContent().$token); 응답->헤더->설정('X-CONTENT-HASH', $hash);}공용 정적 함수 getSubscribedEvents(){ return [ KernelEvents::CONTROLLER => 'onKernelController', KernelEvents::RESPONSE => 'onKernelResponse', ];}끝입니다! 이제 모든 컨트롤러가 실행되기 전(onKernelController())과 모든 컨트롤러가 응답을 반환한 후(onKernelResponse()) 토큰 구독자에게 알림이 전송됩니다. 특정 컨트롤러가 토큰인증 컨트롤러 인터페이스를 구현하도록 함으로써 리스너는 어떤 컨트롤러에 대해 조치를 취해야 하는지 알 수 있습니다. 그리고 요청의 "속성" 백에 값을 저장함으로써 onKernelResponse() 메서드는 추가 헤더를 추가하는 것을 알 수 있습니다. 재미있게 사용하세요!상속을 사용하지 않고 메서드 동작을 사용자 정의하는 방법메서드가 호출되기 직전이나 직후에 어떤 작업을 수행하려면 메서드의 시작 또는 끝에 각각 이벤트를 디스패치하면 됩니다: 복사CustomMailer 클래스{ // ... public function send($subject, $message) { // 메서드 전에 이벤트를 디스패치합니다. event = new BeforeSendMailEvent($subject, $message); this->dispatcher->dispatch($event, 'mailer.pre\_send'); // 이벤트에서 $subject 및 $message를 가져 오면 수정되었을 수 있습니다. subject = $event->getSubject(); message = $event->getMessage(); // 실제 메서드 구현은 다음과 같습니다. 반환값 = ...; // 메서드 뒤에 무언가를 수행합니다. event = new AfterSendMailEvent($returnValue); this->dispatcher->dispatch($event, 'mailer.post\_send'); 반환 $event->getReturnValue(); }}이 예제에서는 두 개의 이벤트가 발송됩니다:메서드가 호출되기 전에 mailer.pre\_send,그리고 메서드가 호출된 후 mailer.post\_send.각각은 사용자 정의 이벤트 클래스를 사용하여 두 이벤트의 리스너에게 정보를 전달합니다. 예를 들어 BeforeSendMailEvent는 다음과 같이 보일 수 있습니다: Copy// src/Event/BeforeSendMailEvent.php네임스페이스 App\Event;사용 심포니\컨트랙트\이벤트디스패처\이벤트;BeforeSendMailEvent 클래스 확장 이벤트{ 공개 함수 \_\_construct( private $subject, private $message, ) { } public function getSubject() { return $this->subject; } public function setSubject($subject) { this->subject = $subject; } public function getMessage() { return $this->message; } public function setMessage($message) { this->message = $message; }}그리고 AfterSendMailEvent도 다음과 같습니다: Copy// src/Event/AfterSendMailEvent.php네임스페이스 App\Event;심포니\컨트랙트\이벤트디스패처\이벤트 사용;AfterSendMailEvent 클래스 확장 이벤트{ 공개 함수 \_\_construct( private $returnValue, ) { } public function getReturnValue() { return $this->returnValue; } public function setReturnValue($returnValue) { this->returnValue = $returnValue; }}두 이벤트 모두 일부 정보를 가져오고(예: getMessage()), 해당 정보를 변경할 수도 있습니다(예: setMessage()).이제 이벤트 구독자를 생성하여 이 이벤트에 연결할 수 있습니다. 예를 들어 mailer.post\_send 이벤트를 수신하고 메서드의 반환값을 변경할 수 있습니다: 복사// src/EventSubscriber/MailPostSendSubscriber.php네임스페이스 App\EventSubscriber;사용 App\Event\AfterSendMailEvent;사용 심포니\컴포넌트\이벤트디스패처\이벤트서브스크립터인터페이스;MailPostSendSubscriber 클래스 구현 이벤트 구독자 인터페이스{ public function onMailerPostSend(AfterSendMailEvent $event) { returnValue = $event->getReturnValue(); // 원래 ``$returnValue`` 값을 수정합니다. event->setReturnValue($returnValue); } 공용 정적 함수 getSubscribedEvents() { return [ 'mailer.post\_send' => 'onMailerPostSend', ]; }}여기까지입니다! 구독자가 자동으로 호출되어야 합니다(또는 이벤트 구독자에 대해 자세히 읽어보세요.[END CHUNK 3/4]확인으로 답장: [CHUNK x/TOTAL]로 답장하고, 다른 답장을 보내지 말고 텍스트에 대해 설명하지 마세요!