<?php
/*
* This file is part of Sulu.
*
* (c) Sulu GmbH
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Sulu\Component\Webspace\Analyzer;
use Sulu\Component\Webspace\Analyzer\Attributes\RequestAttributes;
use Sulu\Component\Webspace\Analyzer\Attributes\RequestProcessorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Default request analyzer will be used for sulu-admin and extended for sulu-website.
*/
class RequestAnalyzer implements RequestAnalyzerInterface
{
public const SULU_ATTRIBUTE = '_sulu';
/**
* @var RequestProcessorInterface[]
*/
private $requestProcessors;
/**
* @var RequestStack
*/
private $requestStack;
public function __construct(
RequestStack $requestStack,
array $requestProcessors
) {
$this->requestStack = $requestStack;
$this->requestProcessors = $requestProcessors;
}
public function analyze(Request $request)
{
if ($request->attributes->has(static::SULU_ATTRIBUTE)) {
return;
}
$attributes = new RequestAttributes(['scheme' => $request->getScheme(), 'requestUri' => $request->getRequestUri()]);
foreach ($this->requestProcessors as $requestProcessor) {
$attributes = $attributes->merge($requestProcessor->process($request, $attributes));
}
$request->attributes->set(static::SULU_ATTRIBUTE, $attributes);
}
public function validate(Request $request)
{
$attributes = $request->attributes->get(static::SULU_ATTRIBUTE);
foreach ($this->requestProcessors as $provider) {
$provider->validate($attributes);
}
}
public function getAttribute($name, $default = null)
{
$requestAttributes = $this->getAttributes();
if (!$requestAttributes) {
return $default;
}
return $requestAttributes->getAttribute($name, $default);
}
private function getAttributes()
{
$request = $this->requestStack->getCurrentRequest();
if (null === $request) {
return null;
}
if (!$request->attributes->has(static::SULU_ATTRIBUTE)) {
return null;
}
return $request->attributes->get(static::SULU_ATTRIBUTE);
}
private function setAttributes(RequestAttributes $attributes)
{
$request = $this->requestStack->getCurrentRequest();
$request->attributes->set(static::SULU_ATTRIBUTE, $attributes);
}
public function getMatchType()
{
return $this->getAttribute('matchType');
}
public function getDateTime()
{
return $this->getAttribute('dateTime');
}
public function getWebspace()
{
return $this->getAttribute('webspace');
}
public function getPortal()
{
return $this->getAttribute('portal');
}
public function getSegment()
{
return $this->getAttribute('segment');
}
public function changeSegment(string $segmentKey)
{
$segment = $this->getWebspace()->getSegment($segmentKey);
$requestAttributes = (new RequestAttributes(['segment' => $segment]))->merge($this->getAttributes());
$this->setAttributes($requestAttributes);
}
public function getCurrentLocalization()
{
return $this->getAttribute('localization');
}
public function getPortalUrl()
{
return $this->getAttribute('portalUrl');
}
public function getRedirect()
{
return $this->getAttribute('redirect');
}
public function getResourceLocator()
{
return $this->getAttribute('resourceLocator', false);
}
public function getResourceLocatorPrefix()
{
return $this->getAttribute('resourceLocatorPrefix');
}
public function getPortalInformation()
{
return $this->getAttribute('portalInformation');
}
}