<?php
namespace Cms\CoreBundle\Service;
use Cms\CoreBundle\Model\Scenes\DashboardScene;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
final class ViewLayer implements EventSubscriberInterface
{
/**
* @var SceneRenderer
*/
private SceneRenderer $sceneRenderer;
/**
* @param SceneRenderer $sceneRenderer
*/
public function __construct(SceneRenderer $sceneRenderer)
{
$this->sceneRenderer = $sceneRenderer;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['onKernelView', 255],
];
}
/**
* @param ViewEvent $event
*/
public function onKernelView(ViewEvent $event): void
{
// obtain what the controller returned
$result = $event->getControllerResult();
// check for our view class
if ($result instanceof DashboardScene) {
// render it
$response = $this->render($result);
// attach response to the event
$event->setResponse($response);
}
}
/**
* @param DashboardScene $scene
* @return Response
*/
private function render(DashboardScene $scene): Response
{
// call the rendering on the scene renderer
$rendered = $this->sceneRenderer->render($scene);
// generate the response
return new Response(
$rendered,
200,
[
'Content-Type' => 'text/html',
]
);
}
}