From 7b90f8202605aee22ffa832af9ddd7e3980d2cf0 Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Fri, 24 Nov 2017 12:42:49 +0100 Subject: [PATCH 01/11] [WIP] Introduced config providers --- src/ConfigProvider/BundleConfigProvider.php | 107 +++++++++++ src/ConfigProvider/ChainConfigProvider.php | 53 ++++++ .../ConfigProviderInterface.php | 24 +++ src/ConfigProvider/DatabaseConfigProvider.php | 128 ++++++++++++++ src/Controller/RewriteController.php | 30 ++-- .../Compiler/ConfigProviderPass.php | 48 +++++ src/DependencyInjection/Configuration.php | 71 ++++++++ .../Terminal42UrlRewriteExtension.php | 16 +- .../RewriteContainerListener.php | 3 +- src/Resources/config/services.yml | 22 ++- src/Resources/contao/config/config.php | 9 +- src/Resources/contao/dca/tl_url_rewrite.php | 7 + src/RewriteConfig.php | 166 ++++++++++++++++++ src/Routing/UrlRewriteLoader.php | 116 +++--------- src/Terminal42UrlRewriteBundle.php | 2 + .../DependencyInjection/ConfigurationTest.php | 75 ++++++++ tests/Fixtures/config_invalid.yml | 5 + tests/Fixtures/config_valid.yml | 18 ++ 18 files changed, 785 insertions(+), 115 deletions(-) create mode 100644 src/ConfigProvider/BundleConfigProvider.php create mode 100644 src/ConfigProvider/ChainConfigProvider.php create mode 100644 src/ConfigProvider/ConfigProviderInterface.php create mode 100644 src/ConfigProvider/DatabaseConfigProvider.php create mode 100644 src/DependencyInjection/Compiler/ConfigProviderPass.php create mode 100644 src/DependencyInjection/Configuration.php create mode 100644 src/RewriteConfig.php create mode 100644 tests/DependencyInjection/ConfigurationTest.php create mode 100644 tests/Fixtures/config_invalid.yml create mode 100644 tests/Fixtures/config_valid.yml diff --git a/src/ConfigProvider/BundleConfigProvider.php b/src/ConfigProvider/BundleConfigProvider.php new file mode 100644 index 0000000..542b316 --- /dev/null +++ b/src/ConfigProvider/BundleConfigProvider.php @@ -0,0 +1,107 @@ +entries = $entries; + } + + /** + * @inheritDoc + */ + public function find(string $id): ?RewriteConfig + { + list($key, $id) = explode(':', $id); + + // Return if the key is not supported + if ($key !== $this->key) { + return null; + } + + // Return if the entry does not exist + if (!array_key_exists($id, $this->entries)) { + return null; + } + + return $this->createConfig($id, $this->entries[$id]); + } + + /** + * @inheritDoc + */ + public function findAll(): array + { + if (count($this->entries) === 0) { + return []; + } + + $configs = []; + + foreach ($this->entries as $id => $entry) { + if (($config = $this->createConfig($id, $entry)) !== null) { + $configs[] = $config; + } + } + + return $configs; + } + + /** + * Create the config + * + * @param int $id + * @param array $data + * + * @return null|RewriteConfig + */ + private function createConfig(int $id, array $data): ?RewriteConfig + { + if (!isset($data['type'], $data['request'], $data['request']['path'], $data['response'], $data['response']['code'])) { + return null; + } + + $config = new RewriteConfig($this->key . ':' . $id, $data['request']['path'], (int) $data['response']['code']); + + // Request hosts + if (isset($data['request']['hosts'])) { + $config->setRequestHosts($data['request']['hosts']); + } + + // Request condition + if (isset($data['request']['condition'])) { + $config->setRequestCondition($data['request']['condition']); + } + + // Request requirements + if (isset($data['request']['requirements'])) { + $config->setRequestRequirements($data['request']['requirements']); + } + + // Response URI + if (isset($data['response']['uri'])) { + $config->setResponseUri($data['response']['uri']); + } + + return $config; + } +} diff --git a/src/ConfigProvider/ChainConfigProvider.php b/src/ConfigProvider/ChainConfigProvider.php new file mode 100644 index 0000000..7c32fbd --- /dev/null +++ b/src/ConfigProvider/ChainConfigProvider.php @@ -0,0 +1,53 @@ +providers[] = $provider; + } + + /** + * @inheritDoc + */ + public function find(string $id): ?RewriteConfig + { + /** @var ConfigProviderInterface $provider */ + foreach ($this->providers as $provider) { + if (($config = $provider->find($id)) !== null) { + return $config; + } + } + + return null; + } + + /** + * @inheritDoc + */ + public function findAll(): array + { + $configs = []; + + /** @var ConfigProviderInterface $provider */ + foreach ($this->providers as $provider) { + $configs = array_merge($configs, $provider->findAll()); + } + + return $configs; + } +} diff --git a/src/ConfigProvider/ConfigProviderInterface.php b/src/ConfigProvider/ConfigProviderInterface.php new file mode 100644 index 0000000..0e42705 --- /dev/null +++ b/src/ConfigProvider/ConfigProviderInterface.php @@ -0,0 +1,24 @@ +connection = $connection; + } + + /** + * @inheritDoc + */ + public function find(string $id): ?RewriteConfig + { + list($key, $id) = explode(':', $id); + + // Return if the key is not supported + if ($key !== $this->key) { + return null; + } + + try { + $data = $this->connection->fetchAssoc('SELECT * FROM tl_url_rewrite WHERE id=?', [$id]); + } catch (\PDOException | TableNotFoundException $e) { + return null; + } + + if (false === $data) { + return null; + } + + return $this->createConfig($data); + } + + /** + * @inheritDoc + */ + public function findAll(): array + { + try{ + $records = $this->connection->fetchAll('SELECT * FROM tl_url_rewrite'); + } catch (\PDOException | TableNotFoundException $e) { + return []; + } + + if (count($records) === 0) { + return []; + } + + $configs = []; + + foreach ($records as $record) { + if (($config = $this->createConfig($record)) !== null) { + $configs[] = $config; + } + } + + return $configs; + } + + /** + * Create the config + * + * @param array $data + * + * @return null|RewriteConfig + */ + private function createConfig(array $data): ?RewriteConfig + { + if (!isset($data['id'], $data['type'], $data['requestPath'], $data['responseCode'])) { + return null; + } + + $config = new RewriteConfig($this->key . ':' . $data['id'], $data['requestPath'], (int) $data['responseCode']); + + // Hosts + if (isset($data['requestHosts'])) { + $config->setRequestHosts(StringUtil::deserialize($data['requestHosts'], true)); + } + + switch ($data['type']) { + // Basic type + case 'basic': + if (isset($config['requestRequirements'])) { + $requirements = []; + + foreach (StringUtil::deserialize($config['requestRequirements'], true) as $requirement) { + if ($requirement['key'] !== '' && $requirement['value'] !== '') { + $requirements[$requirement['key']] = $requirement['value']; + } + } + + $config->setRequestRequirements($requirements); + } + break; + // Expert type + case 'expert': + $config->setRequestCondition($config['requestCondition']); + break; + default: + throw new \RuntimeException(sprintf('Unsupported database record config type: %s', $data['type'])); + } + + return $config; + } +} diff --git a/src/Controller/RewriteController.php b/src/Controller/RewriteController.php index 8db21d4..e0f345c 100644 --- a/src/Controller/RewriteController.php +++ b/src/Controller/RewriteController.php @@ -12,18 +12,19 @@ use Contao\CoreBundle\Framework\ContaoFrameworkInterface; use Contao\InsertTags; -use Doctrine\DBAL\Connection; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Exception\RouteNotFoundException; +use Terminal42\UrlRewriteBundle\ConfigProvider\ConfigProviderInterface; +use Terminal42\UrlRewriteBundle\RewriteConfig; class RewriteController { /** - * @var Connection + * @var ConfigProviderInterface */ - private $db; + private $configProvider; /** * @var ContaoFrameworkInterface @@ -33,12 +34,12 @@ class RewriteController /** * RewriteController constructor. * - * @param Connection $db + * @param ConfigProviderInterface $configProvider * @param ContaoFrameworkInterface $framework */ - public function __construct(Connection $db, ContaoFrameworkInterface $framework) + public function __construct(ConfigProviderInterface $configProvider, ContaoFrameworkInterface $framework) { - $this->db = $db; + $this->configProvider = $configProvider; $this->framework = $framework; } @@ -57,13 +58,13 @@ public function indexAction(Request $request): Response throw new RouteNotFoundException('There _url_rewrite attribute is missing'); } - $config = $this->db->fetchAssoc('SELECT * FROM tl_url_rewrite WHERE id=?', [$rewriteId]); + $config = $this->configProvider->find($rewriteId); - if (false === $config || !isset($config['responseCode'])) { + if (null === $config) { throw new RouteNotFoundException(sprintf('URL rewrite config ID %s does not exist', $rewriteId)); } - $responseCode = (int) $config['responseCode']; + $responseCode = $config->getResponseCode(); if (410 === $responseCode) { return new Response(Response::$statusTexts[$responseCode], $responseCode); @@ -77,20 +78,17 @@ public function indexAction(Request $request): Response /** * Generate the URI. * - * @param Request $request - * @param array $config + * @param Request $request + * @param RewriteConfig $config * * @return string|null */ - private function generateUri(Request $request, array $config): ?string + private function generateUri(Request $request, RewriteConfig $config): ?string { - if (!isset($config['responseUri'])) { + if (($uri = $config->getResponseUri()) === null) { return null; } - $uri = $config['responseUri']; - - // Parse the URI $uri = $this->replaceWildcards($request, $uri); $uri = $this->replaceInsertTags($uri); diff --git a/src/DependencyInjection/Compiler/ConfigProviderPass.php b/src/DependencyInjection/Compiler/ConfigProviderPass.php new file mode 100644 index 0000000..0a7eba2 --- /dev/null +++ b/src/DependencyInjection/Compiler/ConfigProviderPass.php @@ -0,0 +1,48 @@ +chain = $chain; + $this->tag = $tag; + } + + /** + * @inheritDoc + */ + public function process(ContainerBuilder $container) + { + if (!$container->has($this->chain)) { + return; + } + + $definition = $container->findDefinition($this->chain); + + foreach ($container->findTaggedServiceIds($this->tag) as $id => $tags) { + $definition->addMethodCall('addProvider', [new Reference($id)]); + } + } +} diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php new file mode 100644 index 0000000..b6d39c8 --- /dev/null +++ b/src/DependencyInjection/Configuration.php @@ -0,0 +1,71 @@ +root('terminal42_url_rewrite'); + $rootNode + ->children() + ->booleanNode('backend_management') + ->info('Enable the rewrites management in Contao backend.') + ->defaultTrue() + ->end() + ->arrayNode('entries') + ->arrayPrototype() + ->children() + ->arrayNode('request') + ->children() + ->scalarNode('path') + ->info('The request path to match.') + ->isRequired() + ->cannotBeEmpty() + ->end() + ->arrayNode('hosts') + ->info('An array of hosts to match.') + ->scalarPrototype()->end() + ->end() + ->arrayNode('requirements') + ->info('Additional requirements to match.') + ->scalarPrototype()->end() + ->end() + ->scalarNode('condition') + ->info('Request condition in Symfony\'s Expression Language to match.') + ->end() + ->end() + ->end() + ->arrayNode('response') + ->children() + ->integerNode('code') + ->info('The response code.') + ->defaultValue(301) + ->validate() + ->ifNotInArray(RewriteConfig::VALID_RESPONSE_CODES) + ->thenInvalid('Invalid response code %s.') + ->end() + ->end() + ->scalarNode('uri') + ->info('The response redirect URI. Irrelevant if response code is set to 410.') + ->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ; + + return $treeBuilder; + } +} diff --git a/src/DependencyInjection/Terminal42UrlRewriteExtension.php b/src/DependencyInjection/Terminal42UrlRewriteExtension.php index 3fa4465..e9036f5 100644 --- a/src/DependencyInjection/Terminal42UrlRewriteExtension.php +++ b/src/DependencyInjection/Terminal42UrlRewriteExtension.php @@ -14,18 +14,26 @@ use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension; -class Terminal42UrlRewriteExtension extends Extension +class Terminal42UrlRewriteExtension extends ConfigurableExtension { /** - * {@inheritdoc} + * @inheritDoc */ - public function load(array $configs, ContainerBuilder $container): void + protected function loadInternal(array $mergedConfig, ContainerBuilder $container) { $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('listener.yml'); $loader->load('services.yml'); + + // Set the "backend management" parameter + $container->setParameter('terminal42_url_rewrite.backend_management', $mergedConfig['backend_management']); + + // Set the entries as argument for bundle config provider + if (isset($mergedConfig['entries']) && $container->hasDefinition('terminal42_url_rewrite.provider.bundle')) { + $container->getDefinition('terminal42_url_rewrite.provider.bundle')->setArguments([$mergedConfig['entries']]); + } } } diff --git a/src/EventListener/RewriteContainerListener.php b/src/EventListener/RewriteContainerListener.php index 8c21bac..bbdb605 100644 --- a/src/EventListener/RewriteContainerListener.php +++ b/src/EventListener/RewriteContainerListener.php @@ -13,6 +13,7 @@ use Symfony\Bundle\FrameworkBundle\Routing\Router; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpFoundation\Response; +use Terminal42\UrlRewriteBundle\RewriteConfig; class RewriteContainerListener { @@ -91,7 +92,7 @@ public function getResponseCodes(): array { $options = []; - foreach ([301, 302, 303, 307, 410] as $code) { + foreach (RewriteConfig::VALID_RESPONSE_CODES as $code) { $options[$code] = $code.' '.Response::$statusTexts[$code]; } diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml index 4a00bc3..72c8bf3 100644 --- a/src/Resources/config/services.yml +++ b/src/Resources/config/services.yml @@ -2,12 +2,30 @@ services: terminal42_url_rewrite.rewrite_controller: class: Terminal42\UrlRewriteBundle\Controller\RewriteController arguments: - - "@database_connection" + - "@terminal42_url_rewrite.provider.database" - "@contao.framework" terminal42_url_rewrite.rewrite_loader: class: Terminal42\UrlRewriteBundle\Routing\UrlRewriteLoader arguments: - - "@database_connection" + - "@terminal42_url_rewrite.provider.database" tags: - { name: routing.loader } + + terminal42_url_rewrite.provider.bundle: + class: Terminal42\UrlRewriteBundle\ConfigProvider\BundleConfigProvider + public: false + tags: + - { name: terminal42_url_rewrite.config_provider } + + terminal42_url_rewrite.provider.chain: + class: Terminal42\UrlRewriteBundle\ConfigProvider\ChainConfigProvider + public: false + + terminal42_url_rewrite.provider.database: + class: Terminal42\UrlRewriteBundle\ConfigProvider\DatabaseConfigProvider + public: false + arguments: + - "@database_connection" + tags: + - { name: terminal42_url_rewrite.config_provider } diff --git a/src/Resources/contao/config/config.php b/src/Resources/contao/config/config.php index 65e682e..1318c7e 100644 --- a/src/Resources/contao/config/config.php +++ b/src/Resources/contao/config/config.php @@ -8,9 +8,12 @@ * @license MIT */ -$GLOBALS['BE_MOD']['system']['url_rewrites'] = [ - 'tables' => ['tl_url_rewrite'], -]; +/** + * Add the backend module if allowed + */ +if (\System::getContainer()->getParameter('terminal42_url_rewrite.backend_management')) { + $GLOBALS['BE_MOD']['system']['url_rewrites'] = ['tables' => ['tl_url_rewrite']]; +} /* * Hooks diff --git a/src/Resources/contao/dca/tl_url_rewrite.php b/src/Resources/contao/dca/tl_url_rewrite.php index 6cd8e2f..11579f5 100644 --- a/src/Resources/contao/dca/tl_url_rewrite.php +++ b/src/Resources/contao/dca/tl_url_rewrite.php @@ -181,3 +181,10 @@ ], ], ]; + +/** + * Remove the DCA if not allowed + */ +if (!\System::getContainer()->getParameter('terminal42_url_rewrite.backend_management')) { + unset($GLOBALS['TL_DCA']['tl_url_rewrite']); +} diff --git a/src/RewriteConfig.php b/src/RewriteConfig.php new file mode 100644 index 0000000..3ae00f1 --- /dev/null +++ b/src/RewriteConfig.php @@ -0,0 +1,166 @@ +identifier = $identifier; + $this->setRequestPath($requestPath); + $this->setResponseCode($responseCode); + } + + /** + * @return string + */ + public function getIdentifier(): string + { + return $this->identifier; + } + + /** + * @return string + */ + public function getRequestPath(): string + { + return $this->requestPath; + } + + /** + * @param string $requestPath + */ + public function setRequestPath(string $requestPath): void + { + $this->requestPath = $requestPath; + } + + /** + * @return array + */ + public function getRequestHosts(): array + { + return $this->requestHosts; + } + + /** + * @param array $requestHosts + */ + public function setRequestHosts(array $requestHosts): void + { + $this->requestHosts = array_unique(array_filter($requestHosts)); + } + + /** + * @return array + */ + public function getRequestRequirements(): array + { + return $this->requestRequirements; + } + + /** + * @param array $requestRequirements + */ + public function setRequestRequirements(array $requestRequirements): void + { + $this->requestRequirements = $requestRequirements; + } + + /** + * @return null|string + */ + public function getRequestCondition(): ?string + { + return $this->requestCondition; + } + + /** + * @param null|string $requestCondition + */ + public function setRequestCondition(string $requestCondition): void + { + $this->requestCondition = $requestCondition; + } + + /** + * @return int + */ + public function getResponseCode(): int + { + return $this->responseCode; + } + + /** + * @param int $responseCode + * + * @throws \InvalidArgumentException + */ + public function setResponseCode(int $responseCode): void + { + if (!\in_array($responseCode, self::VALID_RESPONSE_CODES, true)) { + throw new \InvalidArgumentException(sprintf('Invalid response code: %s', $responseCode)); + } + + $this->responseCode = $responseCode; + } + /** + * @return null|string + */ + public function getResponseUri(): ?string + { + return $this->responseUri; + } + + /** + * @param null|string $responseUri + */ + public function setResponseUri(string $responseUri): void + { + $this->responseUri = $responseUri; + } +} diff --git a/src/Routing/UrlRewriteLoader.php b/src/Routing/UrlRewriteLoader.php index 0a2f587..cb9a89b 100644 --- a/src/Routing/UrlRewriteLoader.php +++ b/src/Routing/UrlRewriteLoader.php @@ -12,19 +12,18 @@ namespace Terminal42\UrlRewriteBundle\Routing; -use Contao\StringUtil; -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Exception\TableNotFoundException; use Symfony\Component\Config\Loader\Loader; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; +use Terminal42\UrlRewriteBundle\ConfigProvider\ConfigProviderInterface; +use Terminal42\UrlRewriteBundle\RewriteConfig; class UrlRewriteLoader extends Loader { /** - * @var Connection + * @var ConfigProviderInterface */ - private $db; + private $configProvider; /** * Has been already loaded? @@ -36,11 +35,11 @@ class UrlRewriteLoader extends Loader /** * UrlRewriteLoader constructor. * - * @param Connection $db + * @param ConfigProviderInterface $configProvider */ - public function __construct(Connection $db) + public function __construct(ConfigProviderInterface $configProvider) { - $this->db = $db; + $this->configProvider = $configProvider; } /** @@ -54,22 +53,18 @@ public function load($resource, $type = null): RouteCollection $this->loaded = true; $collection = new RouteCollection(); + $configs = $this->configProvider->findAll(); - try { - $rewrites = $this->db->fetchAll('SELECT * FROM tl_url_rewrite'); - } catch (\PDOException | TableNotFoundException $e) { - return $collection; - } - - if (0 === count($rewrites)) { + if (0 === count($configs)) { return $collection; } $count = 0; - foreach ($rewrites as $rewrite) { + /** @var RewriteConfig $config */ + foreach ($configs as $config) { /** @var Route $route */ - foreach ($this->generateRoutes($rewrite) as $route) { + foreach ($this->generateRoutes($config) as $route) { if ($route !== null) { $collection->add('url_rewrite_'.$count++, $route); } @@ -90,19 +85,13 @@ public function supports($resource, $type = null): bool /** * Generate the routes. * - * @param array $config + * @param RewriteConfig $config * * @return \Generator */ - private function generateRoutes(array $config): \Generator + private function generateRoutes(RewriteConfig $config): \Generator { - $hosts = []; - - // Parse the hosts from config - if (isset($config['requestHosts'])) { - /** @var array $hosts */ - $hosts = array_unique(array_filter(StringUtil::deserialize($config['requestHosts'], true))); - } + $hosts = $config->getRequestHosts(); if (count($hosts) > 0) { foreach ($hosts as $host) { @@ -116,31 +105,25 @@ private function generateRoutes(array $config): \Generator /** * Create the route object. * - * @param array $config - * @param string|null $host + * @param RewriteConfig $config + * @param string|null $host * * @return Route|null */ - private function createRoute(array $config, string $host = null): ?Route + private function createRoute(RewriteConfig $config, string $host = null): ?Route { - if (!isset($config['id'], $config['type'], $config['requestPath'])) { - return null; - } + $route = new Route($config->getRequestPath()); + $route->setDefault('_controller', 'terminal42_url_rewrite.rewrite_controller:indexAction'); + $route->setDefault('_url_rewrite', $config->getIdentifier()); + $route->setRequirements($config->getRequestRequirements()); - switch ($config['type']) { - case 'basic': - $route = $this->createBasicRoute($config); - break; - case 'expert': - $route = $this->createExpertRoute($config); - break; - default: - throw new \InvalidArgumentException(sprintf('Unsupported database record config type: %s', $config['type'])); + // Set the condition + if (($condition = $config->getRequestCondition()) !== null) { + $route->setCondition($condition); + } else { + $route->setMethods('GET'); } - $route->setDefault('_controller', 'terminal42_url_rewrite.rewrite_controller:indexAction'); - $route->setDefault('_url_rewrite', $config['id']); - // Set the host if (null !== $host) { $route->setHost($host); @@ -148,49 +131,4 @@ private function createRoute(array $config, string $host = null): ?Route return $route; } - - /** - * Create the basic route. - * - * @param array $config - * - * @return Route - */ - private function createBasicRoute(array $config): Route - { - $route = new Route($config['requestPath']); - $route->setMethods('GET'); - - // Set the requirements - if (isset($config['requestRequirements'])) { - /** @var array $requirements */ - $requirements = StringUtil::deserialize($config['requestRequirements'], true); - $requirements = array_filter($requirements, function ($item) { - return $item['key'] !== '' && $item['value'] !== ''; - }); - - if (count($requirements) > 0) { - foreach ($requirements as $requirement) { - $route->setRequirement($requirement['key'], $requirement['value']); - } - } - } - - return $route; - } - - /** - * Create the expert route. - * - * @param array $config - * - * @return Route - */ - private function createExpertRoute(array $config): Route - { - $route = new Route($config['requestPath']); - $route->setCondition($config['requestCondition']); - - return $route; - } } diff --git a/src/Terminal42UrlRewriteBundle.php b/src/Terminal42UrlRewriteBundle.php index 139a01b..325a6db 100644 --- a/src/Terminal42UrlRewriteBundle.php +++ b/src/Terminal42UrlRewriteBundle.php @@ -14,6 +14,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; +use Terminal42\UrlRewriteBundle\DependencyInjection\Compiler\ConfigProviderPass; class Terminal42UrlRewriteBundle extends Bundle { @@ -22,5 +23,6 @@ class Terminal42UrlRewriteBundle extends Bundle */ public function build(ContainerBuilder $container): void { + $container->addCompilerPass(new ConfigProviderPass('terminal42_url_rewrite.provider.chain', 'terminal42_url_rewrite.config_provider')); } } diff --git a/tests/DependencyInjection/ConfigurationTest.php b/tests/DependencyInjection/ConfigurationTest.php new file mode 100644 index 0000000..7e39a7d --- /dev/null +++ b/tests/DependencyInjection/ConfigurationTest.php @@ -0,0 +1,75 @@ +assertInstanceOf(Configuration::class, new Configuration()); + } + + public function testValidConfig() + { + $yaml = Yaml::parse(file_get_contents(__DIR__ . '/../Fixtures/config_valid.yml')); + $config = (new Processor())->processConfiguration(new Configuration(), $yaml); + + $expected = [ + 'backend_management' => true, + 'entries' => [ + [ + 'request' => [ + 'path' => 'find/{address}', + 'hosts' => [], + 'requirements' => [], + ], + 'response' => [ + 'code' => 303, + 'uri' => 'https://www.google.com/maps?q={address}', + ], + ], + [ + 'request' => [ + 'path' => 'news/{news}', + 'requirements' => ['news' => '\d+'], + 'hosts' => [], + ], + 'response' => [ + 'code' => 301, + 'uri' => '{{news_url::{news}|absolute}}' + ], + ], + [ + 'request' => [ + 'path' => 'home.php', + 'hosts' => ['localhost'], + 'condition' => "context.getMethod() == 'GET' and request.query.has('page')", + 'requirements' => [], + ], + 'response' => [ + 'uri' => '{{link_url::{page}|absolute}}', + 'code' => 301, + ], + ], + ], + ]; + + static::assertSame($expected, $config); + } + + public function testInvalidConfig() + { + $this->expectException(InvalidConfigurationException::class); + + $yaml = Yaml::parse(file_get_contents(__DIR__ . '/../Fixtures/config_invalid.yml')); + (new Processor())->processConfiguration(new Configuration(), $yaml); + } +} diff --git a/tests/Fixtures/config_invalid.yml b/tests/Fixtures/config_invalid.yml new file mode 100644 index 0000000..cea45df --- /dev/null +++ b/tests/Fixtures/config_invalid.yml @@ -0,0 +1,5 @@ +terminal42_url_rewrite: + entries: + - + request: { path: 'find/{address}' } + response: { code: 404, uri: 'https://www.google.com/maps?q={address}' } diff --git a/tests/Fixtures/config_valid.yml b/tests/Fixtures/config_valid.yml new file mode 100644 index 0000000..8f538e8 --- /dev/null +++ b/tests/Fixtures/config_valid.yml @@ -0,0 +1,18 @@ +terminal42_url_rewrite: + backend_management: true + entries: + - + request: { path: 'find/{address}' } + response: { code: 303, uri: 'https://www.google.com/maps?q={address}' } + + - + request: { path: 'news/{news}', requirements: {news: '\d+'} } + response: { code: 301, uri: '{{news_url::{news}|absolute}}' } + + - + request: + path: 'home.php' + hosts: ['localhost'] + condition: "context.getMethod() == 'GET' and request.query.has('page')" + response: + uri: '{{link_url::{page}|absolute}}' From 25bb2f079a9478eed29c98ad9a5d3fd9adb42c7f Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Fri, 24 Nov 2017 13:11:25 +0100 Subject: [PATCH 02/11] Fixes to the last commit --- src/ConfigProvider/BundleConfigProvider.php | 4 ++-- src/ConfigProvider/DatabaseConfigProvider.php | 10 +++++----- src/Controller/RewriteController.php | 2 +- .../Terminal42UrlRewriteExtension.php | 2 +- src/Resources/config/services.yml | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ConfigProvider/BundleConfigProvider.php b/src/ConfigProvider/BundleConfigProvider.php index 542b316..c767f78 100644 --- a/src/ConfigProvider/BundleConfigProvider.php +++ b/src/ConfigProvider/BundleConfigProvider.php @@ -21,7 +21,7 @@ class BundleConfigProvider implements ConfigProviderInterface * * @param array $entries */ - public function __construct(array $entries) + public function __construct(array $entries = []) { $this->entries = $entries; } @@ -76,7 +76,7 @@ public function findAll(): array */ private function createConfig(int $id, array $data): ?RewriteConfig { - if (!isset($data['type'], $data['request'], $data['request']['path'], $data['response'], $data['response']['code'])) { + if (!isset($data['request'], $data['request']['path'], $data['response'], $data['response']['code'])) { return null; } diff --git a/src/ConfigProvider/DatabaseConfigProvider.php b/src/ConfigProvider/DatabaseConfigProvider.php index f6e6e69..dbc026a 100644 --- a/src/ConfigProvider/DatabaseConfigProvider.php +++ b/src/ConfigProvider/DatabaseConfigProvider.php @@ -17,7 +17,7 @@ class DatabaseConfigProvider implements ConfigProviderInterface /** * @var string */ - private $key = 'bundle'; + private $key = 'database'; /** * DatabaseConfigProvider constructor. @@ -59,7 +59,7 @@ public function find(string $id): ?RewriteConfig */ public function findAll(): array { - try{ + try { $records = $this->connection->fetchAll('SELECT * FROM tl_url_rewrite'); } catch (\PDOException | TableNotFoundException $e) { return []; @@ -103,10 +103,10 @@ private function createConfig(array $data): ?RewriteConfig switch ($data['type']) { // Basic type case 'basic': - if (isset($config['requestRequirements'])) { + if (isset($data['requestRequirements'])) { $requirements = []; - foreach (StringUtil::deserialize($config['requestRequirements'], true) as $requirement) { + foreach (StringUtil::deserialize($data['requestRequirements'], true) as $requirement) { if ($requirement['key'] !== '' && $requirement['value'] !== '') { $requirements[$requirement['key']] = $requirement['value']; } @@ -117,7 +117,7 @@ private function createConfig(array $data): ?RewriteConfig break; // Expert type case 'expert': - $config->setRequestCondition($config['requestCondition']); + $config->setRequestCondition($data['requestCondition']); break; default: throw new \RuntimeException(sprintf('Unsupported database record config type: %s', $data['type'])); diff --git a/src/Controller/RewriteController.php b/src/Controller/RewriteController.php index e0f345c..42f2950 100644 --- a/src/Controller/RewriteController.php +++ b/src/Controller/RewriteController.php @@ -54,7 +54,7 @@ public function __construct(ConfigProviderInterface $configProvider, ContaoFrame */ public function indexAction(Request $request): Response { - if (!$request->attributes->has('_url_rewrite') || !($rewriteId = $request->attributes->getInt('_url_rewrite'))) { + if (!$request->attributes->has('_url_rewrite') || !($rewriteId = $request->attributes->get('_url_rewrite'))) { throw new RouteNotFoundException('There _url_rewrite attribute is missing'); } diff --git a/src/DependencyInjection/Terminal42UrlRewriteExtension.php b/src/DependencyInjection/Terminal42UrlRewriteExtension.php index e9036f5..a4c9515 100644 --- a/src/DependencyInjection/Terminal42UrlRewriteExtension.php +++ b/src/DependencyInjection/Terminal42UrlRewriteExtension.php @@ -29,7 +29,7 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $loader->load('services.yml'); // Set the "backend management" parameter - $container->setParameter('terminal42_url_rewrite.backend_management', $mergedConfig['backend_management']); + $container->setParameter('terminal42_url_rewrite.backend_management', (bool) $mergedConfig['backend_management']); // Set the entries as argument for bundle config provider if (isset($mergedConfig['entries']) && $container->hasDefinition('terminal42_url_rewrite.provider.bundle')) { diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml index 72c8bf3..9a00e60 100644 --- a/src/Resources/config/services.yml +++ b/src/Resources/config/services.yml @@ -2,13 +2,13 @@ services: terminal42_url_rewrite.rewrite_controller: class: Terminal42\UrlRewriteBundle\Controller\RewriteController arguments: - - "@terminal42_url_rewrite.provider.database" + - "@terminal42_url_rewrite.provider.chain" - "@contao.framework" terminal42_url_rewrite.rewrite_loader: class: Terminal42\UrlRewriteBundle\Routing\UrlRewriteLoader arguments: - - "@terminal42_url_rewrite.provider.database" + - "@terminal42_url_rewrite.provider.chain" tags: - { name: routing.loader } From 7ec503dd2e9095e38050bfeeac82b0d9b37171ec Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Mon, 27 Nov 2017 08:45:35 +0100 Subject: [PATCH 03/11] Allow to order the config provider services by priority --- .../Compiler/ConfigProviderPass.php | 16 ++++++++++++++-- src/Resources/config/services.yml | 4 ++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/DependencyInjection/Compiler/ConfigProviderPass.php b/src/DependencyInjection/Compiler/ConfigProviderPass.php index 0a7eba2..6c5e656 100644 --- a/src/DependencyInjection/Compiler/ConfigProviderPass.php +++ b/src/DependencyInjection/Compiler/ConfigProviderPass.php @@ -40,9 +40,21 @@ public function process(ContainerBuilder $container) } $definition = $container->findDefinition($this->chain); - + $providers = []; + + // Get the config providers in the relevant order by priority foreach ($container->findTaggedServiceIds($this->tag) as $id => $tags) { - $definition->addMethodCall('addProvider', [new Reference($id)]); + $priority = isset($tags[0]['priority']) ? $tags[0]['priority'] : 0; + $providers[$priority][] = new Reference($id); + } + + krsort($providers); + + // Add the providers to the service + foreach ($providers as $v) { + foreach ($v as $vv) { + $definition->addMethodCall('addProvider', [$vv]); + } } } } diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml index 9a00e60..0948216 100644 --- a/src/Resources/config/services.yml +++ b/src/Resources/config/services.yml @@ -16,7 +16,7 @@ services: class: Terminal42\UrlRewriteBundle\ConfigProvider\BundleConfigProvider public: false tags: - - { name: terminal42_url_rewrite.config_provider } + - { name: terminal42_url_rewrite.config_provider, priority: 10 } terminal42_url_rewrite.provider.chain: class: Terminal42\UrlRewriteBundle\ConfigProvider\ChainConfigProvider @@ -28,4 +28,4 @@ services: arguments: - "@database_connection" tags: - - { name: terminal42_url_rewrite.config_provider } + - { name: terminal42_url_rewrite.config_provider, priority: 0 } From 712558c054ba380920ef3ba39754aeed5946b055 Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Mon, 27 Nov 2017 08:54:01 +0100 Subject: [PATCH 04/11] A little isset() improvement --- src/ConfigProvider/BundleConfigProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ConfigProvider/BundleConfigProvider.php b/src/ConfigProvider/BundleConfigProvider.php index c767f78..f3e626f 100644 --- a/src/ConfigProvider/BundleConfigProvider.php +++ b/src/ConfigProvider/BundleConfigProvider.php @@ -76,7 +76,7 @@ public function findAll(): array */ private function createConfig(int $id, array $data): ?RewriteConfig { - if (!isset($data['request'], $data['request']['path'], $data['response'], $data['response']['code'])) { + if (!isset($data['request']['path'], $data['response']['code'])) { return null; } From a9093c72ea54ff3b08eb65be1e4aa8d7a1bb7738 Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Mon, 27 Nov 2017 08:56:54 +0100 Subject: [PATCH 05/11] CS --- src/ConfigProvider/BundleConfigProvider.php | 16 ++++++++++++---- src/ConfigProvider/ChainConfigProvider.php | 14 +++++++++++--- src/ConfigProvider/ConfigProviderInterface.php | 12 ++++++++++-- src/ConfigProvider/DatabaseConfigProvider.php | 16 ++++++++++++---- .../Compiler/ConfigProviderPass.php | 10 +++++++++- src/DependencyInjection/Configuration.php | 10 +++++++++- .../Terminal42UrlRewriteExtension.php | 2 +- src/EventListener/RewriteContainerListener.php | 2 +- src/Resources/contao/config/config.php | 2 +- src/Resources/contao/dca/tl_url_rewrite.php | 2 +- .../contao/languages/de/tl_url_rewrite.php | 2 +- .../contao/languages/en/tl_url_rewrite.php | 2 +- src/RewriteConfig.php | 9 +++++++++ 13 files changed, 78 insertions(+), 21 deletions(-) diff --git a/src/ConfigProvider/BundleConfigProvider.php b/src/ConfigProvider/BundleConfigProvider.php index f3e626f..6d018e1 100644 --- a/src/ConfigProvider/BundleConfigProvider.php +++ b/src/ConfigProvider/BundleConfigProvider.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle\ConfigProvider; use Terminal42\UrlRewriteBundle\RewriteConfig; @@ -27,7 +35,7 @@ public function __construct(array $entries = []) } /** - * @inheritDoc + * {@inheritdoc} */ public function find(string $id): ?RewriteConfig { @@ -47,7 +55,7 @@ public function find(string $id): ?RewriteConfig } /** - * @inheritDoc + * {@inheritdoc} */ public function findAll(): array { @@ -67,7 +75,7 @@ public function findAll(): array } /** - * Create the config + * Create the config. * * @param int $id * @param array $data @@ -80,7 +88,7 @@ private function createConfig(int $id, array $data): ?RewriteConfig return null; } - $config = new RewriteConfig($this->key . ':' . $id, $data['request']['path'], (int) $data['response']['code']); + $config = new RewriteConfig($this->key.':'.$id, $data['request']['path'], (int) $data['response']['code']); // Request hosts if (isset($data['request']['hosts'])) { diff --git a/src/ConfigProvider/ChainConfigProvider.php b/src/ConfigProvider/ChainConfigProvider.php index 7c32fbd..6aaf8f5 100644 --- a/src/ConfigProvider/ChainConfigProvider.php +++ b/src/ConfigProvider/ChainConfigProvider.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle\ConfigProvider; use Terminal42\UrlRewriteBundle\RewriteConfig; @@ -12,7 +20,7 @@ class ChainConfigProvider implements ConfigProviderInterface private $providers = []; /** - * Add the config provider + * Add the config provider. * * @param ConfigProviderInterface $provider */ @@ -22,7 +30,7 @@ public function addProvider(ConfigProviderInterface $provider): void } /** - * @inheritDoc + * {@inheritdoc} */ public function find(string $id): ?RewriteConfig { @@ -37,7 +45,7 @@ public function find(string $id): ?RewriteConfig } /** - * @inheritDoc + * {@inheritdoc} */ public function findAll(): array { diff --git a/src/ConfigProvider/ConfigProviderInterface.php b/src/ConfigProvider/ConfigProviderInterface.php index 0e42705..5707c2d 100644 --- a/src/ConfigProvider/ConfigProviderInterface.php +++ b/src/ConfigProvider/ConfigProviderInterface.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle\ConfigProvider; use Terminal42\UrlRewriteBundle\RewriteConfig; @@ -7,7 +15,7 @@ interface ConfigProviderInterface { /** - * Find the config + * Find the config. * * @param string $id * @@ -16,7 +24,7 @@ interface ConfigProviderInterface public function find(string $id): ?RewriteConfig; /** - * Find all configs + * Find all configs. * * @return array */ diff --git a/src/ConfigProvider/DatabaseConfigProvider.php b/src/ConfigProvider/DatabaseConfigProvider.php index dbc026a..508211e 100644 --- a/src/ConfigProvider/DatabaseConfigProvider.php +++ b/src/ConfigProvider/DatabaseConfigProvider.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle\ConfigProvider; use Contao\StringUtil; @@ -30,7 +38,7 @@ public function __construct(Connection $connection) } /** - * @inheritDoc + * {@inheritdoc} */ public function find(string $id): ?RewriteConfig { @@ -55,7 +63,7 @@ public function find(string $id): ?RewriteConfig } /** - * @inheritDoc + * {@inheritdoc} */ public function findAll(): array { @@ -81,7 +89,7 @@ public function findAll(): array } /** - * Create the config + * Create the config. * * @param array $data * @@ -93,7 +101,7 @@ private function createConfig(array $data): ?RewriteConfig return null; } - $config = new RewriteConfig($this->key . ':' . $data['id'], $data['requestPath'], (int) $data['responseCode']); + $config = new RewriteConfig($this->key.':'.$data['id'], $data['requestPath'], (int) $data['responseCode']); // Hosts if (isset($data['requestHosts'])) { diff --git a/src/DependencyInjection/Compiler/ConfigProviderPass.php b/src/DependencyInjection/Compiler/ConfigProviderPass.php index 6c5e656..99f41f5 100644 --- a/src/DependencyInjection/Compiler/ConfigProviderPass.php +++ b/src/DependencyInjection/Compiler/ConfigProviderPass.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; @@ -31,7 +39,7 @@ public function __construct($chain, $tag) } /** - * @inheritDoc + * {@inheritdoc} */ public function process(ContainerBuilder $container) { diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index b6d39c8..ec0f27b 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle\DependencyInjection; use Symfony\Component\Config\Definition\Builder\TreeBuilder; @@ -9,7 +17,7 @@ class Configuration implements ConfigurationInterface { /** - * @inheritDoc + * {@inheritdoc} */ public function getConfigTreeBuilder() { diff --git a/src/DependencyInjection/Terminal42UrlRewriteExtension.php b/src/DependencyInjection/Terminal42UrlRewriteExtension.php index a4c9515..dddebe4 100644 --- a/src/DependencyInjection/Terminal42UrlRewriteExtension.php +++ b/src/DependencyInjection/Terminal42UrlRewriteExtension.php @@ -20,7 +20,7 @@ class Terminal42UrlRewriteExtension extends ConfigurableExtension { /** - * @inheritDoc + * {@inheritdoc} */ protected function loadInternal(array $mergedConfig, ContainerBuilder $container) { diff --git a/src/EventListener/RewriteContainerListener.php b/src/EventListener/RewriteContainerListener.php index bbdb605..90d3e2e 100644 --- a/src/EventListener/RewriteContainerListener.php +++ b/src/EventListener/RewriteContainerListener.php @@ -100,7 +100,7 @@ public function getResponseCodes(): array } /** - * Generate the examples + * Generate the examples. * * @return string */ diff --git a/src/Resources/contao/config/config.php b/src/Resources/contao/config/config.php index 1318c7e..ceafcca 100644 --- a/src/Resources/contao/config/config.php +++ b/src/Resources/contao/config/config.php @@ -9,7 +9,7 @@ */ /** - * Add the backend module if allowed + * Add the backend module if allowed. */ if (\System::getContainer()->getParameter('terminal42_url_rewrite.backend_management')) { $GLOBALS['BE_MOD']['system']['url_rewrites'] = ['tables' => ['tl_url_rewrite']]; diff --git a/src/Resources/contao/dca/tl_url_rewrite.php b/src/Resources/contao/dca/tl_url_rewrite.php index 11579f5..788132f 100644 --- a/src/Resources/contao/dca/tl_url_rewrite.php +++ b/src/Resources/contao/dca/tl_url_rewrite.php @@ -182,7 +182,7 @@ ], ]; -/** +/* * Remove the DCA if not allowed */ if (!\System::getContainer()->getParameter('terminal42_url_rewrite.backend_management')) { diff --git a/src/Resources/contao/languages/de/tl_url_rewrite.php b/src/Resources/contao/languages/de/tl_url_rewrite.php index 73a440b..2c91d34 100644 --- a/src/Resources/contao/languages/de/tl_url_rewrite.php +++ b/src/Resources/contao/languages/de/tl_url_rewrite.php @@ -42,7 +42,7 @@ 'expert' => ['komplex', 'Erlaubt die Anfrage-Zuordnung auf Basis der Symfony Expression Language. Für weitere Informationen besuchen Sie bitte diese Seite.'], ]; -/** +/* * Examples */ $GLOBALS['TL_LANG']['tl_url_rewrite']['examples'] = [ diff --git a/src/Resources/contao/languages/en/tl_url_rewrite.php b/src/Resources/contao/languages/en/tl_url_rewrite.php index ac0c201..aae444c 100644 --- a/src/Resources/contao/languages/en/tl_url_rewrite.php +++ b/src/Resources/contao/languages/en/tl_url_rewrite.php @@ -42,7 +42,7 @@ 'expert' => ['Expert', 'Allows to define the request condition using the Expression Language. For more information please visit this link.'], ]; -/** +/* * Examples */ $GLOBALS['TL_LANG']['tl_url_rewrite']['examples'] = [ diff --git a/src/RewriteConfig.php b/src/RewriteConfig.php index 3ae00f1..5afdd2f 100644 --- a/src/RewriteConfig.php +++ b/src/RewriteConfig.php @@ -1,5 +1,13 @@ + * @license MIT + */ + namespace Terminal42\UrlRewriteBundle; class RewriteConfig @@ -148,6 +156,7 @@ public function setResponseCode(int $responseCode): void $this->responseCode = $responseCode; } + /** * @return null|string */ From ce7b35b9faaf1ba044c34ca3d3733816d7ec157a Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Tue, 28 Nov 2017 11:26:33 +0100 Subject: [PATCH 06/11] Improved the handling of config providers in compiler pass --- .../Compiler/ConfigProviderPass.php | 19 ++++++------------- src/Resources/config/services.yml | 4 ++-- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/DependencyInjection/Compiler/ConfigProviderPass.php b/src/DependencyInjection/Compiler/ConfigProviderPass.php index 99f41f5..d60c277 100644 --- a/src/DependencyInjection/Compiler/ConfigProviderPass.php +++ b/src/DependencyInjection/Compiler/ConfigProviderPass.php @@ -11,11 +11,14 @@ namespace Terminal42\UrlRewriteBundle\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; +use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; class ConfigProviderPass implements CompilerPassInterface { + use PriorityTaggedServiceTrait; + /** * @var string */ @@ -48,20 +51,10 @@ public function process(ContainerBuilder $container) } $definition = $container->findDefinition($this->chain); - $providers = []; - - // Get the config providers in the relevant order by priority - foreach ($container->findTaggedServiceIds($this->tag) as $id => $tags) { - $priority = isset($tags[0]['priority']) ? $tags[0]['priority'] : 0; - $providers[$priority][] = new Reference($id); - } - - krsort($providers); - // Add the providers to the service - foreach ($providers as $v) { - foreach ($v as $vv) { - $definition->addMethodCall('addProvider', [$vv]); + foreach ($this->findAndSortTaggedServices($this->tag, $container) as $services) { + foreach ($services as $service) { + $definition->addMethodCall('addProvider', [$service]); } } } diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml index 0948216..3c4726d 100644 --- a/src/Resources/config/services.yml +++ b/src/Resources/config/services.yml @@ -16,7 +16,7 @@ services: class: Terminal42\UrlRewriteBundle\ConfigProvider\BundleConfigProvider public: false tags: - - { name: terminal42_url_rewrite.config_provider, priority: 10 } + - { name: terminal42_url_rewrite.config_provider, priority: 64 } terminal42_url_rewrite.provider.chain: class: Terminal42\UrlRewriteBundle\ConfigProvider\ChainConfigProvider @@ -28,4 +28,4 @@ services: arguments: - "@database_connection" tags: - - { name: terminal42_url_rewrite.config_provider, priority: 0 } + - { name: terminal42_url_rewrite.config_provider, priority: 32 } From dcb94187438af72071594964ff6e327c1f8f063f Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Tue, 28 Nov 2017 11:28:46 +0100 Subject: [PATCH 07/11] Remove the database config provider service if backend management is disabled --- .../Terminal42UrlRewriteExtension.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/DependencyInjection/Terminal42UrlRewriteExtension.php b/src/DependencyInjection/Terminal42UrlRewriteExtension.php index dddebe4..27b952f 100644 --- a/src/DependencyInjection/Terminal42UrlRewriteExtension.php +++ b/src/DependencyInjection/Terminal42UrlRewriteExtension.php @@ -28,8 +28,15 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container $loader->load('listener.yml'); $loader->load('services.yml'); + $hasBackendManagement = (bool) $mergedConfig['backend_management']; + // Set the "backend management" parameter - $container->setParameter('terminal42_url_rewrite.backend_management', (bool) $mergedConfig['backend_management']); + $container->setParameter('terminal42_url_rewrite.backend_management', $hasBackendManagement); + + // Remove the database provider if backend management is not available + if (!$hasBackendManagement) { + $container->removeDefinition('terminal42_url_rewrite.provider.database'); + } // Set the entries as argument for bundle config provider if (isset($mergedConfig['entries']) && $container->hasDefinition('terminal42_url_rewrite.provider.bundle')) { From 6131e5ce9799521a72428721a20eac6bbcb94170 Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Tue, 28 Nov 2017 11:45:01 +0100 Subject: [PATCH 08/11] Use the chain provider only if there are multiple providers --- .../Compiler/ConfigProviderPass.php | 26 ++++++++++++++----- src/Resources/config/services.yml | 11 +++++--- src/Terminal42UrlRewriteBundle.php | 6 ++++- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/DependencyInjection/Compiler/ConfigProviderPass.php b/src/DependencyInjection/Compiler/ConfigProviderPass.php index d60c277..e3762ef 100644 --- a/src/DependencyInjection/Compiler/ConfigProviderPass.php +++ b/src/DependencyInjection/Compiler/ConfigProviderPass.php @@ -13,12 +13,16 @@ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Reference; class ConfigProviderPass implements CompilerPassInterface { use PriorityTaggedServiceTrait; + /** + * @var string + */ + private $alias; + /** * @var string */ @@ -32,11 +36,13 @@ class ConfigProviderPass implements CompilerPassInterface /** * ConfigProviderPass constructor. * + * @param string $alias * @param string $chain - * @param string $tag + * @param $tag */ - public function __construct($chain, $tag) + public function __construct($alias, $chain, $tag) { + $this->alias = $alias; $this->chain = $chain; $this->tag = $tag; } @@ -46,15 +52,21 @@ public function __construct($chain, $tag) */ public function process(ContainerBuilder $container) { - if (!$container->has($this->chain)) { + $services = $this->findAndSortTaggedServices($this->tag, $container); + + // If there's only one service or chain service is not present alias the first service + if ((count($services) === 1 && count($services[0]) === 1) || !$container->has($this->chain)) { + $container->setAlias($this->alias, (string) $services[0]); + return; } $definition = $container->findDefinition($this->chain); - foreach ($this->findAndSortTaggedServices($this->tag, $container) as $services) { - foreach ($services as $service) { - $definition->addMethodCall('addProvider', [$service]); + // Add providers to the chain + foreach ($services as $providers) { + foreach ($providers as $provider) { + $definition->addMethodCall('addProvider', [$provider]); } } } diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml index 3c4726d..182e3e7 100644 --- a/src/Resources/config/services.yml +++ b/src/Resources/config/services.yml @@ -2,21 +2,24 @@ services: terminal42_url_rewrite.rewrite_controller: class: Terminal42\UrlRewriteBundle\Controller\RewriteController arguments: - - "@terminal42_url_rewrite.provider.chain" + - "@terminal42_url_rewrite.provider" - "@contao.framework" terminal42_url_rewrite.rewrite_loader: class: Terminal42\UrlRewriteBundle\Routing\UrlRewriteLoader arguments: - - "@terminal42_url_rewrite.provider.chain" + - "@terminal42_url_rewrite.provider" tags: - { name: routing.loader } + terminal42_url_rewrite.provider: + alias: terminal42_url_rewrite.provider.chain + terminal42_url_rewrite.provider.bundle: class: Terminal42\UrlRewriteBundle\ConfigProvider\BundleConfigProvider public: false tags: - - { name: terminal42_url_rewrite.config_provider, priority: 64 } + - { name: terminal42_url_rewrite.provider, priority: 64 } terminal42_url_rewrite.provider.chain: class: Terminal42\UrlRewriteBundle\ConfigProvider\ChainConfigProvider @@ -28,4 +31,4 @@ services: arguments: - "@database_connection" tags: - - { name: terminal42_url_rewrite.config_provider, priority: 32 } + - { name: terminal42_url_rewrite.provider, priority: 32 } diff --git a/src/Terminal42UrlRewriteBundle.php b/src/Terminal42UrlRewriteBundle.php index 325a6db..4d31768 100644 --- a/src/Terminal42UrlRewriteBundle.php +++ b/src/Terminal42UrlRewriteBundle.php @@ -23,6 +23,10 @@ class Terminal42UrlRewriteBundle extends Bundle */ public function build(ContainerBuilder $container): void { - $container->addCompilerPass(new ConfigProviderPass('terminal42_url_rewrite.provider.chain', 'terminal42_url_rewrite.config_provider')); + $container->addCompilerPass(new ConfigProviderPass( + 'terminal42_url_rewrite.provider', + 'terminal42_url_rewrite.provider.chain', + 'terminal42_url_rewrite.provider' + )); } } From f6bd584a8aec6c8a4ab5f9ca6684e47cab767f7d Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Tue, 28 Nov 2017 11:51:54 +0100 Subject: [PATCH 09/11] Added the RewriteConfigInterface --- src/ConfigProvider/BundleConfigProvider.php | 3 +- src/ConfigProvider/ChainConfigProvider.php | 4 +- .../ConfigProviderInterface.php | 6 +-- src/ConfigProvider/DatabaseConfigProvider.php | 3 +- src/Controller/RewriteController.php | 6 +-- src/DependencyInjection/Configuration.php | 4 +- .../RewriteContainerListener.php | 4 +- src/RewriteConfig.php | 4 +- src/RewriteConfigInterface.php | 51 +++++++++++++++++++ src/Routing/UrlRewriteLoader.php | 12 ++--- 10 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 src/RewriteConfigInterface.php diff --git a/src/ConfigProvider/BundleConfigProvider.php b/src/ConfigProvider/BundleConfigProvider.php index 6d018e1..e17d1cc 100644 --- a/src/ConfigProvider/BundleConfigProvider.php +++ b/src/ConfigProvider/BundleConfigProvider.php @@ -11,6 +11,7 @@ namespace Terminal42\UrlRewriteBundle\ConfigProvider; use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class BundleConfigProvider implements ConfigProviderInterface { @@ -37,7 +38,7 @@ public function __construct(array $entries = []) /** * {@inheritdoc} */ - public function find(string $id): ?RewriteConfig + public function find(string $id): ?RewriteConfigInterface { list($key, $id) = explode(':', $id); diff --git a/src/ConfigProvider/ChainConfigProvider.php b/src/ConfigProvider/ChainConfigProvider.php index 6aaf8f5..c56de5d 100644 --- a/src/ConfigProvider/ChainConfigProvider.php +++ b/src/ConfigProvider/ChainConfigProvider.php @@ -10,7 +10,7 @@ namespace Terminal42\UrlRewriteBundle\ConfigProvider; -use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class ChainConfigProvider implements ConfigProviderInterface { @@ -32,7 +32,7 @@ public function addProvider(ConfigProviderInterface $provider): void /** * {@inheritdoc} */ - public function find(string $id): ?RewriteConfig + public function find(string $id): ?RewriteConfigInterface { /** @var ConfigProviderInterface $provider */ foreach ($this->providers as $provider) { diff --git a/src/ConfigProvider/ConfigProviderInterface.php b/src/ConfigProvider/ConfigProviderInterface.php index 5707c2d..ec6b93b 100644 --- a/src/ConfigProvider/ConfigProviderInterface.php +++ b/src/ConfigProvider/ConfigProviderInterface.php @@ -10,7 +10,7 @@ namespace Terminal42\UrlRewriteBundle\ConfigProvider; -use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; interface ConfigProviderInterface { @@ -19,9 +19,9 @@ interface ConfigProviderInterface * * @param string $id * - * @return RewriteConfig|null + * @return RewriteConfigInterface|null */ - public function find(string $id): ?RewriteConfig; + public function find(string $id): ?RewriteConfigInterface; /** * Find all configs. diff --git a/src/ConfigProvider/DatabaseConfigProvider.php b/src/ConfigProvider/DatabaseConfigProvider.php index 508211e..5345cb7 100644 --- a/src/ConfigProvider/DatabaseConfigProvider.php +++ b/src/ConfigProvider/DatabaseConfigProvider.php @@ -14,6 +14,7 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Exception\TableNotFoundException; use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class DatabaseConfigProvider implements ConfigProviderInterface { @@ -40,7 +41,7 @@ public function __construct(Connection $connection) /** * {@inheritdoc} */ - public function find(string $id): ?RewriteConfig + public function find(string $id): ?RewriteConfigInterface { list($key, $id) = explode(':', $id); diff --git a/src/Controller/RewriteController.php b/src/Controller/RewriteController.php index 42f2950..00dd330 100644 --- a/src/Controller/RewriteController.php +++ b/src/Controller/RewriteController.php @@ -17,7 +17,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Exception\RouteNotFoundException; use Terminal42\UrlRewriteBundle\ConfigProvider\ConfigProviderInterface; -use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class RewriteController { @@ -79,11 +79,11 @@ public function indexAction(Request $request): Response * Generate the URI. * * @param Request $request - * @param RewriteConfig $config + * @param RewriteConfigInterface $config * * @return string|null */ - private function generateUri(Request $request, RewriteConfig $config): ?string + private function generateUri(Request $request, RewriteConfigInterface $config): ?string { if (($uri = $config->getResponseUri()) === null) { return null; diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index ec0f27b..eef4136 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -12,7 +12,7 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; -use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class Configuration implements ConfigurationInterface { @@ -59,7 +59,7 @@ public function getConfigTreeBuilder() ->info('The response code.') ->defaultValue(301) ->validate() - ->ifNotInArray(RewriteConfig::VALID_RESPONSE_CODES) + ->ifNotInArray(RewriteConfigInterface::VALID_RESPONSE_CODES) ->thenInvalid('Invalid response code %s.') ->end() ->end() diff --git a/src/EventListener/RewriteContainerListener.php b/src/EventListener/RewriteContainerListener.php index 90d3e2e..bf34e5b 100644 --- a/src/EventListener/RewriteContainerListener.php +++ b/src/EventListener/RewriteContainerListener.php @@ -13,7 +13,7 @@ use Symfony\Bundle\FrameworkBundle\Routing\Router; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpFoundation\Response; -use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class RewriteContainerListener { @@ -92,7 +92,7 @@ public function getResponseCodes(): array { $options = []; - foreach (RewriteConfig::VALID_RESPONSE_CODES as $code) { + foreach (RewriteConfigInterface::VALID_RESPONSE_CODES as $code) { $options[$code] = $code.' '.Response::$statusTexts[$code]; } diff --git a/src/RewriteConfig.php b/src/RewriteConfig.php index 5afdd2f..63d0ae5 100644 --- a/src/RewriteConfig.php +++ b/src/RewriteConfig.php @@ -10,10 +10,8 @@ namespace Terminal42\UrlRewriteBundle; -class RewriteConfig +class RewriteConfig implements RewriteConfigInterface { - const VALID_RESPONSE_CODES = [301, 302, 303, 307, 410]; - /** * @var string */ diff --git a/src/RewriteConfigInterface.php b/src/RewriteConfigInterface.php new file mode 100644 index 0000000..7f3fed9 --- /dev/null +++ b/src/RewriteConfigInterface.php @@ -0,0 +1,51 @@ + + * @license MIT + */ + +namespace Terminal42\UrlRewriteBundle; + +interface RewriteConfigInterface +{ + const VALID_RESPONSE_CODES = [301, 302, 303, 307, 410]; + + /** + * @return string + */ + public function getIdentifier(): string; + + /** + * @return string + */ + public function getRequestPath(): string; + + /** + * @return array + */ + public function getRequestHosts(): array; + + /** + * @return array + */ + public function getRequestRequirements(): array; + + /** + * @return null|string + */ + public function getRequestCondition(): ?string; + + /** + * @return int + */ + public function getResponseCode(): int; + + /** + * @return null|string + */ + public function getResponseUri(): ?string; +} diff --git a/src/Routing/UrlRewriteLoader.php b/src/Routing/UrlRewriteLoader.php index cb9a89b..8c83513 100644 --- a/src/Routing/UrlRewriteLoader.php +++ b/src/Routing/UrlRewriteLoader.php @@ -16,7 +16,7 @@ use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; use Terminal42\UrlRewriteBundle\ConfigProvider\ConfigProviderInterface; -use Terminal42\UrlRewriteBundle\RewriteConfig; +use Terminal42\UrlRewriteBundle\RewriteConfigInterface; class UrlRewriteLoader extends Loader { @@ -61,7 +61,7 @@ public function load($resource, $type = null): RouteCollection $count = 0; - /** @var RewriteConfig $config */ + /** @var RewriteConfigInterface $config */ foreach ($configs as $config) { /** @var Route $route */ foreach ($this->generateRoutes($config) as $route) { @@ -85,11 +85,11 @@ public function supports($resource, $type = null): bool /** * Generate the routes. * - * @param RewriteConfig $config + * @param RewriteConfigInterface $config * * @return \Generator */ - private function generateRoutes(RewriteConfig $config): \Generator + private function generateRoutes(RewriteConfigInterface $config): \Generator { $hosts = $config->getRequestHosts(); @@ -105,12 +105,12 @@ private function generateRoutes(RewriteConfig $config): \Generator /** * Create the route object. * - * @param RewriteConfig $config + * @param RewriteConfigInterface $config * @param string|null $host * * @return Route|null */ - private function createRoute(RewriteConfig $config, string $host = null): ?Route + private function createRoute(RewriteConfigInterface $config, string $host = null): ?Route { $route = new Route($config->getRequestPath()); $route->setDefault('_controller', 'terminal42_url_rewrite.rewrite_controller:indexAction'); From 99d021b6eb41f5abe8668f2bbad8812c48862215 Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Tue, 28 Nov 2017 12:51:35 +0100 Subject: [PATCH 10/11] Improved the juggling of the rewrite config --- src/ConfigProvider/BundleConfigProvider.php | 23 ++++------------- src/ConfigProvider/ChainConfigProvider.php | 25 +++++++++++++++++-- src/ConfigProvider/DatabaseConfigProvider.php | 19 +++++--------- .../Compiler/ConfigProviderPass.php | 8 +++--- src/RewriteConfig.php | 8 ++++++ src/RewriteConfigInterface.php | 5 ++++ 6 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/ConfigProvider/BundleConfigProvider.php b/src/ConfigProvider/BundleConfigProvider.php index e17d1cc..6511a2d 100644 --- a/src/ConfigProvider/BundleConfigProvider.php +++ b/src/ConfigProvider/BundleConfigProvider.php @@ -20,11 +20,6 @@ class BundleConfigProvider implements ConfigProviderInterface */ private $entries = []; - /** - * @var string - */ - private $key = 'bundle'; - /** * BundleConfigProvider constructor. * @@ -40,14 +35,6 @@ public function __construct(array $entries = []) */ public function find(string $id): ?RewriteConfigInterface { - list($key, $id) = explode(':', $id); - - // Return if the key is not supported - if ($key !== $this->key) { - return null; - } - - // Return if the entry does not exist if (!array_key_exists($id, $this->entries)) { return null; } @@ -67,7 +54,7 @@ public function findAll(): array $configs = []; foreach ($this->entries as $id => $entry) { - if (($config = $this->createConfig($id, $entry)) !== null) { + if (($config = $this->createConfig((string) $id, $entry)) !== null) { $configs[] = $config; } } @@ -78,18 +65,18 @@ public function findAll(): array /** * Create the config. * - * @param int $id - * @param array $data + * @param string $id + * @param array $data * * @return null|RewriteConfig */ - private function createConfig(int $id, array $data): ?RewriteConfig + private function createConfig(string $id, array $data): ?RewriteConfig { if (!isset($data['request']['path'], $data['response']['code'])) { return null; } - $config = new RewriteConfig($this->key.':'.$id, $data['request']['path'], (int) $data['response']['code']); + $config = new RewriteConfig($id, $data['request']['path'], (int) $data['response']['code']); // Request hosts if (isset($data['request']['hosts'])) { diff --git a/src/ConfigProvider/ChainConfigProvider.php b/src/ConfigProvider/ChainConfigProvider.php index c56de5d..b9b479e 100644 --- a/src/ConfigProvider/ChainConfigProvider.php +++ b/src/ConfigProvider/ChainConfigProvider.php @@ -34,9 +34,11 @@ public function addProvider(ConfigProviderInterface $provider): void */ public function find(string $id): ?RewriteConfigInterface { + list($class, $id) = explode(':', $id); + /** @var ConfigProviderInterface $provider */ foreach ($this->providers as $provider) { - if (($config = $provider->find($id)) !== null) { + if ($class === $this->getProviderIdentifier($provider) && ($config = $provider->find($id)) !== null) { return $config; } } @@ -53,9 +55,28 @@ public function findAll(): array /** @var ConfigProviderInterface $provider */ foreach ($this->providers as $provider) { - $configs = array_merge($configs, $provider->findAll()); + $providerConfigs = $provider->findAll(); + + /** @var RewriteConfigInterface $config */ + foreach ($providerConfigs as $config) { + $config->setIdentifier($this->getProviderIdentifier($provider) . ':' . $config->getIdentifier()); + } + + $configs = array_merge($configs, $providerConfigs); } return $configs; } + + /** + * Get the provider identifier + * + * @param ConfigProviderInterface $provider + * + * @return string + */ + private function getProviderIdentifier(ConfigProviderInterface $provider): string + { + return get_class($provider); + } } diff --git a/src/ConfigProvider/DatabaseConfigProvider.php b/src/ConfigProvider/DatabaseConfigProvider.php index 5345cb7..b1a0bc3 100644 --- a/src/ConfigProvider/DatabaseConfigProvider.php +++ b/src/ConfigProvider/DatabaseConfigProvider.php @@ -23,11 +23,6 @@ class DatabaseConfigProvider implements ConfigProviderInterface */ private $connection; - /** - * @var string - */ - private $key = 'database'; - /** * DatabaseConfigProvider constructor. * @@ -43,13 +38,6 @@ public function __construct(Connection $connection) */ public function find(string $id): ?RewriteConfigInterface { - list($key, $id) = explode(':', $id); - - // Return if the key is not supported - if ($key !== $this->key) { - return null; - } - try { $data = $this->connection->fetchAssoc('SELECT * FROM tl_url_rewrite WHERE id=?', [$id]); } catch (\PDOException | TableNotFoundException $e) { @@ -102,13 +90,18 @@ private function createConfig(array $data): ?RewriteConfig return null; } - $config = new RewriteConfig($this->key.':'.$data['id'], $data['requestPath'], (int) $data['responseCode']); + $config = new RewriteConfig((string) $data['id'], $data['requestPath'], (int) $data['responseCode']); // Hosts if (isset($data['requestHosts'])) { $config->setRequestHosts(StringUtil::deserialize($data['requestHosts'], true)); } + // Response URI + if (isset($data['responseUri'])) { + $config->setResponseUri($data['responseUri']); + } + switch ($data['type']) { // Basic type case 'basic': diff --git a/src/DependencyInjection/Compiler/ConfigProviderPass.php b/src/DependencyInjection/Compiler/ConfigProviderPass.php index e3762ef..dfe90d0 100644 --- a/src/DependencyInjection/Compiler/ConfigProviderPass.php +++ b/src/DependencyInjection/Compiler/ConfigProviderPass.php @@ -55,7 +55,7 @@ public function process(ContainerBuilder $container) $services = $this->findAndSortTaggedServices($this->tag, $container); // If there's only one service or chain service is not present alias the first service - if ((count($services) === 1 && count($services[0]) === 1) || !$container->has($this->chain)) { + if ((count($services) === 1 && count($services[0]) === 1) || !$container->hasDefinition($this->chain)) { $container->setAlias($this->alias, (string) $services[0]); return; @@ -64,10 +64,8 @@ public function process(ContainerBuilder $container) $definition = $container->findDefinition($this->chain); // Add providers to the chain - foreach ($services as $providers) { - foreach ($providers as $provider) { - $definition->addMethodCall('addProvider', [$provider]); - } + foreach ($services as $service) { + $definition->addMethodCall('addProvider', [$service]); } } } diff --git a/src/RewriteConfig.php b/src/RewriteConfig.php index 63d0ae5..b03fd3c 100644 --- a/src/RewriteConfig.php +++ b/src/RewriteConfig.php @@ -69,6 +69,14 @@ public function getIdentifier(): string return $this->identifier; } + /** + * @inheritDoc + */ + public function setIdentifier(string $identifier): void + { + $this->identifier = $identifier; + } + /** * @return string */ diff --git a/src/RewriteConfigInterface.php b/src/RewriteConfigInterface.php index 7f3fed9..eaed98b 100644 --- a/src/RewriteConfigInterface.php +++ b/src/RewriteConfigInterface.php @@ -19,6 +19,11 @@ interface RewriteConfigInterface */ public function getIdentifier(): string; + /** + * @param string $identifier + */ + public function setIdentifier(string $identifier): void; + /** * @return string */ From f87b958a16ab6d3cd3ba519c6eef8a8f1aab908e Mon Sep 17 00:00:00 2001 From: Kamil Kuzminski Date: Wed, 29 Nov 2017 10:36:35 +0100 Subject: [PATCH 11/11] Fixed the rewrite controller not matching the route with ID 0 --- src/Controller/RewriteController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Controller/RewriteController.php b/src/Controller/RewriteController.php index 00dd330..cff8138 100644 --- a/src/Controller/RewriteController.php +++ b/src/Controller/RewriteController.php @@ -54,10 +54,11 @@ public function __construct(ConfigProviderInterface $configProvider, ContaoFrame */ public function indexAction(Request $request): Response { - if (!$request->attributes->has('_url_rewrite') || !($rewriteId = $request->attributes->get('_url_rewrite'))) { - throw new RouteNotFoundException('There _url_rewrite attribute is missing'); + if (!$request->attributes->has('_url_rewrite')) { + throw new RouteNotFoundException('The _url_rewrite attribute is missing'); } + $rewriteId = $request->attributes->get('_url_rewrite'); $config = $this->configProvider->find($rewriteId); if (null === $config) {