<?php declare(strict_types=1);
namespace She\StorefrontUrls\Components;
use Shopware\Core\PlatformRequest;
use Shopware\Core\SalesChannelRequest;
use Shopware\Storefront\Framework\Routing\RequestTransformer as ChannelRequestTransformer;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
class ChannelListener implements EventSubscriberInterface
{
private $router;
public function __construct(RouterInterface $router = null)
{
$this->router = $router;
}
public function setRouterContext(RequestEvent $event)
{
$request = $event->getRequest();
$channelId = $request->attributes->get(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
$this->router->getContext()->setParameter('_channel', $channelId);
}
public function setCanonicalUrl(RequestEvent $event)
{
$request = $event->getRequest();
$attributes = $request->attributes;
if (!$attributes->has(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK)
&& $attributes->has(ChannelRequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL)
&& !$attributes->get(RequestTransformer::IS_SEO_URL_REQUEST)) {
$url = $attributes->get(ChannelRequestTransformer::SALES_CHANNEL_ABSOLUTE_BASE_URL);
$url .= $this->router->generate($attributes->get('_route'), $attributes->get('_route_params'));
$attributes->set(SalesChannelRequest::ATTRIBUTE_CANONICAL_LINK, $url);
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => [
['setRouterContext', 15],
['setCanonicalUrl', 5],
],
];
}
}