composer update
This commit is contained in:
18
vendor/symfony/routing/Annotation/Route.php
vendored
18
vendor/symfony/routing/Annotation/Route.php
vendored
@@ -31,6 +31,9 @@ class Route
|
||||
private $methods = [];
|
||||
private $schemes = [];
|
||||
private $condition;
|
||||
private $locale;
|
||||
private $format;
|
||||
private $utf8;
|
||||
|
||||
/**
|
||||
* @param array $data An array of key/value parameters
|
||||
@@ -53,6 +56,21 @@ class Route
|
||||
unset($data['path']);
|
||||
}
|
||||
|
||||
if (isset($data['locale'])) {
|
||||
$data['defaults']['_locale'] = $data['locale'];
|
||||
unset($data['locale']);
|
||||
}
|
||||
|
||||
if (isset($data['format'])) {
|
||||
$data['defaults']['_format'] = $data['format'];
|
||||
unset($data['format']);
|
||||
}
|
||||
|
||||
if (isset($data['utf8'])) {
|
||||
$data['options']['utf8'] = filter_var($data['utf8'], FILTER_VALIDATE_BOOLEAN) ?: false;
|
||||
unset($data['utf8']);
|
||||
}
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
$method = 'set'.str_replace('_', '', $key);
|
||||
if (!method_exists($this, $method)) {
|
||||
|
||||
12
vendor/symfony/routing/CHANGELOG.md
vendored
12
vendor/symfony/routing/CHANGELOG.md
vendored
@@ -1,6 +1,18 @@
|
||||
CHANGELOG
|
||||
=========
|
||||
|
||||
4.3.0
|
||||
-----
|
||||
|
||||
* added `CompiledUrlMatcher` and `CompiledUrlMatcherDumper`
|
||||
* added `CompiledUrlGenerator` and `CompiledUrlGeneratorDumper`
|
||||
* deprecated `PhpGeneratorDumper` and `PhpMatcherDumper`
|
||||
* deprecated `generator_base_class`, `generator_cache_class`, `matcher_base_class` and `matcher_cache_class` router options
|
||||
* deprecated implementing `Serializable` for `Route` and `CompiledRoute`; if you serialize them, please
|
||||
ensure your unserialization logic can recover from a failure related to an updated serialization format
|
||||
* exposed `utf8` Route option, defaults "locale" and "format" in configuration loaders and configurators
|
||||
* added support for invokable route loader services
|
||||
|
||||
4.2.0
|
||||
-----
|
||||
|
||||
|
||||
26
vendor/symfony/routing/CompiledRoute.php
vendored
26
vendor/symfony/routing/CompiledRoute.php
vendored
@@ -49,12 +49,9 @@ class CompiledRoute implements \Serializable
|
||||
$this->variables = $variables;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function serialize()
|
||||
public function __serialize(): array
|
||||
{
|
||||
return serialize([
|
||||
return [
|
||||
'vars' => $this->variables,
|
||||
'path_prefix' => $this->staticPrefix,
|
||||
'path_regex' => $this->regex,
|
||||
@@ -63,16 +60,19 @@ class CompiledRoute implements \Serializable
|
||||
'host_regex' => $this->hostRegex,
|
||||
'host_tokens' => $this->hostTokens,
|
||||
'host_vars' => $this->hostVariables,
|
||||
]);
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @internal since Symfony 4.3, will be removed in Symfony 5 as the class won't implement Serializable anymore
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
public function serialize()
|
||||
{
|
||||
$data = unserialize($serialized, ['allowed_classes' => false]);
|
||||
return serialize($this->__serialize());
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
$this->variables = $data['vars'];
|
||||
$this->staticPrefix = $data['path_prefix'];
|
||||
$this->regex = $data['path_regex'];
|
||||
@@ -83,6 +83,14 @@ class CompiledRoute implements \Serializable
|
||||
$this->hostVariables = $data['host_vars'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal since Symfony 4.3, will be removed in Symfony 5 as the class won't implement Serializable anymore
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
{
|
||||
$this->__unserialize(unserialize($serialized, ['allowed_classes' => false]));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the static prefix.
|
||||
*
|
||||
|
||||
58
vendor/symfony/routing/Generator/CompiledUrlGenerator.php
vendored
Normal file
58
vendor/symfony/routing/Generator/CompiledUrlGenerator.php
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Generator;
|
||||
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Component\Routing\Exception\RouteNotFoundException;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
* Generates URLs based on rules dumped by CompiledUrlGeneratorDumper.
|
||||
*/
|
||||
class CompiledUrlGenerator extends UrlGenerator
|
||||
{
|
||||
private $compiledRoutes = [];
|
||||
private $defaultLocale;
|
||||
|
||||
public function __construct(array $compiledRoutes, RequestContext $context, LoggerInterface $logger = null, string $defaultLocale = null)
|
||||
{
|
||||
$this->compiledRoutes = $compiledRoutes;
|
||||
$this->context = $context;
|
||||
$this->logger = $logger;
|
||||
$this->defaultLocale = $defaultLocale;
|
||||
}
|
||||
|
||||
public function generate($name, $parameters = [], $referenceType = self::ABSOLUTE_PATH)
|
||||
{
|
||||
$locale = $parameters['_locale']
|
||||
?? $this->context->getParameter('_locale')
|
||||
?: $this->defaultLocale;
|
||||
|
||||
if (null !== $locale) {
|
||||
do {
|
||||
if (($this->compiledRoutes[$name.'.'.$locale][1]['_canonical_route'] ?? null) === $name) {
|
||||
unset($parameters['_locale']);
|
||||
$name .= '.'.$locale;
|
||||
break;
|
||||
}
|
||||
} while (false !== $locale = strstr($locale, '_', true));
|
||||
}
|
||||
|
||||
if (!isset($this->compiledRoutes[$name])) {
|
||||
throw new RouteNotFoundException(sprintf('Unable to generate a URL for the named route "%s" as such route does not exist.', $name));
|
||||
}
|
||||
|
||||
list($variables, $defaults, $requirements, $tokens, $hostTokens, $requiredSchemes) = $this->compiledRoutes[$name];
|
||||
|
||||
return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ namespace Symfony\Component\Routing\Generator;
|
||||
* The possible configurations and use-cases:
|
||||
* - setStrictRequirements(true): Throw an exception for mismatching requirements. This
|
||||
* is mostly useful in development environment.
|
||||
* - setStrictRequirements(false): Don't throw an exception but return null as URL for
|
||||
* - setStrictRequirements(false): Don't throw an exception but return an empty string as URL for
|
||||
* mismatching requirements and log the problem. Useful when you cannot control all
|
||||
* params because they come from third party libs but don't want to have a 404 in
|
||||
* production environment. It should log the mismatch so one can review it.
|
||||
|
||||
73
vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php
vendored
Normal file
73
vendor/symfony/routing/Generator/Dumper/CompiledUrlGeneratorDumper.php
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Generator\Dumper;
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||||
|
||||
/**
|
||||
* CompiledUrlGeneratorDumper creates a PHP array to be used with CompiledUrlGenerator.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Tobias Schultze <http://tobion.de>
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
class CompiledUrlGeneratorDumper extends GeneratorDumper
|
||||
{
|
||||
public function getCompiledRoutes(): array
|
||||
{
|
||||
$compiledRoutes = [];
|
||||
foreach ($this->getRoutes()->all() as $name => $route) {
|
||||
$compiledRoute = $route->compile();
|
||||
|
||||
$compiledRoutes[$name] = [
|
||||
$compiledRoute->getVariables(),
|
||||
$route->getDefaults(),
|
||||
$route->getRequirements(),
|
||||
$compiledRoute->getTokens(),
|
||||
$compiledRoute->getHostTokens(),
|
||||
$route->getSchemes(),
|
||||
];
|
||||
}
|
||||
|
||||
return $compiledRoutes;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function dump(array $options = [])
|
||||
{
|
||||
return <<<EOF
|
||||
<?php
|
||||
|
||||
// This file has been auto-generated by the Symfony Routing Component.
|
||||
|
||||
return [{$this->generateDeclaredRoutes()}
|
||||
];
|
||||
|
||||
EOF;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates PHP code representing an array of defined routes
|
||||
* together with the routes properties (e.g. requirements).
|
||||
*/
|
||||
private function generateDeclaredRoutes(): string
|
||||
{
|
||||
$routes = '';
|
||||
foreach ($this->getCompiledRoutes() as $name => $properties) {
|
||||
$routes .= sprintf("\n '%s' => %s,", $name, CompiledUrlMatcherDumper::export($properties));
|
||||
}
|
||||
|
||||
return $routes;
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,17 @@
|
||||
|
||||
namespace Symfony\Component\Routing\Generator\Dumper;
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
|
||||
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.3, use "CompiledUrlGeneratorDumper" instead.', PhpGeneratorDumper::class), E_USER_DEPRECATED);
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||||
|
||||
/**
|
||||
* PhpGeneratorDumper creates a PHP class able to generate URLs for a given set of routes.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Tobias Schultze <http://tobion.de>
|
||||
*
|
||||
* @deprecated since Symfony 4.3, use CompiledUrlGeneratorDumper instead.
|
||||
*/
|
||||
class PhpGeneratorDumper extends GeneratorDumper
|
||||
{
|
||||
@@ -92,7 +96,7 @@ EOF;
|
||||
$properties[] = $compiledRoute->getHostTokens();
|
||||
$properties[] = $route->getSchemes();
|
||||
|
||||
$routes .= sprintf(" '%s' => %s,\n", $name, PhpMatcherDumper::export($properties));
|
||||
$routes .= sprintf(" '%s' => %s,\n", $name, CompiledUrlMatcherDumper::export($properties));
|
||||
}
|
||||
$routes .= ' ]';
|
||||
|
||||
|
||||
@@ -27,6 +27,20 @@ use Symfony\Component\Routing\RouteCollection;
|
||||
*/
|
||||
class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInterface
|
||||
{
|
||||
private const QUERY_FRAGMENT_DECODED = [
|
||||
// RFC 3986 explicitly allows those in the query/fragment to reference other URIs unencoded
|
||||
'%2F' => '/',
|
||||
'%3F' => '?',
|
||||
// reserved chars that have no special meaning for HTTP URIs in a query or fragment
|
||||
// this excludes esp. "&", "=" and also "+" because PHP would treat it as a space (form-encoded)
|
||||
'%40' => '@',
|
||||
'%3A' => ':',
|
||||
'%21' => '!',
|
||||
'%3B' => ';',
|
||||
'%2C' => ',',
|
||||
'%2A' => '*',
|
||||
];
|
||||
|
||||
protected $routes;
|
||||
protected $context;
|
||||
|
||||
@@ -156,21 +170,25 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
|
||||
$message = 'Parameter "{parameter}" for route "{route}" must match "{expected}" ("{given}" given) to generate a corresponding URL.';
|
||||
foreach ($tokens as $token) {
|
||||
if ('variable' === $token[0]) {
|
||||
if (!$optional || !\array_key_exists($token[3], $defaults) || null !== $mergedParams[$token[3]] && (string) $mergedParams[$token[3]] !== (string) $defaults[$token[3]]) {
|
||||
$varName = $token[3];
|
||||
// variable is not important by default
|
||||
$important = $token[5] ?? false;
|
||||
|
||||
if (!$optional || $important || !\array_key_exists($varName, $defaults) || (null !== $mergedParams[$varName] && (string) $mergedParams[$varName] !== (string) $defaults[$varName])) {
|
||||
// check requirement (while ignoring look-around patterns)
|
||||
if (null !== $this->strictRequirements && !preg_match('#^'.preg_replace('/\(\?(?:=|<=|!|<!)((?:[^()\\\\]+|\\\\.|\((?1)\))*)\)/', '', $token[2]).'$#'.(empty($token[4]) ? '' : 'u'), $mergedParams[$token[3]])) {
|
||||
if (null !== $this->strictRequirements && !preg_match('#^'.preg_replace('/\(\?(?:=|<=|!|<!)((?:[^()\\\\]+|\\\\.|\((?1)\))*)\)/', '', $token[2]).'$#i'.(empty($token[4]) ? '' : 'u'), $mergedParams[$token[3]])) {
|
||||
if ($this->strictRequirements) {
|
||||
throw new InvalidParameterException(strtr($message, ['{parameter}' => $token[3], '{route}' => $name, '{expected}' => $token[2], '{given}' => $mergedParams[$token[3]]]));
|
||||
throw new InvalidParameterException(strtr($message, ['{parameter}' => $varName, '{route}' => $name, '{expected}' => $token[2], '{given}' => $mergedParams[$varName]]));
|
||||
}
|
||||
|
||||
if ($this->logger) {
|
||||
$this->logger->error($message, ['parameter' => $token[3], 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$token[3]]]);
|
||||
$this->logger->error($message, ['parameter' => $varName, 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$varName]]);
|
||||
}
|
||||
|
||||
return;
|
||||
return '';
|
||||
}
|
||||
|
||||
$url = $token[1].$mergedParams[$token[3]].$url;
|
||||
$url = $token[1].$mergedParams[$varName].$url;
|
||||
$optional = false;
|
||||
}
|
||||
} else {
|
||||
@@ -222,7 +240,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
|
||||
$this->logger->error($message, ['parameter' => $token[3], 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$token[3]]]);
|
||||
}
|
||||
|
||||
return;
|
||||
return '';
|
||||
}
|
||||
|
||||
$routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
|
||||
@@ -271,13 +289,11 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
|
||||
}
|
||||
|
||||
if ($extra && $query = http_build_query($extra, '', '&', PHP_QUERY_RFC3986)) {
|
||||
// "/" and "?" can be left decoded for better user experience, see
|
||||
// http://tools.ietf.org/html/rfc3986#section-3.4
|
||||
$url .= '?'.strtr($query, ['%2F' => '/']);
|
||||
$url .= '?'.strtr($query, self::QUERY_FRAGMENT_DECODED);
|
||||
}
|
||||
|
||||
if ('' !== $fragment) {
|
||||
$url .= '#'.strtr(rawurlencode($fragment), ['%2F' => '/', '%3F' => '?']);
|
||||
$url .= '#'.strtr(rawurlencode($fragment), self::QUERY_FRAGMENT_DECODED);
|
||||
}
|
||||
|
||||
return $url;
|
||||
|
||||
@@ -248,7 +248,8 @@ abstract class AnnotationClassLoader implements LoaderInterface
|
||||
*/
|
||||
protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method)
|
||||
{
|
||||
$name = strtolower(str_replace('\\', '_', $class->name).'_'.$method->name);
|
||||
$name = str_replace('\\', '_', $class->name).'_'.$method->name;
|
||||
$name = \function_exists('mb_strtolower') && preg_match('//u', $name) ? mb_strtolower($name, 'UTF-8') : strtolower($name);
|
||||
if ($this->defaultRouteIndex > 0) {
|
||||
$name .= '_'.$this->defaultRouteIndex;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,6 @@ class AnnotationFileLoader extends FileLoader
|
||||
$collection->addCollection($this->loader->load($class, $type));
|
||||
}
|
||||
|
||||
// PHP 7 memory manager will not release after token_get_all(), see https://bugs.php.net/70098
|
||||
gc_mem_caches();
|
||||
|
||||
return $collection;
|
||||
|
||||
@@ -57,6 +57,18 @@ trait RouteTrait
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether paths should accept utf8 encoding.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
final public function utf8(bool $utf8 = true)
|
||||
{
|
||||
$this->route->addOptions(['utf8' => $utf8]);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the condition.
|
||||
*
|
||||
@@ -124,4 +136,28 @@ trait RouteTrait
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the "_locale" entry to defaults.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
final public function locale(string $locale)
|
||||
{
|
||||
$this->route->addDefaults(['_locale' => $locale]);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the "_format" entry to defaults.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
final public function format(string $format)
|
||||
{
|
||||
$this->route->addDefaults(['_format' => $format]);
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,25 +37,25 @@ abstract class ObjectRouteLoader extends Loader
|
||||
/**
|
||||
* Calls the service that will load the routes.
|
||||
*
|
||||
* @param mixed $resource Some value that will resolve to a callable
|
||||
* @param string $resource Some value that will resolve to a callable
|
||||
* @param string|null $type The resource type
|
||||
*
|
||||
* @return RouteCollection
|
||||
*/
|
||||
public function load($resource, $type = null)
|
||||
{
|
||||
if (!preg_match('/^[^\:]+(?:::?(?:[^\:]+))?$/', $resource)) {
|
||||
throw new \InvalidArgumentException(sprintf('Invalid resource "%s" passed to the "service" route loader: use the format "service::method" or "service" if your service has an "__invoke" method.', $resource));
|
||||
}
|
||||
|
||||
if (1 === substr_count($resource, ':')) {
|
||||
$resource = str_replace(':', '::', $resource);
|
||||
@trigger_error(sprintf('Referencing service route loaders with a single colon is deprecated since Symfony 4.1. Use %s instead.', $resource), E_USER_DEPRECATED);
|
||||
}
|
||||
|
||||
$parts = explode('::', $resource);
|
||||
if (2 != \count($parts)) {
|
||||
throw new \InvalidArgumentException(sprintf('Invalid resource "%s" passed to the "service" route loader: use the format "service::method"', $resource));
|
||||
}
|
||||
|
||||
$serviceString = $parts[0];
|
||||
$method = $parts[1];
|
||||
$method = $parts[1] ?? '__invoke';
|
||||
|
||||
$loaderObject = $this->getServiceObject($serviceString);
|
||||
|
||||
|
||||
10
vendor/symfony/routing/Loader/XmlFileLoader.php
vendored
10
vendor/symfony/routing/Loader/XmlFileLoader.php
vendored
@@ -168,6 +168,7 @@ class XmlFileLoader extends FileLoader
|
||||
|
||||
$this->setCurrentDir(\dirname($path));
|
||||
|
||||
/** @var RouteCollection[] $imported */
|
||||
$imported = $this->import($resource, ('' !== $type ? $type : null), false, $file);
|
||||
|
||||
if (!\is_array($imported)) {
|
||||
@@ -312,6 +313,15 @@ class XmlFileLoader extends FileLoader
|
||||
|
||||
$defaults['_controller'] = $controller;
|
||||
}
|
||||
if ($node->hasAttribute('locale')) {
|
||||
$defaults['_locale'] = $node->getAttribute('locale');
|
||||
}
|
||||
if ($node->hasAttribute('format')) {
|
||||
$defaults['_format'] = $node->getAttribute('format');
|
||||
}
|
||||
if ($node->hasAttribute('utf8')) {
|
||||
$options['utf8'] = XmlUtils::phpize($node->getAttribute('utf8'));
|
||||
}
|
||||
|
||||
return [$defaults, $requirements, $options, $condition, $paths, $prefixes];
|
||||
}
|
||||
|
||||
20
vendor/symfony/routing/Loader/YamlFileLoader.php
vendored
20
vendor/symfony/routing/Loader/YamlFileLoader.php
vendored
@@ -28,7 +28,7 @@ use Symfony\Component\Yaml\Yaml;
|
||||
class YamlFileLoader extends FileLoader
|
||||
{
|
||||
private static $availableKeys = [
|
||||
'resource', 'type', 'prefix', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition', 'controller', 'name_prefix', 'trailing_slash_on_root',
|
||||
'resource', 'type', 'prefix', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition', 'controller', 'name_prefix', 'trailing_slash_on_root', 'locale', 'format', 'utf8',
|
||||
];
|
||||
private $yamlParser;
|
||||
|
||||
@@ -125,6 +125,15 @@ class YamlFileLoader extends FileLoader
|
||||
if (isset($config['controller'])) {
|
||||
$defaults['_controller'] = $config['controller'];
|
||||
}
|
||||
if (isset($config['locale'])) {
|
||||
$defaults['_locale'] = $config['locale'];
|
||||
}
|
||||
if (isset($config['format'])) {
|
||||
$defaults['_format'] = $config['format'];
|
||||
}
|
||||
if (isset($config['utf8'])) {
|
||||
$options['utf8'] = $config['utf8'];
|
||||
}
|
||||
|
||||
if (\is_array($config['path'])) {
|
||||
$route = new Route('', $defaults, $requirements, $options, $host, $schemes, $methods, $condition);
|
||||
@@ -166,6 +175,15 @@ class YamlFileLoader extends FileLoader
|
||||
if (isset($config['controller'])) {
|
||||
$defaults['_controller'] = $config['controller'];
|
||||
}
|
||||
if (isset($config['locale'])) {
|
||||
$defaults['_locale'] = $config['locale'];
|
||||
}
|
||||
if (isset($config['format'])) {
|
||||
$defaults['_format'] = $config['format'];
|
||||
}
|
||||
if (isset($config['utf8'])) {
|
||||
$options['utf8'] = $config['utf8'];
|
||||
}
|
||||
|
||||
$this->setCurrentDir(\dirname($path));
|
||||
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
<xsd:attribute name="schemes" type="xsd:string" />
|
||||
<xsd:attribute name="methods" type="xsd:string" />
|
||||
<xsd:attribute name="controller" type="xsd:string" />
|
||||
<xsd:attribute name="locale" type="xsd:string" />
|
||||
<xsd:attribute name="format" type="xsd:string" />
|
||||
<xsd:attribute name="utf8" type="xsd:boolean" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="import">
|
||||
@@ -67,7 +70,10 @@
|
||||
<xsd:attribute name="schemes" type="xsd:string" />
|
||||
<xsd:attribute name="methods" type="xsd:string" />
|
||||
<xsd:attribute name="controller" type="xsd:string" />
|
||||
<xsd:attribute name="locale" type="xsd:string" />
|
||||
<xsd:attribute name="format" type="xsd:string" />
|
||||
<xsd:attribute name="trailing-slash-on-root" type="xsd:boolean" />
|
||||
<xsd:attribute name="utf8" type="xsd:boolean" />
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="default" mixed="true">
|
||||
|
||||
31
vendor/symfony/routing/Matcher/CompiledUrlMatcher.php
vendored
Normal file
31
vendor/symfony/routing/Matcher/CompiledUrlMatcher.php
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Matcher;
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
* Matches URLs based on rules dumped by CompiledUrlMatcherDumper.
|
||||
*
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
class CompiledUrlMatcher extends UrlMatcher
|
||||
{
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(array $compiledRoutes, RequestContext $context)
|
||||
{
|
||||
$this->context = $context;
|
||||
list($this->matchHost, $this->staticRoutes, $this->regexpList, $this->dynamicRoutes, $this->checkCondition) = $compiledRoutes;
|
||||
}
|
||||
}
|
||||
501
vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php
vendored
Normal file
501
vendor/symfony/routing/Matcher/Dumper/CompiledUrlMatcherDumper.php
vendored
Normal file
@@ -0,0 +1,501 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Matcher\Dumper;
|
||||
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
/**
|
||||
* CompiledUrlMatcherDumper creates PHP arrays to be used with CompiledUrlMatcher.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Tobias Schultze <http://tobion.de>
|
||||
* @author Arnaud Le Blanc <arnaud.lb@gmail.com>
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*/
|
||||
class CompiledUrlMatcherDumper extends MatcherDumper
|
||||
{
|
||||
private $expressionLanguage;
|
||||
private $signalingException;
|
||||
|
||||
/**
|
||||
* @var ExpressionFunctionProviderInterface[]
|
||||
*/
|
||||
private $expressionLanguageProviders = [];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function dump(array $options = [])
|
||||
{
|
||||
return <<<EOF
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
{$this->generateCompiledRoutes()}];
|
||||
|
||||
EOF;
|
||||
}
|
||||
|
||||
public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
|
||||
{
|
||||
$this->expressionLanguageProviders[] = $provider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the arrays for CompiledUrlMatcher's constructor.
|
||||
*/
|
||||
public function getCompiledRoutes(bool $forDump = false): array
|
||||
{
|
||||
// Group hosts by same-suffix, re-order when possible
|
||||
$matchHost = false;
|
||||
$routes = new StaticPrefixCollection();
|
||||
foreach ($this->getRoutes()->all() as $name => $route) {
|
||||
if ($host = $route->getHost()) {
|
||||
$matchHost = true;
|
||||
$host = '/'.strtr(strrev($host), '}.{', '(/)');
|
||||
}
|
||||
|
||||
$routes->addRoute($host ?: '/(.*)', [$name, $route]);
|
||||
}
|
||||
|
||||
if ($matchHost) {
|
||||
$compiledRoutes = [true];
|
||||
$routes = $routes->populateCollection(new RouteCollection());
|
||||
} else {
|
||||
$compiledRoutes = [false];
|
||||
$routes = $this->getRoutes();
|
||||
}
|
||||
|
||||
list($staticRoutes, $dynamicRoutes) = $this->groupStaticRoutes($routes);
|
||||
|
||||
$conditions = [null];
|
||||
$compiledRoutes[] = $this->compileStaticRoutes($staticRoutes, $conditions);
|
||||
$chunkLimit = \count($dynamicRoutes);
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
$this->signalingException = new \RuntimeException('preg_match(): Compilation failed: regular expression is too large');
|
||||
$compiledRoutes = array_merge($compiledRoutes, $this->compileDynamicRoutes($dynamicRoutes, $matchHost, $chunkLimit, $conditions));
|
||||
|
||||
break;
|
||||
} catch (\Exception $e) {
|
||||
if (1 < $chunkLimit && $this->signalingException === $e) {
|
||||
$chunkLimit = 1 + ($chunkLimit >> 1);
|
||||
continue;
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
if ($forDump) {
|
||||
$compiledRoutes[2] = $compiledRoutes[4];
|
||||
}
|
||||
unset($conditions[0]);
|
||||
|
||||
if ($conditions) {
|
||||
foreach ($conditions as $expression => $condition) {
|
||||
$conditions[$expression] = "case {$condition}: return {$expression};";
|
||||
}
|
||||
|
||||
$checkConditionCode = <<<EOF
|
||||
static function (\$condition, \$context, \$request) { // \$checkCondition
|
||||
switch (\$condition) {
|
||||
{$this->indent(implode("\n", $conditions), 3)}
|
||||
}
|
||||
}
|
||||
EOF;
|
||||
$compiledRoutes[4] = $forDump ? $checkConditionCode .= ",\n" : eval('return '.$checkConditionCode.';');
|
||||
} else {
|
||||
$compiledRoutes[4] = $forDump ? " null, // \$checkCondition\n" : null;
|
||||
}
|
||||
|
||||
return $compiledRoutes;
|
||||
}
|
||||
|
||||
private function generateCompiledRoutes(): string
|
||||
{
|
||||
list($matchHost, $staticRoutes, $regexpCode, $dynamicRoutes, $checkConditionCode) = $this->getCompiledRoutes(true);
|
||||
|
||||
$code = self::export($matchHost).', // $matchHost'."\n";
|
||||
|
||||
$code .= '[ // $staticRoutes'."\n";
|
||||
foreach ($staticRoutes as $path => $routes) {
|
||||
$code .= sprintf(" %s => [\n", self::export($path));
|
||||
foreach ($routes as $route) {
|
||||
$code .= sprintf(" [%s, %s, %s, %s, %s, %s, %s],\n", ...array_map([__CLASS__, 'export'], $route));
|
||||
}
|
||||
$code .= " ],\n";
|
||||
}
|
||||
$code .= "],\n";
|
||||
|
||||
$code .= sprintf("[ // \$regexpList%s\n],\n", $regexpCode);
|
||||
|
||||
$code .= '[ // $dynamicRoutes'."\n";
|
||||
foreach ($dynamicRoutes as $path => $routes) {
|
||||
$code .= sprintf(" %s => [\n", self::export($path));
|
||||
foreach ($routes as $route) {
|
||||
$code .= sprintf(" [%s, %s, %s, %s, %s, %s, %s],\n", ...array_map([__CLASS__, 'export'], $route));
|
||||
}
|
||||
$code .= " ],\n";
|
||||
}
|
||||
$code .= "],\n";
|
||||
$code = preg_replace('/ => \[\n (\[.+?),\n \],/', ' => [$1],', $code);
|
||||
|
||||
return $this->indent($code, 1).$checkConditionCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits static routes from dynamic routes, so that they can be matched first, using a simple switch.
|
||||
*/
|
||||
private function groupStaticRoutes(RouteCollection $collection): array
|
||||
{
|
||||
$staticRoutes = $dynamicRegex = [];
|
||||
$dynamicRoutes = new RouteCollection();
|
||||
|
||||
foreach ($collection->all() as $name => $route) {
|
||||
$compiledRoute = $route->compile();
|
||||
$staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/');
|
||||
$hostRegex = $compiledRoute->getHostRegex();
|
||||
$regex = $compiledRoute->getRegex();
|
||||
if ($hasTrailingSlash = '/' !== $route->getPath()) {
|
||||
$pos = strrpos($regex, '$');
|
||||
$hasTrailingSlash = '/' === $regex[$pos - 1];
|
||||
$regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash);
|
||||
}
|
||||
|
||||
if (!$compiledRoute->getPathVariables()) {
|
||||
$host = !$compiledRoute->getHostVariables() ? $route->getHost() : '';
|
||||
$url = $route->getPath();
|
||||
if ($hasTrailingSlash) {
|
||||
$url = substr($url, 0, -1);
|
||||
}
|
||||
foreach ($dynamicRegex as list($hostRx, $rx, $prefix)) {
|
||||
if (('' === $prefix || 0 === strpos($url, $prefix)) && preg_match($rx, $url) && (!$host || !$hostRx || preg_match($hostRx, $host))) {
|
||||
$dynamicRegex[] = [$hostRegex, $regex, $staticPrefix];
|
||||
$dynamicRoutes->add($name, $route);
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
$staticRoutes[$url][$name] = [$route, $hasTrailingSlash];
|
||||
} else {
|
||||
$dynamicRegex[] = [$hostRegex, $regex, $staticPrefix];
|
||||
$dynamicRoutes->add($name, $route);
|
||||
}
|
||||
}
|
||||
|
||||
return [$staticRoutes, $dynamicRoutes];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles static routes in a switch statement.
|
||||
*
|
||||
* Condition-less paths are put in a static array in the switch's default, with generic matching logic.
|
||||
* Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases.
|
||||
*
|
||||
* @throws \LogicException
|
||||
*/
|
||||
private function compileStaticRoutes(array $staticRoutes, array &$conditions): array
|
||||
{
|
||||
if (!$staticRoutes) {
|
||||
return [];
|
||||
}
|
||||
$compiledRoutes = [];
|
||||
|
||||
foreach ($staticRoutes as $url => $routes) {
|
||||
$compiledRoutes[$url] = [];
|
||||
foreach ($routes as $name => list($route, $hasTrailingSlash)) {
|
||||
$compiledRoutes[$url][] = $this->compileRoute($route, $name, (!$route->compile()->getHostVariables() ? $route->getHost() : $route->compile()->getHostRegex()) ?: null, $hasTrailingSlash, false, $conditions);
|
||||
}
|
||||
}
|
||||
|
||||
return $compiledRoutes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles a regular expression followed by a switch statement to match dynamic routes.
|
||||
*
|
||||
* The regular expression matches both the host and the pathinfo at the same time. For stellar performance,
|
||||
* it is built as a tree of patterns, with re-ordering logic to group same-prefix routes together when possible.
|
||||
*
|
||||
* Patterns are named so that we know which one matched (https://pcre.org/current/doc/html/pcre2syntax.html#SEC23).
|
||||
* This name is used to "switch" to the additional logic required to match the final route.
|
||||
*
|
||||
* Condition-less paths are put in a static array in the switch's default, with generic matching logic.
|
||||
* Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases.
|
||||
*
|
||||
* Last but not least:
|
||||
* - Because it is not possibe to mix unicode/non-unicode patterns in a single regexp, several of them can be generated.
|
||||
* - The same regexp can be used several times when the logic in the switch rejects the match. When this happens, the
|
||||
* matching-but-failing subpattern is blacklisted by replacing its name by "(*F)", which forces a failure-to-match.
|
||||
* To ease this backlisting operation, the name of subpatterns is also the string offset where the replacement should occur.
|
||||
*/
|
||||
private function compileDynamicRoutes(RouteCollection $collection, bool $matchHost, int $chunkLimit, array &$conditions): array
|
||||
{
|
||||
if (!$collection->all()) {
|
||||
return [[], [], ''];
|
||||
}
|
||||
$regexpList = [];
|
||||
$code = '';
|
||||
$state = (object) [
|
||||
'regexMark' => 0,
|
||||
'regex' => [],
|
||||
'routes' => [],
|
||||
'mark' => 0,
|
||||
'markTail' => 0,
|
||||
'hostVars' => [],
|
||||
'vars' => [],
|
||||
];
|
||||
$state->getVars = static function ($m) use ($state) {
|
||||
if ('_route' === $m[1]) {
|
||||
return '?:';
|
||||
}
|
||||
|
||||
$state->vars[] = $m[1];
|
||||
|
||||
return '';
|
||||
};
|
||||
|
||||
$chunkSize = 0;
|
||||
$prev = null;
|
||||
$perModifiers = [];
|
||||
foreach ($collection->all() as $name => $route) {
|
||||
preg_match('#[a-zA-Z]*$#', $route->compile()->getRegex(), $rx);
|
||||
if ($chunkLimit < ++$chunkSize || $prev !== $rx[0] && $route->compile()->getPathVariables()) {
|
||||
$chunkSize = 1;
|
||||
$routes = new RouteCollection();
|
||||
$perModifiers[] = [$rx[0], $routes];
|
||||
$prev = $rx[0];
|
||||
}
|
||||
$routes->add($name, $route);
|
||||
}
|
||||
|
||||
foreach ($perModifiers as list($modifiers, $routes)) {
|
||||
$prev = false;
|
||||
$perHost = [];
|
||||
foreach ($routes->all() as $name => $route) {
|
||||
$regex = $route->compile()->getHostRegex();
|
||||
if ($prev !== $regex) {
|
||||
$routes = new RouteCollection();
|
||||
$perHost[] = [$regex, $routes];
|
||||
$prev = $regex;
|
||||
}
|
||||
$routes->add($name, $route);
|
||||
}
|
||||
$prev = false;
|
||||
$rx = '{^(?';
|
||||
$code .= "\n {$state->mark} => ".self::export($rx);
|
||||
$startingMark = $state->mark;
|
||||
$state->mark += \strlen($rx);
|
||||
$state->regex = $rx;
|
||||
|
||||
foreach ($perHost as list($hostRegex, $routes)) {
|
||||
if ($matchHost) {
|
||||
if ($hostRegex) {
|
||||
preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $hostRegex, $rx);
|
||||
$state->vars = [];
|
||||
$hostRegex = '(?i:'.preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]).')\.';
|
||||
$state->hostVars = $state->vars;
|
||||
} else {
|
||||
$hostRegex = '(?:(?:[^./]*+\.)++)';
|
||||
$state->hostVars = [];
|
||||
}
|
||||
$state->mark += \strlen($rx = ($prev ? ')' : '')."|{$hostRegex}(?");
|
||||
$code .= "\n .".self::export($rx);
|
||||
$state->regex .= $rx;
|
||||
$prev = true;
|
||||
}
|
||||
|
||||
$tree = new StaticPrefixCollection();
|
||||
foreach ($routes->all() as $name => $route) {
|
||||
preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $route->compile()->getRegex(), $rx);
|
||||
|
||||
$state->vars = [];
|
||||
$regex = preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]);
|
||||
if ($hasTrailingSlash = '/' !== $regex && '/' === $regex[-1]) {
|
||||
$regex = substr($regex, 0, -1);
|
||||
}
|
||||
$hasTrailingVar = (bool) preg_match('#\{\w+\}/?$#', $route->getPath());
|
||||
|
||||
$tree->addRoute($regex, [$name, $regex, $state->vars, $route, $hasTrailingSlash, $hasTrailingVar]);
|
||||
}
|
||||
|
||||
$code .= $this->compileStaticPrefixCollection($tree, $state, 0, $conditions);
|
||||
}
|
||||
if ($matchHost) {
|
||||
$code .= "\n .')'";
|
||||
$state->regex .= ')';
|
||||
}
|
||||
$rx = ")/?$}{$modifiers}";
|
||||
$code .= "\n .'{$rx}',";
|
||||
$state->regex .= $rx;
|
||||
$state->markTail = 0;
|
||||
|
||||
// if the regex is too large, throw a signaling exception to recompute with smaller chunk size
|
||||
set_error_handler(function ($type, $message) { throw 0 === strpos($message, $this->signalingException->getMessage()) ? $this->signalingException : new \ErrorException($message); });
|
||||
try {
|
||||
preg_match($state->regex, '');
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
$regexpList[$startingMark] = $state->regex;
|
||||
}
|
||||
|
||||
$state->routes[$state->mark][] = [null, null, null, null, false, false, 0];
|
||||
unset($state->getVars);
|
||||
|
||||
return [$regexpList, $state->routes, $code];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles a regexp tree of subpatterns that matches nested same-prefix routes.
|
||||
*
|
||||
* @param \stdClass $state A simple state object that keeps track of the progress of the compilation,
|
||||
* and gathers the generated switch's "case" and "default" statements
|
||||
*/
|
||||
private function compileStaticPrefixCollection(StaticPrefixCollection $tree, \stdClass $state, int $prefixLen, array &$conditions): string
|
||||
{
|
||||
$code = '';
|
||||
$prevRegex = null;
|
||||
$routes = $tree->getRoutes();
|
||||
|
||||
foreach ($routes as $i => $route) {
|
||||
if ($route instanceof StaticPrefixCollection) {
|
||||
$prevRegex = null;
|
||||
$prefix = substr($route->getPrefix(), $prefixLen);
|
||||
$state->mark += \strlen($rx = "|{$prefix}(?");
|
||||
$code .= "\n .".self::export($rx);
|
||||
$state->regex .= $rx;
|
||||
$code .= $this->indent($this->compileStaticPrefixCollection($route, $state, $prefixLen + \strlen($prefix), $conditions));
|
||||
$code .= "\n .')'";
|
||||
$state->regex .= ')';
|
||||
++$state->markTail;
|
||||
continue;
|
||||
}
|
||||
|
||||
list($name, $regex, $vars, $route, $hasTrailingSlash, $hasTrailingVar) = $route;
|
||||
$compiledRoute = $route->compile();
|
||||
$vars = array_merge($state->hostVars, $vars);
|
||||
|
||||
if ($compiledRoute->getRegex() === $prevRegex) {
|
||||
$state->routes[$state->mark][] = $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions);
|
||||
continue;
|
||||
}
|
||||
|
||||
$state->mark += 3 + $state->markTail + \strlen($regex) - $prefixLen;
|
||||
$state->markTail = 2 + \strlen($state->mark);
|
||||
$rx = sprintf('|%s(*:%s)', substr($regex, $prefixLen), $state->mark);
|
||||
$code .= "\n .".self::export($rx);
|
||||
$state->regex .= $rx;
|
||||
|
||||
$prevRegex = $compiledRoute->getRegex();
|
||||
$state->routes[$state->mark] = [$this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions)];
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles a single Route to PHP code used to match it against the path info.
|
||||
*/
|
||||
private function compileRoute(Route $route, string $name, $vars, bool $hasTrailingSlash, bool $hasTrailingVar, array &$conditions): array
|
||||
{
|
||||
$defaults = $route->getDefaults();
|
||||
|
||||
if (isset($defaults['_canonical_route'])) {
|
||||
$name = $defaults['_canonical_route'];
|
||||
unset($defaults['_canonical_route']);
|
||||
}
|
||||
|
||||
if ($condition = $route->getCondition()) {
|
||||
$condition = $this->getExpressionLanguage()->compile($condition, ['context', 'request']);
|
||||
$condition = $conditions[$condition] ?? $conditions[$condition] = (false !== strpos($condition, '$request') ? 1 : -1) * \count($conditions);
|
||||
} else {
|
||||
$condition = null;
|
||||
}
|
||||
|
||||
return [
|
||||
['_route' => $name] + $defaults,
|
||||
$vars,
|
||||
array_flip($route->getMethods()) ?: null,
|
||||
array_flip($route->getSchemes()) ?: null,
|
||||
$hasTrailingSlash,
|
||||
$hasTrailingVar,
|
||||
$condition,
|
||||
];
|
||||
}
|
||||
|
||||
private function getExpressionLanguage()
|
||||
{
|
||||
if (null === $this->expressionLanguage) {
|
||||
if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
|
||||
throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
|
||||
}
|
||||
$this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders);
|
||||
}
|
||||
|
||||
return $this->expressionLanguage;
|
||||
}
|
||||
|
||||
private function indent($code, $level = 1)
|
||||
{
|
||||
return preg_replace('/^./m', str_repeat(' ', $level).'$0', $code);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public static function export($value): string
|
||||
{
|
||||
if (null === $value) {
|
||||
return 'null';
|
||||
}
|
||||
if (!\is_array($value)) {
|
||||
if (\is_object($value)) {
|
||||
throw new \InvalidArgumentException('Symfony\Component\Routing\Route cannot contain objects.');
|
||||
}
|
||||
|
||||
return str_replace("\n", '\'."\n".\'', var_export($value, true));
|
||||
}
|
||||
if (!$value) {
|
||||
return '[]';
|
||||
}
|
||||
|
||||
$i = 0;
|
||||
$export = '[';
|
||||
|
||||
foreach ($value as $k => $v) {
|
||||
if ($i === $k) {
|
||||
++$i;
|
||||
} else {
|
||||
$export .= self::export($k).' => ';
|
||||
|
||||
if (\is_int($k) && $i < $k) {
|
||||
$i = 1 + $k;
|
||||
}
|
||||
}
|
||||
|
||||
$export .= self::export($v).', ';
|
||||
}
|
||||
|
||||
return substr_replace($export, ']', -2);
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*
|
||||
* @property RequestContext $context
|
||||
*/
|
||||
trait PhpMatcherTrait
|
||||
trait CompiledUrlMatcherTrait
|
||||
{
|
||||
private $matchHost = false;
|
||||
private $staticRoutes = [];
|
||||
@@ -42,7 +42,7 @@ trait PhpMatcherTrait
|
||||
throw new MethodNotAllowedException(array_keys($allow));
|
||||
}
|
||||
if (!$this instanceof RedirectableUrlMatcherInterface) {
|
||||
throw new ResourceNotFoundException();
|
||||
throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo));
|
||||
}
|
||||
if (!\in_array($this->context->getMethod(), ['HEAD', 'GET'], true)) {
|
||||
// no-op
|
||||
@@ -67,7 +67,7 @@ trait PhpMatcherTrait
|
||||
}
|
||||
}
|
||||
|
||||
throw new ResourceNotFoundException();
|
||||
throw new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo));
|
||||
}
|
||||
|
||||
private function doMatch(string $pathinfo, array &$allow = [], array &$allowSchemes = []): array
|
||||
@@ -110,10 +110,8 @@ trait PhpMatcherTrait
|
||||
}
|
||||
|
||||
$hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]);
|
||||
if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) {
|
||||
if ($hasRequiredScheme) {
|
||||
$allow += $requiredMethods;
|
||||
}
|
||||
if ($hasRequiredScheme && $requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) {
|
||||
$allow += $requiredMethods;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -130,8 +128,13 @@ trait PhpMatcherTrait
|
||||
foreach ($this->regexpList as $offset => $regex) {
|
||||
while (preg_match($regex, $matchedPathinfo, $matches)) {
|
||||
foreach ($this->dynamicRoutes[$m = (int) $matches['MARK']] as list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar, $condition)) {
|
||||
if ($condition && !($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) {
|
||||
continue;
|
||||
if (null !== $condition) {
|
||||
if (0 === $condition) { // marks the last route in the regexp
|
||||
continue 3;
|
||||
}
|
||||
if (!($this->checkCondition)($condition, $context, 0 < $condition ? $request ?? $request = $this->request ?: $this->createRequest($pathinfo) : null)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar;
|
||||
@@ -157,15 +160,13 @@ trait PhpMatcherTrait
|
||||
}
|
||||
}
|
||||
|
||||
$hasRequiredScheme = !$requiredSchemes || isset($requiredSchemes[$context->getScheme()]);
|
||||
if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) {
|
||||
if ($hasRequiredScheme) {
|
||||
$allow += $requiredMethods;
|
||||
}
|
||||
if ($requiredSchemes && !isset($requiredSchemes[$context->getScheme()])) {
|
||||
$allowSchemes += $requiredSchemes;
|
||||
continue;
|
||||
}
|
||||
if (!$hasRequiredScheme) {
|
||||
$allowSchemes += $requiredSchemes;
|
||||
|
||||
if ($requiredMethods && !isset($requiredMethods[$canonicalMethod]) && !isset($requiredMethods[$requestMethod])) {
|
||||
$allow += $requiredMethods;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -11,10 +11,7 @@
|
||||
|
||||
namespace Symfony\Component\Routing\Matcher\Dumper;
|
||||
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2, use "CompiledUrlMatcherDumper" instead.', PhpMatcherDumper::class), E_USER_DEPRECATED);
|
||||
|
||||
/**
|
||||
* PhpMatcherDumper creates a PHP class able to match URLs for a given set of routes.
|
||||
@@ -23,17 +20,11 @@ use Symfony\Component\Routing\RouteCollection;
|
||||
* @author Tobias Schultze <http://tobion.de>
|
||||
* @author Arnaud Le Blanc <arnaud.lb@gmail.com>
|
||||
* @author Nicolas Grekas <p@tchwork.com>
|
||||
*
|
||||
* @deprecated since Symfony 4.2, use CompiledUrlMatcherDumper instead.
|
||||
*/
|
||||
class PhpMatcherDumper extends MatcherDumper
|
||||
class PhpMatcherDumper extends CompiledUrlMatcherDumper
|
||||
{
|
||||
private $expressionLanguage;
|
||||
private $signalingException;
|
||||
|
||||
/**
|
||||
* @var ExpressionFunctionProviderInterface[]
|
||||
*/
|
||||
private $expressionLanguageProviders = [];
|
||||
|
||||
/**
|
||||
* Dumps a set of routes to a PHP class.
|
||||
*
|
||||
@@ -53,13 +44,17 @@ class PhpMatcherDumper extends MatcherDumper
|
||||
'base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
|
||||
], $options);
|
||||
|
||||
// trailing slash support is only enabled if we know how to redirect the user
|
||||
$interfaces = class_implements($options['base_class']);
|
||||
$code = parent::dump();
|
||||
$code = preg_replace('#\n ([^ ].*?) // \$(\w++)$#m', "\n \$this->$2 = $1", $code);
|
||||
$code = str_replace(",\n $", ";\n $", $code);
|
||||
$code = substr($code, strpos($code, '$this') - 4, -5).";\n";
|
||||
$code = preg_replace('/^ \$this->\w++ = (?:null|false|\[\n \]);\n/m', '', $code);
|
||||
$code = str_replace("\n ", "\n ", "\n".$code);
|
||||
|
||||
return <<<EOF
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -68,425 +63,13 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class {$options['class']} extends {$options['base_class']}
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext \$context)
|
||||
{
|
||||
\$this->context = \$context;
|
||||
{$this->generateProperties()} }
|
||||
\$this->context = \$context;{$code} }
|
||||
}
|
||||
|
||||
EOF;
|
||||
}
|
||||
|
||||
public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
|
||||
{
|
||||
$this->expressionLanguageProviders[] = $provider;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates the code for the match method implementing UrlMatcherInterface.
|
||||
*/
|
||||
private function generateProperties(): string
|
||||
{
|
||||
// Group hosts by same-suffix, re-order when possible
|
||||
$matchHost = false;
|
||||
$routes = new StaticPrefixCollection();
|
||||
foreach ($this->getRoutes()->all() as $name => $route) {
|
||||
if ($host = $route->getHost()) {
|
||||
$matchHost = true;
|
||||
$host = '/'.strtr(strrev($host), '}.{', '(/)');
|
||||
}
|
||||
|
||||
$routes->addRoute($host ?: '/(.*)', [$name, $route]);
|
||||
}
|
||||
|
||||
if ($matchHost) {
|
||||
$code = '$this->matchHost = true;'."\n";
|
||||
$routes = $routes->populateCollection(new RouteCollection());
|
||||
} else {
|
||||
$code = '';
|
||||
$routes = $this->getRoutes();
|
||||
}
|
||||
|
||||
list($staticRoutes, $dynamicRoutes) = $this->groupStaticRoutes($routes);
|
||||
|
||||
$conditions = [null];
|
||||
$code .= $this->compileStaticRoutes($staticRoutes, $conditions);
|
||||
$chunkLimit = \count($dynamicRoutes);
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
$this->signalingException = new \RuntimeException('preg_match(): Compilation failed: regular expression is too large');
|
||||
$code .= $this->compileDynamicRoutes($dynamicRoutes, $matchHost, $chunkLimit, $conditions);
|
||||
break;
|
||||
} catch (\Exception $e) {
|
||||
if (1 < $chunkLimit && $this->signalingException === $e) {
|
||||
$chunkLimit = 1 + ($chunkLimit >> 1);
|
||||
continue;
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
unset($conditions[0]);
|
||||
|
||||
if (!$conditions) {
|
||||
return $this->indent($code, 2);
|
||||
}
|
||||
|
||||
foreach ($conditions as $expression => $condition) {
|
||||
$conditions[$expression] = "case {$condition}: return {$expression};";
|
||||
}
|
||||
|
||||
return $this->indent($code, 2).<<<EOF
|
||||
\$this->checkCondition = static function (\$condition, \$context, \$request) {
|
||||
switch (\$condition) {
|
||||
{$this->indent(implode("\n", $conditions), 4)}
|
||||
}
|
||||
};
|
||||
|
||||
EOF;
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits static routes from dynamic routes, so that they can be matched first, using a simple switch.
|
||||
*/
|
||||
private function groupStaticRoutes(RouteCollection $collection): array
|
||||
{
|
||||
$staticRoutes = $dynamicRegex = [];
|
||||
$dynamicRoutes = new RouteCollection();
|
||||
|
||||
foreach ($collection->all() as $name => $route) {
|
||||
$compiledRoute = $route->compile();
|
||||
$staticPrefix = rtrim($compiledRoute->getStaticPrefix(), '/');
|
||||
$hostRegex = $compiledRoute->getHostRegex();
|
||||
$regex = $compiledRoute->getRegex();
|
||||
if ($hasTrailingSlash = '/' !== $route->getPath()) {
|
||||
$pos = strrpos($regex, '$');
|
||||
$hasTrailingSlash = '/' === $regex[$pos - 1];
|
||||
$regex = substr_replace($regex, '/?$', $pos - $hasTrailingSlash, 1 + $hasTrailingSlash);
|
||||
}
|
||||
|
||||
if (!$compiledRoute->getPathVariables()) {
|
||||
$host = !$compiledRoute->getHostVariables() ? $route->getHost() : '';
|
||||
$url = $route->getPath();
|
||||
if ($hasTrailingSlash) {
|
||||
$url = substr($url, 0, -1);
|
||||
}
|
||||
foreach ($dynamicRegex as list($hostRx, $rx, $prefix)) {
|
||||
if (('' === $prefix || 0 === strpos($url, $prefix)) && preg_match($rx, $url) && (!$host || !$hostRx || preg_match($hostRx, $host))) {
|
||||
$dynamicRegex[] = [$hostRegex, $regex, $staticPrefix];
|
||||
$dynamicRoutes->add($name, $route);
|
||||
continue 2;
|
||||
}
|
||||
}
|
||||
|
||||
$staticRoutes[$url][$name] = [$route, $hasTrailingSlash];
|
||||
} else {
|
||||
$dynamicRegex[] = [$hostRegex, $regex, $staticPrefix];
|
||||
$dynamicRoutes->add($name, $route);
|
||||
}
|
||||
}
|
||||
|
||||
return [$staticRoutes, $dynamicRoutes];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles static routes in a switch statement.
|
||||
*
|
||||
* Condition-less paths are put in a static array in the switch's default, with generic matching logic.
|
||||
* Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases.
|
||||
*
|
||||
* @throws \LogicException
|
||||
*/
|
||||
private function compileStaticRoutes(array $staticRoutes, array &$conditions): string
|
||||
{
|
||||
if (!$staticRoutes) {
|
||||
return '';
|
||||
}
|
||||
$code = '';
|
||||
|
||||
foreach ($staticRoutes as $url => $routes) {
|
||||
$code .= self::export($url)." => [\n";
|
||||
foreach ($routes as $name => list($route, $hasTrailingSlash)) {
|
||||
$code .= $this->compileRoute($route, $name, (!$route->compile()->getHostVariables() ? $route->getHost() : $route->compile()->getHostRegex()) ?: null, $hasTrailingSlash, false, $conditions);
|
||||
}
|
||||
$code .= "],\n";
|
||||
}
|
||||
|
||||
if ($code) {
|
||||
return "\$this->staticRoutes = [\n{$this->indent($code, 1)}];\n";
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles a regular expression followed by a switch statement to match dynamic routes.
|
||||
*
|
||||
* The regular expression matches both the host and the pathinfo at the same time. For stellar performance,
|
||||
* it is built as a tree of patterns, with re-ordering logic to group same-prefix routes together when possible.
|
||||
*
|
||||
* Patterns are named so that we know which one matched (https://pcre.org/current/doc/html/pcre2syntax.html#SEC23).
|
||||
* This name is used to "switch" to the additional logic required to match the final route.
|
||||
*
|
||||
* Condition-less paths are put in a static array in the switch's default, with generic matching logic.
|
||||
* Paths that can match two or more routes, or have user-specified conditions are put in separate switch's cases.
|
||||
*
|
||||
* Last but not least:
|
||||
* - Because it is not possibe to mix unicode/non-unicode patterns in a single regexp, several of them can be generated.
|
||||
* - The same regexp can be used several times when the logic in the switch rejects the match. When this happens, the
|
||||
* matching-but-failing subpattern is blacklisted by replacing its name by "(*F)", which forces a failure-to-match.
|
||||
* To ease this backlisting operation, the name of subpatterns is also the string offset where the replacement should occur.
|
||||
*/
|
||||
private function compileDynamicRoutes(RouteCollection $collection, bool $matchHost, int $chunkLimit, array &$conditions): string
|
||||
{
|
||||
if (!$collection->all()) {
|
||||
return '';
|
||||
}
|
||||
$code = '';
|
||||
$state = (object) [
|
||||
'regex' => '',
|
||||
'routes' => '',
|
||||
'mark' => 0,
|
||||
'markTail' => 0,
|
||||
'hostVars' => [],
|
||||
'vars' => [],
|
||||
];
|
||||
$state->getVars = static function ($m) use ($state) {
|
||||
if ('_route' === $m[1]) {
|
||||
return '?:';
|
||||
}
|
||||
|
||||
$state->vars[] = $m[1];
|
||||
|
||||
return '';
|
||||
};
|
||||
|
||||
$chunkSize = 0;
|
||||
$prev = null;
|
||||
$perModifiers = [];
|
||||
foreach ($collection->all() as $name => $route) {
|
||||
preg_match('#[a-zA-Z]*$#', $route->compile()->getRegex(), $rx);
|
||||
if ($chunkLimit < ++$chunkSize || $prev !== $rx[0] && $route->compile()->getPathVariables()) {
|
||||
$chunkSize = 1;
|
||||
$routes = new RouteCollection();
|
||||
$perModifiers[] = [$rx[0], $routes];
|
||||
$prev = $rx[0];
|
||||
}
|
||||
$routes->add($name, $route);
|
||||
}
|
||||
|
||||
foreach ($perModifiers as list($modifiers, $routes)) {
|
||||
$prev = false;
|
||||
$perHost = [];
|
||||
foreach ($routes->all() as $name => $route) {
|
||||
$regex = $route->compile()->getHostRegex();
|
||||
if ($prev !== $regex) {
|
||||
$routes = new RouteCollection();
|
||||
$perHost[] = [$regex, $routes];
|
||||
$prev = $regex;
|
||||
}
|
||||
$routes->add($name, $route);
|
||||
}
|
||||
$prev = false;
|
||||
$rx = '{^(?';
|
||||
$code .= "\n {$state->mark} => ".self::export($rx);
|
||||
$state->mark += \strlen($rx);
|
||||
$state->regex = $rx;
|
||||
|
||||
foreach ($perHost as list($hostRegex, $routes)) {
|
||||
if ($matchHost) {
|
||||
if ($hostRegex) {
|
||||
preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $hostRegex, $rx);
|
||||
$state->vars = [];
|
||||
$hostRegex = '(?i:'.preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]).')\.';
|
||||
$state->hostVars = $state->vars;
|
||||
} else {
|
||||
$hostRegex = '(?:(?:[^./]*+\.)++)';
|
||||
$state->hostVars = [];
|
||||
}
|
||||
$state->mark += \strlen($rx = ($prev ? ')' : '')."|{$hostRegex}(?");
|
||||
$code .= "\n .".self::export($rx);
|
||||
$state->regex .= $rx;
|
||||
$prev = true;
|
||||
}
|
||||
|
||||
$tree = new StaticPrefixCollection();
|
||||
foreach ($routes->all() as $name => $route) {
|
||||
preg_match('#^.\^(.*)\$.[a-zA-Z]*$#', $route->compile()->getRegex(), $rx);
|
||||
|
||||
$state->vars = [];
|
||||
$regex = preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]);
|
||||
if ($hasTrailingSlash = '/' !== $regex && '/' === $regex[-1]) {
|
||||
$regex = substr($regex, 0, -1);
|
||||
}
|
||||
$hasTrailingVar = (bool) preg_match('#\{\w+\}/?$#', $route->getPath());
|
||||
|
||||
$tree->addRoute($regex, [$name, $regex, $state->vars, $route, $hasTrailingSlash, $hasTrailingVar]);
|
||||
}
|
||||
|
||||
$code .= $this->compileStaticPrefixCollection($tree, $state, 0, $conditions);
|
||||
}
|
||||
if ($matchHost) {
|
||||
$code .= "\n .')'";
|
||||
$state->regex .= ')';
|
||||
}
|
||||
$rx = ")/?$}{$modifiers}";
|
||||
$code .= "\n .'{$rx}',";
|
||||
$state->regex .= $rx;
|
||||
$state->markTail = 0;
|
||||
|
||||
// if the regex is too large, throw a signaling exception to recompute with smaller chunk size
|
||||
set_error_handler(function ($type, $message) { throw 0 === strpos($message, $this->signalingException->getMessage()) ? $this->signalingException : new \ErrorException($message); });
|
||||
try {
|
||||
preg_match($state->regex, '');
|
||||
} finally {
|
||||
restore_error_handler();
|
||||
}
|
||||
}
|
||||
|
||||
unset($state->getVars);
|
||||
|
||||
return "\$this->regexpList = [{$code}\n];\n"
|
||||
."\$this->dynamicRoutes = [\n{$this->indent($state->routes, 1)}];\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles a regexp tree of subpatterns that matches nested same-prefix routes.
|
||||
*
|
||||
* @param \stdClass $state A simple state object that keeps track of the progress of the compilation,
|
||||
* and gathers the generated switch's "case" and "default" statements
|
||||
*/
|
||||
private function compileStaticPrefixCollection(StaticPrefixCollection $tree, \stdClass $state, int $prefixLen, array &$conditions): string
|
||||
{
|
||||
$code = '';
|
||||
$prevRegex = null;
|
||||
$routes = $tree->getRoutes();
|
||||
|
||||
foreach ($routes as $i => $route) {
|
||||
if ($route instanceof StaticPrefixCollection) {
|
||||
$prevRegex = null;
|
||||
$prefix = substr($route->getPrefix(), $prefixLen);
|
||||
$state->mark += \strlen($rx = "|{$prefix}(?");
|
||||
$code .= "\n .".self::export($rx);
|
||||
$state->regex .= $rx;
|
||||
$code .= $this->indent($this->compileStaticPrefixCollection($route, $state, $prefixLen + \strlen($prefix), $conditions));
|
||||
$code .= "\n .')'";
|
||||
$state->regex .= ')';
|
||||
++$state->markTail;
|
||||
continue;
|
||||
}
|
||||
|
||||
list($name, $regex, $vars, $route, $hasTrailingSlash, $hasTrailingVar) = $route;
|
||||
$compiledRoute = $route->compile();
|
||||
$vars = array_merge($state->hostVars, $vars);
|
||||
|
||||
if ($compiledRoute->getRegex() === $prevRegex) {
|
||||
$state->routes = substr_replace($state->routes, $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions), -3, 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
$state->mark += 3 + $state->markTail + \strlen($regex) - $prefixLen;
|
||||
$state->markTail = 2 + \strlen($state->mark);
|
||||
$rx = sprintf('|%s(*:%s)', substr($regex, $prefixLen), $state->mark);
|
||||
$code .= "\n .".self::export($rx);
|
||||
$state->regex .= $rx;
|
||||
|
||||
$prevRegex = $compiledRoute->getRegex();
|
||||
$state->routes .= sprintf("%s => [\n%s],\n", $state->mark, $this->compileRoute($route, $name, $vars, $hasTrailingSlash, $hasTrailingVar, $conditions));
|
||||
}
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compiles a single Route to PHP code used to match it against the path info.
|
||||
*/
|
||||
private function compileRoute(Route $route, string $name, $vars, bool $hasTrailingSlash, bool $hasTrailingVar, array &$conditions): string
|
||||
{
|
||||
$defaults = $route->getDefaults();
|
||||
|
||||
if (isset($defaults['_canonical_route'])) {
|
||||
$name = $defaults['_canonical_route'];
|
||||
unset($defaults['_canonical_route']);
|
||||
}
|
||||
|
||||
if ($condition = $route->getCondition()) {
|
||||
$condition = $this->getExpressionLanguage()->compile($condition, ['context', 'request']);
|
||||
$condition = $conditions[$condition] ?? $conditions[$condition] = (false !== strpos($condition, '$request') ? 1 : -1) * \count($conditions);
|
||||
} else {
|
||||
$condition = 'null';
|
||||
}
|
||||
|
||||
return sprintf(
|
||||
" [%s, %s, %s, %s, %s, %s, %s],\n",
|
||||
self::export(['_route' => $name] + $defaults),
|
||||
self::export($vars),
|
||||
self::export(array_flip($route->getMethods()) ?: null),
|
||||
self::export(array_flip($route->getSchemes()) ?: null),
|
||||
self::export($hasTrailingSlash),
|
||||
self::export($hasTrailingVar),
|
||||
$condition
|
||||
);
|
||||
}
|
||||
|
||||
private function getExpressionLanguage()
|
||||
{
|
||||
if (null === $this->expressionLanguage) {
|
||||
if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
|
||||
throw new \LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
|
||||
}
|
||||
$this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders);
|
||||
}
|
||||
|
||||
return $this->expressionLanguage;
|
||||
}
|
||||
|
||||
private function indent($code, $level = 1)
|
||||
{
|
||||
$code = preg_replace('/ => \[\n (\[.+),\n\],/', ' => [$1],', $code);
|
||||
|
||||
return preg_replace('/^./m', str_repeat(' ', $level).'$0', $code);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public static function export($value): string
|
||||
{
|
||||
if (null === $value) {
|
||||
return 'null';
|
||||
}
|
||||
if (!\is_array($value)) {
|
||||
if (\is_object($value)) {
|
||||
throw new \InvalidArgumentException('Symfony\Component\Routing\Route cannot contain objects.');
|
||||
}
|
||||
|
||||
return str_replace("\n", '\'."\n".\'', var_export($value, true));
|
||||
}
|
||||
if (!$value) {
|
||||
return '[]';
|
||||
}
|
||||
|
||||
$i = 0;
|
||||
$export = '[';
|
||||
|
||||
foreach ($value as $k => $v) {
|
||||
if ($i === $k) {
|
||||
++$i;
|
||||
} else {
|
||||
$export .= self::export($k).' => ';
|
||||
|
||||
if (\is_int($k) && $i < $k) {
|
||||
$i = 1 + $k;
|
||||
}
|
||||
}
|
||||
|
||||
$export .= self::export($v).', ';
|
||||
}
|
||||
|
||||
return substr_replace($export, ']', -2);
|
||||
}
|
||||
}
|
||||
|
||||
20
vendor/symfony/routing/Matcher/UrlMatcher.php
vendored
20
vendor/symfony/routing/Matcher/UrlMatcher.php
vendored
@@ -89,7 +89,7 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
|
||||
return $ret;
|
||||
}
|
||||
|
||||
if ('/' === $pathinfo && !$this->allow) {
|
||||
if ('/' === $pathinfo && !$this->allow && !$this->allowSchemes) {
|
||||
throw new NoConfigurationException();
|
||||
}
|
||||
|
||||
@@ -182,24 +182,16 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
|
||||
if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) {
|
||||
return $this->allow = $this->allowSchemes = [];
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$hasRequiredScheme = !$route->getSchemes() || $route->hasScheme($this->context->getScheme());
|
||||
if ($requiredMethods) {
|
||||
if (!\in_array($method, $requiredMethods)) {
|
||||
if ($hasRequiredScheme) {
|
||||
$this->allow = array_merge($this->allow, $requiredMethods);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
if ($route->getSchemes() && !$route->hasScheme($this->context->getScheme())) {
|
||||
$this->allowSchemes = array_merge($this->allowSchemes, $route->getSchemes());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$hasRequiredScheme) {
|
||||
$this->allowSchemes = array_merge($this->allowSchemes, $route->getSchemes());
|
||||
|
||||
if ($requiredMethods && !\in_array($method, $requiredMethods)) {
|
||||
$this->allow = array_merge($this->allow, $requiredMethods);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
27
vendor/symfony/routing/Route.php
vendored
27
vendor/symfony/routing/Route.php
vendored
@@ -62,12 +62,9 @@ class Route implements \Serializable
|
||||
$this->setCondition($condition);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function serialize()
|
||||
public function __serialize(): array
|
||||
{
|
||||
return serialize([
|
||||
return [
|
||||
'path' => $this->path,
|
||||
'host' => $this->host,
|
||||
'defaults' => $this->defaults,
|
||||
@@ -77,15 +74,19 @@ class Route implements \Serializable
|
||||
'methods' => $this->methods,
|
||||
'condition' => $this->condition,
|
||||
'compiled' => $this->compiled,
|
||||
]);
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @internal since Symfony 4.3, will be removed in Symfony 5 as the class won't implement Serializable anymore
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
public function serialize()
|
||||
{
|
||||
return serialize($this->__serialize());
|
||||
}
|
||||
|
||||
public function __unserialize(array $data): void
|
||||
{
|
||||
$data = unserialize($serialized);
|
||||
$this->path = $data['path'];
|
||||
$this->host = $data['host'];
|
||||
$this->defaults = $data['defaults'];
|
||||
@@ -102,6 +103,14 @@ class Route implements \Serializable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal since Symfony 4.3, will be removed in Symfony 5 as the class won't implement Serializable anymore
|
||||
*/
|
||||
public function unserialize($serialized)
|
||||
{
|
||||
$this->__unserialize(unserialize($serialized));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the pattern for the path.
|
||||
*
|
||||
|
||||
18
vendor/symfony/routing/RouteCompiler.php
vendored
18
vendor/symfony/routing/RouteCompiler.php
vendored
@@ -111,9 +111,10 @@ class RouteCompiler implements RouteCompilerInterface
|
||||
|
||||
// Match all variables enclosed in "{}" and iterate over them. But we only want to match the innermost variable
|
||||
// in case of nested "{}", e.g. {foo{bar}}. This in ensured because \w does not match "{" or "}" itself.
|
||||
preg_match_all('#\{\w+\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
|
||||
preg_match_all('#\{(!)?(\w+)\}#', $pattern, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
|
||||
foreach ($matches as $match) {
|
||||
$varName = substr($match[0][0], 1, -1);
|
||||
$important = $match[1][1] >= 0;
|
||||
$varName = $match[2][0];
|
||||
// get all static text preceding the current variable
|
||||
$precedingText = substr($pattern, $pos, $match[0][1] - $pos);
|
||||
$pos = $match[0][1] + \strlen($match[0][0]);
|
||||
@@ -183,7 +184,13 @@ class RouteCompiler implements RouteCompilerInterface
|
||||
$regexp = self::transformCapturingGroupsToNonCapturings($regexp);
|
||||
}
|
||||
|
||||
$tokens[] = ['variable', $isSeparator ? $precedingChar : '', $regexp, $varName];
|
||||
if ($important) {
|
||||
$token = ['variable', $isSeparator ? $precedingChar : '', $regexp, $varName, false, true];
|
||||
} else {
|
||||
$token = ['variable', $isSeparator ? $precedingChar : '', $regexp, $varName];
|
||||
}
|
||||
|
||||
$tokens[] = $token;
|
||||
$variables[] = $varName;
|
||||
}
|
||||
|
||||
@@ -196,7 +203,8 @@ class RouteCompiler implements RouteCompilerInterface
|
||||
if (!$isHost) {
|
||||
for ($i = \count($tokens) - 1; $i >= 0; --$i) {
|
||||
$token = $tokens[$i];
|
||||
if ('variable' === $token[0] && $route->hasDefault($token[3])) {
|
||||
// variable is optional when it is not important and has a default value
|
||||
if ('variable' === $token[0] && !($token[5] ?? false) && $route->hasDefault($token[3])) {
|
||||
$firstOptional = $i;
|
||||
} else {
|
||||
break;
|
||||
@@ -216,7 +224,7 @@ class RouteCompiler implements RouteCompilerInterface
|
||||
$regexp .= 'u';
|
||||
for ($i = 0, $nbToken = \count($tokens); $i < $nbToken; ++$i) {
|
||||
if ('variable' === $tokens[$i][0]) {
|
||||
$tokens[$i][] = true;
|
||||
$tokens[$i][4] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
77
vendor/symfony/routing/Router.php
vendored
77
vendor/symfony/routing/Router.php
vendored
@@ -12,17 +12,24 @@
|
||||
namespace Symfony\Component\Routing;
|
||||
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Routing\RedirectableUrlMatcher;
|
||||
use Symfony\Component\Config\ConfigCacheFactory;
|
||||
use Symfony\Component\Config\ConfigCacheFactoryInterface;
|
||||
use Symfony\Component\Config\ConfigCacheInterface;
|
||||
use Symfony\Component\Config\Loader\LoaderInterface;
|
||||
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\Routing\Generator\CompiledUrlGenerator;
|
||||
use Symfony\Component\Routing\Generator\ConfigurableRequirementsInterface;
|
||||
use Symfony\Component\Routing\Generator\Dumper\CompiledUrlGeneratorDumper;
|
||||
use Symfony\Component\Routing\Generator\Dumper\GeneratorDumperInterface;
|
||||
use Symfony\Component\Routing\Generator\UrlGenerator;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface;
|
||||
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
|
||||
use Symfony\Component\Routing\Matcher\UrlMatcher;
|
||||
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
|
||||
|
||||
/**
|
||||
@@ -113,13 +120,9 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
* * cache_dir: The cache directory (or null to disable caching)
|
||||
* * debug: Whether to enable debugging or not (false by default)
|
||||
* * generator_class: The name of a UrlGeneratorInterface implementation
|
||||
* * generator_base_class: The base class for the dumped generator class
|
||||
* * generator_cache_class: The class name for the dumped generator class
|
||||
* * generator_dumper_class: The name of a GeneratorDumperInterface implementation
|
||||
* * matcher_class: The name of a UrlMatcherInterface implementation
|
||||
* * matcher_base_class: The base class for the dumped matcher class
|
||||
* * matcher_dumper_class: The class name for the dumped matcher class
|
||||
* * matcher_cache_class: The name of a MatcherDumperInterface implementation
|
||||
* * matcher_dumper_class: The name of a MatcherDumperInterface implementation
|
||||
* * resource_type: Type hint for the main resource (optional)
|
||||
* * strict_requirements: Configure strict requirement checking for generators
|
||||
* implementing ConfigurableRequirementsInterface (default is true)
|
||||
@@ -133,14 +136,14 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
$this->options = [
|
||||
'cache_dir' => null,
|
||||
'debug' => false,
|
||||
'generator_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
|
||||
'generator_base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
|
||||
'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper',
|
||||
'generator_cache_class' => 'ProjectUrlGenerator',
|
||||
'matcher_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
|
||||
'matcher_base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
|
||||
'matcher_dumper_class' => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper',
|
||||
'matcher_cache_class' => 'ProjectUrlMatcher',
|
||||
'generator_class' => CompiledUrlGenerator::class,
|
||||
'generator_base_class' => UrlGenerator::class, // deprecated
|
||||
'generator_dumper_class' => CompiledUrlGeneratorDumper::class,
|
||||
'generator_cache_class' => 'UrlGenerator', // deprecated
|
||||
'matcher_class' => CompiledUrlMatcher::class,
|
||||
'matcher_base_class' => UrlMatcher::class, // deprecated
|
||||
'matcher_dumper_class' => CompiledUrlMatcherDumper::class,
|
||||
'matcher_cache_class' => 'UrlMatcher', // deprecated
|
||||
'resource_type' => null,
|
||||
'strict_requirements' => true,
|
||||
];
|
||||
@@ -148,6 +151,7 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
// check option names and live merge, if errors are encountered Exception will be thrown
|
||||
$invalid = [];
|
||||
foreach ($options as $key => $value) {
|
||||
$this->checkDeprecatedOption($key);
|
||||
if (\array_key_exists($key, $this->options)) {
|
||||
$this->options[$key] = $value;
|
||||
} else {
|
||||
@@ -174,6 +178,8 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
|
||||
}
|
||||
|
||||
$this->checkDeprecatedOption($key);
|
||||
|
||||
$this->options[$key] = $value;
|
||||
}
|
||||
|
||||
@@ -192,6 +198,8 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
|
||||
}
|
||||
|
||||
$this->checkDeprecatedOption($key);
|
||||
|
||||
return $this->options[$key];
|
||||
}
|
||||
|
||||
@@ -279,8 +287,14 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
return $this->matcher;
|
||||
}
|
||||
|
||||
$compiled = is_a($this->options['matcher_class'], CompiledUrlMatcher::class, true) && (UrlMatcher::class === $this->options['matcher_base_class'] || RedirectableUrlMatcher::class === $this->options['matcher_base_class']);
|
||||
|
||||
if (null === $this->options['cache_dir'] || null === $this->options['matcher_cache_class']) {
|
||||
$this->matcher = new $this->options['matcher_class']($this->getRouteCollection(), $this->context);
|
||||
$routes = $this->getRouteCollection();
|
||||
if ($compiled) {
|
||||
$routes = (new CompiledUrlMatcherDumper($routes))->getCompiledRoutes();
|
||||
}
|
||||
$this->matcher = new $this->options['matcher_class']($routes, $this->context);
|
||||
if (method_exists($this->matcher, 'addExpressionLanguageProvider')) {
|
||||
foreach ($this->expressionLanguageProviders as $provider) {
|
||||
$this->matcher->addExpressionLanguageProvider($provider);
|
||||
@@ -308,6 +322,10 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
}
|
||||
);
|
||||
|
||||
if ($compiled) {
|
||||
return $this->matcher = new $this->options['matcher_class'](require $cache->getPath(), $this->context);
|
||||
}
|
||||
|
||||
if (!class_exists($this->options['matcher_cache_class'], false)) {
|
||||
require_once $cache->getPath();
|
||||
}
|
||||
@@ -326,8 +344,14 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
return $this->generator;
|
||||
}
|
||||
|
||||
$compiled = is_a($this->options['generator_class'], CompiledUrlGenerator::class, true) && UrlGenerator::class === $this->options['generator_base_class'];
|
||||
|
||||
if (null === $this->options['cache_dir'] || null === $this->options['generator_cache_class']) {
|
||||
$this->generator = new $this->options['generator_class']($this->getRouteCollection(), $this->context, $this->logger, $this->defaultLocale);
|
||||
$routes = $this->getRouteCollection();
|
||||
if ($compiled) {
|
||||
$routes = (new CompiledUrlGeneratorDumper($routes))->getCompiledRoutes();
|
||||
}
|
||||
$this->generator = new $this->options['generator_class']($routes, $this->context, $this->logger, $this->defaultLocale);
|
||||
} else {
|
||||
$cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/'.$this->options['generator_cache_class'].'.php',
|
||||
function (ConfigCacheInterface $cache) {
|
||||
@@ -342,11 +366,15 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
}
|
||||
);
|
||||
|
||||
if (!class_exists($this->options['generator_cache_class'], false)) {
|
||||
require_once $cache->getPath();
|
||||
}
|
||||
if ($compiled) {
|
||||
$this->generator = new $this->options['generator_class'](require $cache->getPath(), $this->context, $this->logger);
|
||||
} else {
|
||||
if (!class_exists($this->options['generator_cache_class'], false)) {
|
||||
require_once $cache->getPath();
|
||||
}
|
||||
|
||||
$this->generator = new $this->options['generator_cache_class']($this->context, $this->logger, $this->defaultLocale);
|
||||
$this->generator = new $this->options['generator_cache_class']($this->context, $this->logger, $this->defaultLocale);
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->generator instanceof ConfigurableRequirementsInterface) {
|
||||
@@ -391,4 +419,15 @@ class Router implements RouterInterface, RequestMatcherInterface
|
||||
|
||||
return $this->configCacheFactory;
|
||||
}
|
||||
|
||||
private function checkDeprecatedOption($key)
|
||||
{
|
||||
switch ($key) {
|
||||
case 'generator_base_class':
|
||||
case 'generator_cache_class':
|
||||
case 'matcher_base_class':
|
||||
case 'matcher_cache_class':
|
||||
@trigger_error(sprintf('Option "%s" given to router %s is deprecated since Symfony 4.3.', $key, static::class), E_USER_DEPRECATED);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
10
vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/EncodingClass.php
vendored
Normal file
10
vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/EncodingClass.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses;
|
||||
|
||||
class EncodingClass
|
||||
{
|
||||
public function routeÀction()
|
||||
{
|
||||
}
|
||||
}
|
||||
34
vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/GlobalDefaultsClass.php
vendored
Normal file
34
vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/GlobalDefaultsClass.php
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures;
|
||||
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
/**
|
||||
* @Route("/defaults", locale="g_locale", format="g_format")
|
||||
*/
|
||||
class GlobalDefaultsClass
|
||||
{
|
||||
/**
|
||||
* @Route("/specific-locale", name="specific_locale", locale="s_locale")
|
||||
*/
|
||||
public function locale()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/specific-format", name="specific_format", format="s_format")
|
||||
*/
|
||||
public function format()
|
||||
{
|
||||
}
|
||||
}
|
||||
25
vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/Utf8ActionControllers.php
vendored
Normal file
25
vendor/symfony/routing/Tests/Fixtures/AnnotationFixtures/Utf8ActionControllers.php
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures;
|
||||
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
|
||||
/**
|
||||
* @Route("/test", utf8=true)
|
||||
*/
|
||||
class Utf8ActionControllers
|
||||
{
|
||||
/**
|
||||
* @Route(name="one")
|
||||
*/
|
||||
public function one()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route(name="two", utf8=false)
|
||||
*/
|
||||
public function two()
|
||||
{
|
||||
}
|
||||
}
|
||||
10
vendor/symfony/routing/Tests/Fixtures/defaults.php
vendored
Normal file
10
vendor/symfony/routing/Tests/Fixtures/defaults.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||
|
||||
return function (RoutingConfigurator $routes) {
|
||||
$routes->add('defaults', '/defaults')
|
||||
->locale('en')
|
||||
->format('html')
|
||||
;
|
||||
};
|
||||
8
vendor/symfony/routing/Tests/Fixtures/defaults.xml
vendored
Normal file
8
vendor/symfony/routing/Tests/Fixtures/defaults.xml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<routes xmlns="http://symfony.com/schema/routing"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://symfony.com/schema/routing
|
||||
https://symfony.com/schema/routing/routing-1.0.xsd">
|
||||
|
||||
<route id="defaults" path="/defaults" locale="en" format="html" />
|
||||
</routes>
|
||||
4
vendor/symfony/routing/Tests/Fixtures/defaults.yml
vendored
Normal file
4
vendor/symfony/routing/Tests/Fixtures/defaults.yml
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
defaults:
|
||||
path: /defaults
|
||||
locale: en
|
||||
format: html
|
||||
17
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher0.php
vendored
Normal file
17
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher0.php
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
],
|
||||
[ // $regexpList
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
108
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher1.php
vendored
Normal file
108
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher1.php
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
true, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/test/baz' => [[['_route' => 'baz'], null, null, null, false, false, null]],
|
||||
'/test/baz.html' => [[['_route' => 'baz2'], null, null, null, false, false, null]],
|
||||
'/test/baz3' => [[['_route' => 'baz3'], null, null, null, true, false, null]],
|
||||
'/foofoo' => [[['_route' => 'foofoo', 'def' => 'test'], null, null, null, false, false, null]],
|
||||
'/spa ce' => [[['_route' => 'space'], null, null, null, false, false, null]],
|
||||
'/multi/new' => [[['_route' => 'overridden2'], null, null, null, false, false, null]],
|
||||
'/multi/hey' => [[['_route' => 'hey'], null, null, null, true, false, null]],
|
||||
'/ababa' => [[['_route' => 'ababa'], null, null, null, false, false, null]],
|
||||
'/route1' => [[['_route' => 'route1'], 'a.example.com', null, null, false, false, null]],
|
||||
'/c2/route2' => [[['_route' => 'route2'], 'a.example.com', null, null, false, false, null]],
|
||||
'/route4' => [[['_route' => 'route4'], 'a.example.com', null, null, false, false, null]],
|
||||
'/c2/route3' => [[['_route' => 'route3'], 'b.example.com', null, null, false, false, null]],
|
||||
'/route5' => [[['_route' => 'route5'], 'c.example.com', null, null, false, false, null]],
|
||||
'/route6' => [[['_route' => 'route6'], null, null, null, false, false, null]],
|
||||
'/route11' => [[['_route' => 'route11'], '#^(?P<var1>[^\\.]++)\\.example\\.com$#sDi', null, null, false, false, null]],
|
||||
'/route12' => [[['_route' => 'route12', 'var1' => 'val'], '#^(?P<var1>[^\\.]++)\\.example\\.com$#sDi', null, null, false, false, null]],
|
||||
'/route17' => [[['_route' => 'route17'], null, null, null, false, false, null]],
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|(?:(?:[^./]*+\\.)++)(?'
|
||||
.'|/foo/(baz|symfony)(*:47)'
|
||||
.'|/bar(?'
|
||||
.'|/([^/]++)(*:70)'
|
||||
.'|head/([^/]++)(*:90)'
|
||||
.')'
|
||||
.'|/test/([^/]++)(?'
|
||||
.'|(*:115)'
|
||||
.')'
|
||||
.'|/([\']+)(*:131)'
|
||||
.'|/a/(?'
|
||||
.'|b\'b/([^/]++)(?'
|
||||
.'|(*:160)'
|
||||
.'|(*:168)'
|
||||
.')'
|
||||
.'|(.*)(*:181)'
|
||||
.'|b\'b/([^/]++)(?'
|
||||
.'|(*:204)'
|
||||
.'|(*:212)'
|
||||
.')'
|
||||
.')'
|
||||
.'|/multi/hello(?:/([^/]++))?(*:248)'
|
||||
.'|/([^/]++)/b/([^/]++)(?'
|
||||
.'|(*:279)'
|
||||
.'|(*:287)'
|
||||
.')'
|
||||
.'|/aba/([^/]++)(*:309)'
|
||||
.')|(?i:([^\\.]++)\\.example\\.com)\\.(?'
|
||||
.'|/route1(?'
|
||||
.'|3/([^/]++)(*:371)'
|
||||
.'|4/([^/]++)(*:389)'
|
||||
.')'
|
||||
.')|(?i:c\\.example\\.com)\\.(?'
|
||||
.'|/route15/([^/]++)(*:441)'
|
||||
.')|(?:(?:[^./]*+\\.)++)(?'
|
||||
.'|/route16/([^/]++)(*:489)'
|
||||
.'|/a/(?'
|
||||
.'|a\\.\\.\\.(*:510)'
|
||||
.'|b/(?'
|
||||
.'|([^/]++)(*:531)'
|
||||
.'|c/([^/]++)(*:549)'
|
||||
.')'
|
||||
.')'
|
||||
.')'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
47 => [[['_route' => 'foo', 'def' => 'test'], ['bar'], null, null, false, true, null]],
|
||||
70 => [[['_route' => 'bar'], ['foo'], ['GET' => 0, 'HEAD' => 1], null, false, true, null]],
|
||||
90 => [[['_route' => 'barhead'], ['foo'], ['GET' => 0], null, false, true, null]],
|
||||
115 => [
|
||||
[['_route' => 'baz4'], ['foo'], null, null, true, true, null],
|
||||
[['_route' => 'baz5'], ['foo'], ['POST' => 0], null, true, true, null],
|
||||
[['_route' => 'baz.baz6'], ['foo'], ['PUT' => 0], null, true, true, null],
|
||||
],
|
||||
131 => [[['_route' => 'quoter'], ['quoter'], null, null, false, true, null]],
|
||||
160 => [[['_route' => 'foo1'], ['foo'], ['PUT' => 0], null, false, true, null]],
|
||||
168 => [[['_route' => 'bar1'], ['bar'], null, null, false, true, null]],
|
||||
181 => [[['_route' => 'overridden'], ['var'], null, null, false, true, null]],
|
||||
204 => [[['_route' => 'foo2'], ['foo1'], null, null, false, true, null]],
|
||||
212 => [[['_route' => 'bar2'], ['bar1'], null, null, false, true, null]],
|
||||
248 => [[['_route' => 'helloWorld', 'who' => 'World!'], ['who'], null, null, false, true, null]],
|
||||
279 => [[['_route' => 'foo3'], ['_locale', 'foo'], null, null, false, true, null]],
|
||||
287 => [[['_route' => 'bar3'], ['_locale', 'bar'], null, null, false, true, null]],
|
||||
309 => [[['_route' => 'foo4'], ['foo'], null, null, false, true, null]],
|
||||
371 => [[['_route' => 'route13'], ['var1', 'name'], null, null, false, true, null]],
|
||||
389 => [[['_route' => 'route14', 'var1' => 'val'], ['var1', 'name'], null, null, false, true, null]],
|
||||
441 => [[['_route' => 'route15'], ['name'], null, null, false, true, null]],
|
||||
489 => [[['_route' => 'route16', 'var1' => 'val'], ['name'], null, null, false, true, null]],
|
||||
510 => [[['_route' => 'a'], [], null, null, false, false, null]],
|
||||
531 => [[['_route' => 'b'], ['var'], null, null, false, true, null]],
|
||||
549 => [
|
||||
[['_route' => 'c'], ['var'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
2774
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher10.php
vendored
Normal file
2774
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher10.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
64
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher11.php
vendored
Normal file
64
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher11.php
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/(en|fr)/(?'
|
||||
.'|admin/post(?'
|
||||
.'|(*:32)'
|
||||
.'|/(?'
|
||||
.'|new(*:46)'
|
||||
.'|(\\d+)(*:58)'
|
||||
.'|(\\d+)/edit(*:75)'
|
||||
.'|(\\d+)/delete(*:94)'
|
||||
.')'
|
||||
.')'
|
||||
.'|blog(?'
|
||||
.'|(*:110)'
|
||||
.'|/(?'
|
||||
.'|rss\\.xml(*:130)'
|
||||
.'|p(?'
|
||||
.'|age/([^/]++)(*:154)'
|
||||
.'|osts/([^/]++)(*:175)'
|
||||
.')'
|
||||
.'|comments/(\\d+)/new(*:202)'
|
||||
.'|search(*:216)'
|
||||
.')'
|
||||
.')'
|
||||
.'|log(?'
|
||||
.'|in(*:234)'
|
||||
.'|out(*:245)'
|
||||
.')'
|
||||
.')'
|
||||
.'|/(en|fr)?(*:264)'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
32 => [[['_route' => 'a', '_locale' => 'en'], ['_locale'], null, null, true, false, null]],
|
||||
46 => [[['_route' => 'b', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
58 => [[['_route' => 'c', '_locale' => 'en'], ['_locale', 'id'], null, null, false, true, null]],
|
||||
75 => [[['_route' => 'd', '_locale' => 'en'], ['_locale', 'id'], null, null, false, false, null]],
|
||||
94 => [[['_route' => 'e', '_locale' => 'en'], ['_locale', 'id'], null, null, false, false, null]],
|
||||
110 => [[['_route' => 'f', '_locale' => 'en'], ['_locale'], null, null, true, false, null]],
|
||||
130 => [[['_route' => 'g', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
154 => [[['_route' => 'h', '_locale' => 'en'], ['_locale', 'page'], null, null, false, true, null]],
|
||||
175 => [[['_route' => 'i', '_locale' => 'en'], ['_locale', 'page'], null, null, false, true, null]],
|
||||
202 => [[['_route' => 'j', '_locale' => 'en'], ['_locale', 'id'], null, null, false, false, null]],
|
||||
216 => [[['_route' => 'k', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
234 => [[['_route' => 'l', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
245 => [[['_route' => 'm', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
264 => [
|
||||
[['_route' => 'n', '_locale' => 'en'], ['_locale'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
44
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher12.php
vendored
Normal file
44
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher12.php
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/abc([^/]++)/(?'
|
||||
.'|1(?'
|
||||
.'|(*:27)'
|
||||
.'|0(?'
|
||||
.'|(*:38)'
|
||||
.'|0(*:46)'
|
||||
.')'
|
||||
.')'
|
||||
.'|2(?'
|
||||
.'|(*:59)'
|
||||
.'|0(?'
|
||||
.'|(*:70)'
|
||||
.'|0(*:78)'
|
||||
.')'
|
||||
.')'
|
||||
.')'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
27 => [[['_route' => 'r1'], ['foo'], null, null, false, false, null]],
|
||||
38 => [[['_route' => 'r10'], ['foo'], null, null, false, false, null]],
|
||||
46 => [[['_route' => 'r100'], ['foo'], null, null, false, false, null]],
|
||||
59 => [[['_route' => 'r2'], ['foo'], null, null, false, false, null]],
|
||||
70 => [[['_route' => 'r20'], ['foo'], null, null, false, false, null]],
|
||||
78 => [
|
||||
[['_route' => 'r200'], ['foo'], null, null, false, false, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
29
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher13.php
vendored
Normal file
29
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher13.php
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
true, // $matchHost
|
||||
[ // $staticRoutes
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|(?i:([^\\.]++)\\.exampple\\.com)\\.(?'
|
||||
.'|/abc([^/]++)(?'
|
||||
.'|(*:56)'
|
||||
.')'
|
||||
.')'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
56 => [
|
||||
[['_route' => 'r1'], ['foo', 'foo'], null, null, false, true, null],
|
||||
[['_route' => 'r2'], ['foo', 'foo'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
110
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher2.php
vendored
Normal file
110
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher2.php
vendored
Normal file
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
true, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/test/baz' => [[['_route' => 'baz'], null, null, null, false, false, null]],
|
||||
'/test/baz.html' => [[['_route' => 'baz2'], null, null, null, false, false, null]],
|
||||
'/test/baz3' => [[['_route' => 'baz3'], null, null, null, true, false, null]],
|
||||
'/foofoo' => [[['_route' => 'foofoo', 'def' => 'test'], null, null, null, false, false, null]],
|
||||
'/spa ce' => [[['_route' => 'space'], null, null, null, false, false, null]],
|
||||
'/multi/new' => [[['_route' => 'overridden2'], null, null, null, false, false, null]],
|
||||
'/multi/hey' => [[['_route' => 'hey'], null, null, null, true, false, null]],
|
||||
'/ababa' => [[['_route' => 'ababa'], null, null, null, false, false, null]],
|
||||
'/route1' => [[['_route' => 'route1'], 'a.example.com', null, null, false, false, null]],
|
||||
'/c2/route2' => [[['_route' => 'route2'], 'a.example.com', null, null, false, false, null]],
|
||||
'/route4' => [[['_route' => 'route4'], 'a.example.com', null, null, false, false, null]],
|
||||
'/c2/route3' => [[['_route' => 'route3'], 'b.example.com', null, null, false, false, null]],
|
||||
'/route5' => [[['_route' => 'route5'], 'c.example.com', null, null, false, false, null]],
|
||||
'/route6' => [[['_route' => 'route6'], null, null, null, false, false, null]],
|
||||
'/route11' => [[['_route' => 'route11'], '#^(?P<var1>[^\\.]++)\\.example\\.com$#sDi', null, null, false, false, null]],
|
||||
'/route12' => [[['_route' => 'route12', 'var1' => 'val'], '#^(?P<var1>[^\\.]++)\\.example\\.com$#sDi', null, null, false, false, null]],
|
||||
'/route17' => [[['_route' => 'route17'], null, null, null, false, false, null]],
|
||||
'/secure' => [[['_route' => 'secure'], null, null, ['https' => 0], false, false, null]],
|
||||
'/nonsecure' => [[['_route' => 'nonsecure'], null, null, ['http' => 0], false, false, null]],
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|(?:(?:[^./]*+\\.)++)(?'
|
||||
.'|/foo/(baz|symfony)(*:47)'
|
||||
.'|/bar(?'
|
||||
.'|/([^/]++)(*:70)'
|
||||
.'|head/([^/]++)(*:90)'
|
||||
.')'
|
||||
.'|/test/([^/]++)(?'
|
||||
.'|(*:115)'
|
||||
.')'
|
||||
.'|/([\']+)(*:131)'
|
||||
.'|/a/(?'
|
||||
.'|b\'b/([^/]++)(?'
|
||||
.'|(*:160)'
|
||||
.'|(*:168)'
|
||||
.')'
|
||||
.'|(.*)(*:181)'
|
||||
.'|b\'b/([^/]++)(?'
|
||||
.'|(*:204)'
|
||||
.'|(*:212)'
|
||||
.')'
|
||||
.')'
|
||||
.'|/multi/hello(?:/([^/]++))?(*:248)'
|
||||
.'|/([^/]++)/b/([^/]++)(?'
|
||||
.'|(*:279)'
|
||||
.'|(*:287)'
|
||||
.')'
|
||||
.'|/aba/([^/]++)(*:309)'
|
||||
.')|(?i:([^\\.]++)\\.example\\.com)\\.(?'
|
||||
.'|/route1(?'
|
||||
.'|3/([^/]++)(*:371)'
|
||||
.'|4/([^/]++)(*:389)'
|
||||
.')'
|
||||
.')|(?i:c\\.example\\.com)\\.(?'
|
||||
.'|/route15/([^/]++)(*:441)'
|
||||
.')|(?:(?:[^./]*+\\.)++)(?'
|
||||
.'|/route16/([^/]++)(*:489)'
|
||||
.'|/a/(?'
|
||||
.'|a\\.\\.\\.(*:510)'
|
||||
.'|b/(?'
|
||||
.'|([^/]++)(*:531)'
|
||||
.'|c/([^/]++)(*:549)'
|
||||
.')'
|
||||
.')'
|
||||
.')'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
47 => [[['_route' => 'foo', 'def' => 'test'], ['bar'], null, null, false, true, null]],
|
||||
70 => [[['_route' => 'bar'], ['foo'], ['GET' => 0, 'HEAD' => 1], null, false, true, null]],
|
||||
90 => [[['_route' => 'barhead'], ['foo'], ['GET' => 0], null, false, true, null]],
|
||||
115 => [
|
||||
[['_route' => 'baz4'], ['foo'], null, null, true, true, null],
|
||||
[['_route' => 'baz5'], ['foo'], ['POST' => 0], null, true, true, null],
|
||||
[['_route' => 'baz.baz6'], ['foo'], ['PUT' => 0], null, true, true, null],
|
||||
],
|
||||
131 => [[['_route' => 'quoter'], ['quoter'], null, null, false, true, null]],
|
||||
160 => [[['_route' => 'foo1'], ['foo'], ['PUT' => 0], null, false, true, null]],
|
||||
168 => [[['_route' => 'bar1'], ['bar'], null, null, false, true, null]],
|
||||
181 => [[['_route' => 'overridden'], ['var'], null, null, false, true, null]],
|
||||
204 => [[['_route' => 'foo2'], ['foo1'], null, null, false, true, null]],
|
||||
212 => [[['_route' => 'bar2'], ['bar1'], null, null, false, true, null]],
|
||||
248 => [[['_route' => 'helloWorld', 'who' => 'World!'], ['who'], null, null, false, true, null]],
|
||||
279 => [[['_route' => 'foo3'], ['_locale', 'foo'], null, null, false, true, null]],
|
||||
287 => [[['_route' => 'bar3'], ['_locale', 'bar'], null, null, false, true, null]],
|
||||
309 => [[['_route' => 'foo4'], ['foo'], null, null, false, true, null]],
|
||||
371 => [[['_route' => 'route13'], ['var1', 'name'], null, null, false, true, null]],
|
||||
389 => [[['_route' => 'route14', 'var1' => 'val'], ['var1', 'name'], null, null, false, true, null]],
|
||||
441 => [[['_route' => 'route15'], ['name'], null, null, false, true, null]],
|
||||
489 => [[['_route' => 'route16', 'var1' => 'val'], ['name'], null, null, false, true, null]],
|
||||
510 => [[['_route' => 'a'], [], null, null, false, false, null]],
|
||||
531 => [[['_route' => 'b'], ['var'], null, null, false, true, null]],
|
||||
549 => [
|
||||
[['_route' => 'c'], ['var'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
30
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher3.php
vendored
Normal file
30
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher3.php
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/rootprefix/test' => [[['_route' => 'static'], null, null, null, false, false, null]],
|
||||
'/with-condition' => [[['_route' => 'with-condition'], null, null, null, false, false, -1]],
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/rootprefix/([^/]++)(*:27)'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
27 => [
|
||||
[['_route' => 'dynamic'], ['var'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
static function ($condition, $context, $request) { // $checkCondition
|
||||
switch ($condition) {
|
||||
case -1: return ($context->getMethod() == "GET");
|
||||
}
|
||||
},
|
||||
];
|
||||
25
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher4.php
vendored
Normal file
25
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher4.php
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/just_head' => [[['_route' => 'just_head'], null, ['HEAD' => 0], null, false, false, null]],
|
||||
'/head_and_get' => [[['_route' => 'head_and_get'], null, ['HEAD' => 0, 'GET' => 1], null, false, false, null]],
|
||||
'/get_and_head' => [[['_route' => 'get_and_head'], null, ['GET' => 0, 'HEAD' => 1], null, false, false, null]],
|
||||
'/post_and_head' => [[['_route' => 'post_and_head'], null, ['POST' => 0, 'HEAD' => 1], null, false, false, null]],
|
||||
'/put_and_post' => [
|
||||
[['_route' => 'put_and_post'], null, ['PUT' => 0, 'POST' => 1], null, false, false, null],
|
||||
[['_route' => 'put_and_get_and_head'], null, ['PUT' => 0, 'GET' => 1, 'HEAD' => 2], null, false, false, null],
|
||||
],
|
||||
],
|
||||
[ // $regexpList
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
38
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher5.php
vendored
Normal file
38
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher5.php
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/a/11' => [[['_route' => 'a_first'], null, null, null, false, false, null]],
|
||||
'/a/22' => [[['_route' => 'a_second'], null, null, null, false, false, null]],
|
||||
'/a/333' => [[['_route' => 'a_third'], null, null, null, false, false, null]],
|
||||
'/a/44' => [[['_route' => 'a_fourth'], null, null, null, true, false, null]],
|
||||
'/a/55' => [[['_route' => 'a_fifth'], null, null, null, true, false, null]],
|
||||
'/a/66' => [[['_route' => 'a_sixth'], null, null, null, true, false, null]],
|
||||
'/nested/group/a' => [[['_route' => 'nested_a'], null, null, null, true, false, null]],
|
||||
'/nested/group/b' => [[['_route' => 'nested_b'], null, null, null, true, false, null]],
|
||||
'/nested/group/c' => [[['_route' => 'nested_c'], null, null, null, true, false, null]],
|
||||
'/slashed/group' => [[['_route' => 'slashed_a'], null, null, null, true, false, null]],
|
||||
'/slashed/group/b' => [[['_route' => 'slashed_b'], null, null, null, true, false, null]],
|
||||
'/slashed/group/c' => [[['_route' => 'slashed_c'], null, null, null, true, false, null]],
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/([^/]++)(*:16)'
|
||||
.'|/nested/([^/]++)(*:39)'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
16 => [[['_route' => 'a_wildcard'], ['param'], null, null, false, true, null]],
|
||||
39 => [
|
||||
[['_route' => 'nested_wildcard'], ['param'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
50
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher6.php
vendored
Normal file
50
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher6.php
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/trailing/simple/no-methods' => [[['_route' => 'simple_trailing_slash_no_methods'], null, null, null, true, false, null]],
|
||||
'/trailing/simple/get-method' => [[['_route' => 'simple_trailing_slash_GET_method'], null, ['GET' => 0], null, true, false, null]],
|
||||
'/trailing/simple/head-method' => [[['_route' => 'simple_trailing_slash_HEAD_method'], null, ['HEAD' => 0], null, true, false, null]],
|
||||
'/trailing/simple/post-method' => [[['_route' => 'simple_trailing_slash_POST_method'], null, ['POST' => 0], null, true, false, null]],
|
||||
'/not-trailing/simple/no-methods' => [[['_route' => 'simple_not_trailing_slash_no_methods'], null, null, null, false, false, null]],
|
||||
'/not-trailing/simple/get-method' => [[['_route' => 'simple_not_trailing_slash_GET_method'], null, ['GET' => 0], null, false, false, null]],
|
||||
'/not-trailing/simple/head-method' => [[['_route' => 'simple_not_trailing_slash_HEAD_method'], null, ['HEAD' => 0], null, false, false, null]],
|
||||
'/not-trailing/simple/post-method' => [[['_route' => 'simple_not_trailing_slash_POST_method'], null, ['POST' => 0], null, false, false, null]],
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/trailing/regex/(?'
|
||||
.'|no\\-methods/([^/]++)(*:46)'
|
||||
.'|get\\-method/([^/]++)(*:73)'
|
||||
.'|head\\-method/([^/]++)(*:101)'
|
||||
.'|post\\-method/([^/]++)(*:130)'
|
||||
.')'
|
||||
.'|/not\\-trailing/regex/(?'
|
||||
.'|no\\-methods/([^/]++)(*:183)'
|
||||
.'|get\\-method/([^/]++)(*:211)'
|
||||
.'|head\\-method/([^/]++)(*:240)'
|
||||
.'|post\\-method/([^/]++)(*:269)'
|
||||
.')'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
46 => [[['_route' => 'regex_trailing_slash_no_methods'], ['param'], null, null, true, true, null]],
|
||||
73 => [[['_route' => 'regex_trailing_slash_GET_method'], ['param'], ['GET' => 0], null, true, true, null]],
|
||||
101 => [[['_route' => 'regex_trailing_slash_HEAD_method'], ['param'], ['HEAD' => 0], null, true, true, null]],
|
||||
130 => [[['_route' => 'regex_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, true, true, null]],
|
||||
183 => [[['_route' => 'regex_not_trailing_slash_no_methods'], ['param'], null, null, false, true, null]],
|
||||
211 => [[['_route' => 'regex_not_trailing_slash_GET_method'], ['param'], ['GET' => 0], null, false, true, null]],
|
||||
240 => [[['_route' => 'regex_not_trailing_slash_HEAD_method'], ['param'], ['HEAD' => 0], null, false, true, null]],
|
||||
269 => [
|
||||
[['_route' => 'regex_not_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
50
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher7.php
vendored
Normal file
50
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher7.php
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/trailing/simple/no-methods' => [[['_route' => 'simple_trailing_slash_no_methods'], null, null, null, true, false, null]],
|
||||
'/trailing/simple/get-method' => [[['_route' => 'simple_trailing_slash_GET_method'], null, ['GET' => 0], null, true, false, null]],
|
||||
'/trailing/simple/head-method' => [[['_route' => 'simple_trailing_slash_HEAD_method'], null, ['HEAD' => 0], null, true, false, null]],
|
||||
'/trailing/simple/post-method' => [[['_route' => 'simple_trailing_slash_POST_method'], null, ['POST' => 0], null, true, false, null]],
|
||||
'/not-trailing/simple/no-methods' => [[['_route' => 'simple_not_trailing_slash_no_methods'], null, null, null, false, false, null]],
|
||||
'/not-trailing/simple/get-method' => [[['_route' => 'simple_not_trailing_slash_GET_method'], null, ['GET' => 0], null, false, false, null]],
|
||||
'/not-trailing/simple/head-method' => [[['_route' => 'simple_not_trailing_slash_HEAD_method'], null, ['HEAD' => 0], null, false, false, null]],
|
||||
'/not-trailing/simple/post-method' => [[['_route' => 'simple_not_trailing_slash_POST_method'], null, ['POST' => 0], null, false, false, null]],
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/trailing/regex/(?'
|
||||
.'|no\\-methods/([^/]++)(*:46)'
|
||||
.'|get\\-method/([^/]++)(*:73)'
|
||||
.'|head\\-method/([^/]++)(*:101)'
|
||||
.'|post\\-method/([^/]++)(*:130)'
|
||||
.')'
|
||||
.'|/not\\-trailing/regex/(?'
|
||||
.'|no\\-methods/([^/]++)(*:183)'
|
||||
.'|get\\-method/([^/]++)(*:211)'
|
||||
.'|head\\-method/([^/]++)(*:240)'
|
||||
.'|post\\-method/([^/]++)(*:269)'
|
||||
.')'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
46 => [[['_route' => 'regex_trailing_slash_no_methods'], ['param'], null, null, true, true, null]],
|
||||
73 => [[['_route' => 'regex_trailing_slash_GET_method'], ['param'], ['GET' => 0], null, true, true, null]],
|
||||
101 => [[['_route' => 'regex_trailing_slash_HEAD_method'], ['param'], ['HEAD' => 0], null, true, true, null]],
|
||||
130 => [[['_route' => 'regex_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, true, true, null]],
|
||||
183 => [[['_route' => 'regex_not_trailing_slash_no_methods'], ['param'], null, null, false, true, null]],
|
||||
211 => [[['_route' => 'regex_not_trailing_slash_GET_method'], ['param'], ['GET' => 0], null, false, true, null]],
|
||||
240 => [[['_route' => 'regex_not_trailing_slash_HEAD_method'], ['param'], ['HEAD' => 0], null, false, true, null]],
|
||||
269 => [
|
||||
[['_route' => 'regex_not_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
32
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher8.php
vendored
Normal file
32
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher8.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
false, // $matchHost
|
||||
[ // $staticRoutes
|
||||
],
|
||||
[ // $regexpList
|
||||
0 => '{^(?'
|
||||
.'|/(a)(*:11)'
|
||||
.')/?$}sD',
|
||||
11 => '{^(?'
|
||||
.'|/(.)(*:22)'
|
||||
.')/?$}sDu',
|
||||
22 => '{^(?'
|
||||
.'|/(.)(*:33)'
|
||||
.')/?$}sD',
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
11 => [[['_route' => 'a'], ['a'], null, null, false, true, null]],
|
||||
22 => [[['_route' => 'b'], ['a'], null, null, false, true, null]],
|
||||
33 => [
|
||||
[['_route' => 'c'], ['a'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
22
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher9.php
vendored
Normal file
22
vendor/symfony/routing/Tests/Fixtures/dumper/compiled_url_matcher9.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file has been auto-generated
|
||||
* by the Symfony Routing Component.
|
||||
*/
|
||||
|
||||
return [
|
||||
true, // $matchHost
|
||||
[ // $staticRoutes
|
||||
'/' => [
|
||||
[['_route' => 'a'], '#^(?P<d>[^\\.]++)\\.e\\.c\\.b\\.a$#sDi', null, null, false, false, null],
|
||||
[['_route' => 'c'], '#^(?P<e>[^\\.]++)\\.e\\.c\\.b\\.a$#sDi', null, null, false, false, null],
|
||||
[['_route' => 'b'], 'd.c.b.a', null, null, false, false, null],
|
||||
],
|
||||
],
|
||||
[ // $regexpList
|
||||
],
|
||||
[ // $dynamicRoutes
|
||||
],
|
||||
null, // $checkCondition
|
||||
];
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -107,7 +107,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
489 => [[['_route' => 'route16', 'var1' => 'val'], ['name'], null, null, false, true, null]],
|
||||
510 => [[['_route' => 'a'], [], null, null, false, false, null]],
|
||||
531 => [[['_route' => 'b'], ['var'], null, null, false, true, null]],
|
||||
549 => [[['_route' => 'c'], ['var'], null, null, false, true, null]],
|
||||
549 => [
|
||||
[['_route' => 'c'], ['var'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -2770,7 +2770,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
49567 => [[['_route' => '_974'], ['a', 'b', 'c'], null, null, false, false, null]],
|
||||
49620 => [[['_route' => '_835'], ['a', 'b', 'c'], null, null, false, false, null]],
|
||||
49668 => [[['_route' => '_934'], ['a', 'b', 'c'], null, null, false, false, null]],
|
||||
49718 => [[['_route' => '_869'], ['a', 'b', 'c'], null, null, false, false, null]],
|
||||
49718 => [
|
||||
[['_route' => '_869'], ['a', 'b', 'c'], null, null, false, false, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -60,7 +60,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec
|
||||
216 => [[['_route' => 'k', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
234 => [[['_route' => 'l', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
245 => [[['_route' => 'm', '_locale' => 'en'], ['_locale'], null, null, false, false, null]],
|
||||
264 => [[['_route' => 'n', '_locale' => 'en'], ['_locale'], null, null, false, true, null]],
|
||||
264 => [
|
||||
[['_route' => 'n', '_locale' => 'en'], ['_locale'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -40,7 +40,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
46 => [[['_route' => 'r100'], ['foo'], null, null, false, false, null]],
|
||||
59 => [[['_route' => 'r2'], ['foo'], null, null, false, false, null]],
|
||||
70 => [[['_route' => 'r20'], ['foo'], null, null, false, false, null]],
|
||||
78 => [[['_route' => 'r200'], ['foo'], null, null, false, false, null]],
|
||||
78 => [
|
||||
[['_route' => 'r200'], ['foo'], null, null, false, false, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -28,6 +28,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
56 => [
|
||||
[['_route' => 'r1'], ['foo', 'foo'], null, null, false, true, null],
|
||||
[['_route' => 'r2'], ['foo', 'foo'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -109,7 +109,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec
|
||||
489 => [[['_route' => 'route16', 'var1' => 'val'], ['name'], null, null, false, true, null]],
|
||||
510 => [[['_route' => 'a'], [], null, null, false, false, null]],
|
||||
531 => [[['_route' => 'b'], ['var'], null, null, false, true, null]],
|
||||
549 => [[['_route' => 'c'], ['var'], null, null, false, true, null]],
|
||||
549 => [
|
||||
[['_route' => 'c'], ['var'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -24,7 +24,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
.')/?$}sD',
|
||||
];
|
||||
$this->dynamicRoutes = [
|
||||
27 => [[['_route' => 'dynamic'], ['var'], null, null, false, true, null]],
|
||||
27 => [
|
||||
[['_route' => 'dynamic'], ['var'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
$this->checkCondition = static function ($condition, $context, $request) {
|
||||
switch ($condition) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -36,7 +36,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec
|
||||
];
|
||||
$this->dynamicRoutes = [
|
||||
16 => [[['_route' => 'a_wildcard'], ['param'], null, null, false, true, null]],
|
||||
39 => [[['_route' => 'nested_wildcard'], ['param'], null, null, false, true, null]],
|
||||
39 => [
|
||||
[['_route' => 'nested_wildcard'], ['param'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -48,7 +48,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
183 => [[['_route' => 'regex_not_trailing_slash_no_methods'], ['param'], null, null, false, true, null]],
|
||||
211 => [[['_route' => 'regex_not_trailing_slash_GET_method'], ['param'], ['GET' => 0], null, false, true, null]],
|
||||
240 => [[['_route' => 'regex_not_trailing_slash_HEAD_method'], ['param'], ['HEAD' => 0], null, false, true, null]],
|
||||
269 => [[['_route' => 'regex_not_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, false, true, null]],
|
||||
269 => [
|
||||
[['_route' => 'regex_not_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\RedirectableUrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -48,7 +48,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec
|
||||
183 => [[['_route' => 'regex_not_trailing_slash_no_methods'], ['param'], null, null, false, true, null]],
|
||||
211 => [[['_route' => 'regex_not_trailing_slash_GET_method'], ['param'], ['GET' => 0], null, false, true, null]],
|
||||
240 => [[['_route' => 'regex_not_trailing_slash_HEAD_method'], ['param'], ['HEAD' => 0], null, false, true, null]],
|
||||
269 => [[['_route' => 'regex_not_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, false, true, null]],
|
||||
269 => [
|
||||
[['_route' => 'regex_not_trailing_slash_POST_method'], ['param'], ['POST' => 0], null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
@@ -28,7 +28,10 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
$this->dynamicRoutes = [
|
||||
11 => [[['_route' => 'a'], ['a'], null, null, false, true, null]],
|
||||
22 => [[['_route' => 'b'], ['a'], null, null, false, true, null]],
|
||||
33 => [[['_route' => 'c'], ['a'], null, null, false, true, null]],
|
||||
33 => [
|
||||
[['_route' => 'c'], ['a'], null, null, false, true, null],
|
||||
[null, null, null, null, false, false, 0],
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherTrait;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherTrait;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ use Symfony\Component\Routing\RequestContext;
|
||||
*/
|
||||
class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher
|
||||
{
|
||||
use PhpMatcherTrait;
|
||||
use CompiledUrlMatcherTrait;
|
||||
|
||||
public function __construct(RequestContext $context)
|
||||
{
|
||||
|
||||
10
vendor/symfony/routing/Tests/Fixtures/imported-with-defaults.php
vendored
Normal file
10
vendor/symfony/routing/Tests/Fixtures/imported-with-defaults.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||
|
||||
return function (RoutingConfigurator $routes) {
|
||||
$routes
|
||||
->add('one', '/one')
|
||||
->add('two', '/two')->defaults(['specific' => 'imported'])
|
||||
;
|
||||
};
|
||||
11
vendor/symfony/routing/Tests/Fixtures/imported-with-defaults.xml
vendored
Normal file
11
vendor/symfony/routing/Tests/Fixtures/imported-with-defaults.xml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<routes xmlns="http://symfony.com/schema/routing"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://symfony.com/schema/routing
|
||||
https://symfony.com/schema/routing/routing-1.0.xsd">
|
||||
|
||||
<route id="one" path="/one" />
|
||||
<route id="two" path="/two">
|
||||
<default key="specific">imported</default>
|
||||
</route>
|
||||
</routes>
|
||||
7
vendor/symfony/routing/Tests/Fixtures/imported-with-defaults.yml
vendored
Normal file
7
vendor/symfony/routing/Tests/Fixtures/imported-with-defaults.yml
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
one:
|
||||
path: /one
|
||||
|
||||
two:
|
||||
path: /two
|
||||
defaults:
|
||||
specific: imported
|
||||
11
vendor/symfony/routing/Tests/Fixtures/importer-with-defaults.php
vendored
Normal file
11
vendor/symfony/routing/Tests/Fixtures/importer-with-defaults.php
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||
|
||||
return function (RoutingConfigurator $routes) {
|
||||
$routes->import('imported-with-defaults.php')
|
||||
->prefix('/defaults')
|
||||
->locale('g_locale')
|
||||
->format('g_format')
|
||||
;
|
||||
};
|
||||
10
vendor/symfony/routing/Tests/Fixtures/importer-with-defaults.xml
vendored
Normal file
10
vendor/symfony/routing/Tests/Fixtures/importer-with-defaults.xml
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<routes xmlns="http://symfony.com/schema/routing"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://symfony.com/schema/routing
|
||||
https://symfony.com/schema/routing/routing-1.0.xsd">
|
||||
|
||||
<import resource="imported-with-defaults.xml" prefix="/defaults"
|
||||
locale="g_locale"
|
||||
format="g_format" />
|
||||
</routes>
|
||||
5
vendor/symfony/routing/Tests/Fixtures/importer-with-defaults.yml
vendored
Normal file
5
vendor/symfony/routing/Tests/Fixtures/importer-with-defaults.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
defaults:
|
||||
resource: imported-with-defaults.yml
|
||||
prefix: /defaults
|
||||
locale: g_locale
|
||||
format: g_format
|
||||
10
vendor/symfony/routing/Tests/Fixtures/localized/imported-with-utf8.php
vendored
Normal file
10
vendor/symfony/routing/Tests/Fixtures/localized/imported-with-utf8.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||
|
||||
return function (RoutingConfigurator $routes) {
|
||||
$routes
|
||||
->add('utf8_one', '/one')
|
||||
->add('utf8_two', '/two')
|
||||
;
|
||||
};
|
||||
8
vendor/symfony/routing/Tests/Fixtures/localized/imported-with-utf8.xml
vendored
Normal file
8
vendor/symfony/routing/Tests/Fixtures/localized/imported-with-utf8.xml
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<routes xmlns="http://symfony.com/schema/routing"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://symfony.com/schema/routing">
|
||||
|
||||
<route id="utf8_one" path="/one" />
|
||||
<route id="utf8_two" path="/two" />
|
||||
</routes>
|
||||
5
vendor/symfony/routing/Tests/Fixtures/localized/imported-with-utf8.yml
vendored
Normal file
5
vendor/symfony/routing/Tests/Fixtures/localized/imported-with-utf8.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
utf8_one:
|
||||
path: /one
|
||||
|
||||
utf8_two:
|
||||
path: /two
|
||||
7
vendor/symfony/routing/Tests/Fixtures/localized/importer-with-utf8.php
vendored
Normal file
7
vendor/symfony/routing/Tests/Fixtures/localized/importer-with-utf8.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||
|
||||
return function (RoutingConfigurator $routes) {
|
||||
$routes->import('imported-with-utf8.php')->utf8();
|
||||
};
|
||||
7
vendor/symfony/routing/Tests/Fixtures/localized/importer-with-utf8.xml
vendored
Normal file
7
vendor/symfony/routing/Tests/Fixtures/localized/importer-with-utf8.xml
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<routes xmlns="http://symfony.com/schema/routing"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://symfony.com/schema/routing
|
||||
https://symfony.com/schema/routing/routing-1.0.xsd">
|
||||
<import resource="imported-with-utf8.xml" utf8="true" />
|
||||
</routes>
|
||||
3
vendor/symfony/routing/Tests/Fixtures/localized/importer-with-utf8.yml
vendored
Normal file
3
vendor/symfony/routing/Tests/Fixtures/localized/importer-with-utf8.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
utf8_routes:
|
||||
resource: imported-with-utf8.yml
|
||||
utf8: true
|
||||
10
vendor/symfony/routing/Tests/Fixtures/localized/utf8.php
vendored
Normal file
10
vendor/symfony/routing/Tests/Fixtures/localized/utf8.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Symfony\Component\Routing\Loader\Configurator;
|
||||
|
||||
return function (RoutingConfigurator $routes) {
|
||||
$routes
|
||||
->add('some_route', '/')
|
||||
->add('some_utf8_route', '/utf8')->utf8()
|
||||
;
|
||||
};
|
||||
6
vendor/symfony/routing/Tests/Fixtures/localized/utf8.yml
vendored
Normal file
6
vendor/symfony/routing/Tests/Fixtures/localized/utf8.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
some_route:
|
||||
path: /
|
||||
|
||||
some_utf8_route:
|
||||
path: /utf8
|
||||
utf8: true
|
||||
240
vendor/symfony/routing/Tests/Generator/Dumper/CompiledUrlGeneratorDumperTest.php
vendored
Normal file
240
vendor/symfony/routing/Tests/Generator/Dumper/CompiledUrlGeneratorDumperTest.php
vendored
Normal file
@@ -0,0 +1,240 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Generator\Dumper;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Routing\Generator\CompiledUrlGenerator;
|
||||
use Symfony\Component\Routing\Generator\Dumper\CompiledUrlGeneratorDumper;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
class CompiledUrlGeneratorDumperTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var RouteCollection
|
||||
*/
|
||||
private $routeCollection;
|
||||
|
||||
/**
|
||||
* @var CompiledUrlGeneratorDumper
|
||||
*/
|
||||
private $generatorDumper;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $testTmpFilepath;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $largeTestTmpFilepath;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->routeCollection = new RouteCollection();
|
||||
$this->generatorDumper = new CompiledUrlGeneratorDumper($this->routeCollection);
|
||||
$this->testTmpFilepath = sys_get_temp_dir().'/php_generator.'.$this->getName().'.php';
|
||||
$this->largeTestTmpFilepath = sys_get_temp_dir().'/php_generator.'.$this->getName().'.large.php';
|
||||
@unlink($this->testTmpFilepath);
|
||||
@unlink($this->largeTestTmpFilepath);
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
parent::tearDown();
|
||||
|
||||
@unlink($this->testTmpFilepath);
|
||||
|
||||
$this->routeCollection = null;
|
||||
$this->generatorDumper = null;
|
||||
$this->testTmpFilepath = null;
|
||||
}
|
||||
|
||||
public function testDumpWithRoutes()
|
||||
{
|
||||
$this->routeCollection->add('Test', new Route('/testing/{foo}'));
|
||||
$this->routeCollection->add('Test2', new Route('/testing2'));
|
||||
|
||||
file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext('/app.php'));
|
||||
|
||||
$absoluteUrlWithParameter = $projectUrlGenerator->generate('Test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
$absoluteUrlWithoutParameter = $projectUrlGenerator->generate('Test2', [], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
$relativeUrlWithParameter = $projectUrlGenerator->generate('Test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
$relativeUrlWithoutParameter = $projectUrlGenerator->generate('Test2', [], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
|
||||
$this->assertEquals('http://localhost/app.php/testing/bar', $absoluteUrlWithParameter);
|
||||
$this->assertEquals('http://localhost/app.php/testing2', $absoluteUrlWithoutParameter);
|
||||
$this->assertEquals('/app.php/testing/bar', $relativeUrlWithParameter);
|
||||
$this->assertEquals('/app.php/testing2', $relativeUrlWithoutParameter);
|
||||
}
|
||||
|
||||
public function testDumpWithSimpleLocalizedRoutes()
|
||||
{
|
||||
$this->routeCollection->add('test', (new Route('/foo')));
|
||||
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
|
||||
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_locale', 'nl')->setDefault('_canonical_route', 'test'));
|
||||
|
||||
$code = $this->generatorDumper->dump();
|
||||
file_put_contents($this->testTmpFilepath, $code);
|
||||
|
||||
$context = new RequestContext('/app.php');
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, $context, null, 'en');
|
||||
|
||||
$urlWithDefaultLocale = $projectUrlGenerator->generate('test');
|
||||
$urlWithSpecifiedLocale = $projectUrlGenerator->generate('test', ['_locale' => 'nl']);
|
||||
$context->setParameter('_locale', 'en');
|
||||
$urlWithEnglishContext = $projectUrlGenerator->generate('test');
|
||||
$context->setParameter('_locale', 'nl');
|
||||
$urlWithDutchContext = $projectUrlGenerator->generate('test');
|
||||
|
||||
$this->assertEquals('/app.php/testing/is/fun', $urlWithDefaultLocale);
|
||||
$this->assertEquals('/app.php/testen/is/leuk', $urlWithSpecifiedLocale);
|
||||
$this->assertEquals('/app.php/testing/is/fun', $urlWithEnglishContext);
|
||||
$this->assertEquals('/app.php/testen/is/leuk', $urlWithDutchContext);
|
||||
|
||||
// test with full route name
|
||||
$this->assertEquals('/app.php/testing/is/fun', $projectUrlGenerator->generate('test.en'));
|
||||
|
||||
$context->setParameter('_locale', 'de_DE');
|
||||
// test that it fall backs to another route when there is no matching localized route
|
||||
$this->assertEquals('/app.php/foo', $projectUrlGenerator->generate('test'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
|
||||
* @expectedExceptionMessage Unable to generate a URL for the named route "test" as such route does not exist.
|
||||
*/
|
||||
public function testDumpWithRouteNotFoundLocalizedRoutes()
|
||||
{
|
||||
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_locale', 'en')->setDefault('_canonical_route', 'test'));
|
||||
|
||||
$code = $this->generatorDumper->dump();
|
||||
file_put_contents($this->testTmpFilepath, $code);
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext('/app.php'), null, 'pl_PL');
|
||||
$projectUrlGenerator->generate('test');
|
||||
}
|
||||
|
||||
public function testDumpWithFallbackLocaleLocalizedRoutes()
|
||||
{
|
||||
$this->routeCollection->add('test.en', (new Route('/testing/is/fun'))->setDefault('_canonical_route', 'test'));
|
||||
$this->routeCollection->add('test.nl', (new Route('/testen/is/leuk'))->setDefault('_canonical_route', 'test'));
|
||||
$this->routeCollection->add('test.fr', (new Route('/tester/est/amusant'))->setDefault('_canonical_route', 'test'));
|
||||
|
||||
$code = $this->generatorDumper->dump();
|
||||
file_put_contents($this->testTmpFilepath, $code);
|
||||
|
||||
$context = new RequestContext('/app.php');
|
||||
$context->setParameter('_locale', 'en_GB');
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, $context, null, null);
|
||||
|
||||
// test with context _locale
|
||||
$this->assertEquals('/app.php/testing/is/fun', $projectUrlGenerator->generate('test'));
|
||||
// test with parameters _locale
|
||||
$this->assertEquals('/app.php/testen/is/leuk', $projectUrlGenerator->generate('test', ['_locale' => 'nl_BE']));
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext('/app.php'), null, 'fr_CA');
|
||||
// test with default locale
|
||||
$this->assertEquals('/app.php/tester/est/amusant', $projectUrlGenerator->generate('test'));
|
||||
}
|
||||
|
||||
public function testDumpWithTooManyRoutes()
|
||||
{
|
||||
$this->routeCollection->add('Test', new Route('/testing/{foo}'));
|
||||
for ($i = 0; $i < 32769; ++$i) {
|
||||
$this->routeCollection->add('route_'.$i, new Route('/route_'.$i));
|
||||
}
|
||||
$this->routeCollection->add('Test2', new Route('/testing2'));
|
||||
|
||||
file_put_contents($this->largeTestTmpFilepath, $this->generatorDumper->dump());
|
||||
$this->routeCollection = $this->generatorDumper = null;
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->largeTestTmpFilepath, new RequestContext('/app.php'));
|
||||
|
||||
$absoluteUrlWithParameter = $projectUrlGenerator->generate('Test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
$absoluteUrlWithoutParameter = $projectUrlGenerator->generate('Test2', [], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
$relativeUrlWithParameter = $projectUrlGenerator->generate('Test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
$relativeUrlWithoutParameter = $projectUrlGenerator->generate('Test2', [], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
|
||||
$this->assertEquals('http://localhost/app.php/testing/bar', $absoluteUrlWithParameter);
|
||||
$this->assertEquals('http://localhost/app.php/testing2', $absoluteUrlWithoutParameter);
|
||||
$this->assertEquals('/app.php/testing/bar', $relativeUrlWithParameter);
|
||||
$this->assertEquals('/app.php/testing2', $relativeUrlWithoutParameter);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
*/
|
||||
public function testDumpWithoutRoutes()
|
||||
{
|
||||
file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext('/app.php'));
|
||||
|
||||
$projectUrlGenerator->generate('Test', []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
|
||||
*/
|
||||
public function testGenerateNonExistingRoute()
|
||||
{
|
||||
$this->routeCollection->add('Test', new Route('/test'));
|
||||
|
||||
file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext());
|
||||
$url = $projectUrlGenerator->generate('NonExisting', []);
|
||||
}
|
||||
|
||||
public function testDumpForRouteWithDefaults()
|
||||
{
|
||||
$this->routeCollection->add('Test', new Route('/testing/{foo}', ['foo' => 'bar']));
|
||||
|
||||
file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext());
|
||||
$url = $projectUrlGenerator->generate('Test', []);
|
||||
|
||||
$this->assertEquals('/testing', $url);
|
||||
}
|
||||
|
||||
public function testDumpWithSchemeRequirement()
|
||||
{
|
||||
$this->routeCollection->add('Test1', new Route('/testing', [], [], [], '', ['ftp', 'https']));
|
||||
|
||||
file_put_contents($this->testTmpFilepath, $this->generatorDumper->dump());
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext('/app.php'));
|
||||
|
||||
$absoluteUrl = $projectUrlGenerator->generate('Test1', [], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
$relativeUrl = $projectUrlGenerator->generate('Test1', [], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
|
||||
$this->assertEquals('ftp://localhost/app.php/testing', $absoluteUrl);
|
||||
$this->assertEquals('ftp://localhost/app.php/testing', $relativeUrl);
|
||||
|
||||
$projectUrlGenerator = new CompiledUrlGenerator(require $this->testTmpFilepath, new RequestContext('/app.php', 'GET', 'localhost', 'https'));
|
||||
|
||||
$absoluteUrl = $projectUrlGenerator->generate('Test1', [], UrlGeneratorInterface::ABSOLUTE_URL);
|
||||
$relativeUrl = $projectUrlGenerator->generate('Test1', [], UrlGeneratorInterface::ABSOLUTE_PATH);
|
||||
|
||||
$this->assertEquals('https://localhost/app.php/testing', $absoluteUrl);
|
||||
$this->assertEquals('/app.php/testing', $relativeUrl);
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,9 @@ use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
class PhpGeneratorDumperTest extends TestCase
|
||||
{
|
||||
/**
|
||||
|
||||
@@ -302,7 +302,7 @@ class UrlGeneratorTest extends TestCase
|
||||
$routes = $this->getRoutes('test', new Route('/testing/{foo}', ['foo' => '1'], ['foo' => 'd+']));
|
||||
$generator = $this->getGenerator($routes);
|
||||
$generator->setStrictRequirements(false);
|
||||
$this->assertNull($generator->generate('test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
$this->assertSame('', $generator->generate('test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
}
|
||||
|
||||
public function testGenerateForRouteWithInvalidOptionalParameterNonStrictWithLogger()
|
||||
@@ -313,7 +313,7 @@ class UrlGeneratorTest extends TestCase
|
||||
->method('error');
|
||||
$generator = $this->getGenerator($routes, [], $logger);
|
||||
$generator->setStrictRequirements(false);
|
||||
$this->assertNull($generator->generate('test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
$this->assertSame('', $generator->generate('test', ['foo' => 'bar'], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
}
|
||||
|
||||
public function testGenerateForRouteWithInvalidParameterButDisabledRequirementsCheck()
|
||||
@@ -436,7 +436,7 @@ class UrlGeneratorTest extends TestCase
|
||||
{
|
||||
$expectedPath = '/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
||||
.'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
||||
.'?query=%40%3A%5B%5D/%28%29%2A%27%22%20%2B%2C%3B-._~%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id';
|
||||
.'?query=@:%5B%5D/%28%29*%27%22%20%2B,;-._~%26%24%3C%3E%7C%7B%7D%25%5C%5E%60!?foo%3Dbar%23id';
|
||||
|
||||
// This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986)
|
||||
// and other special ASCII chars. These chars are tested as static text path, variable path and query param.
|
||||
@@ -467,7 +467,7 @@ class UrlGeneratorTest extends TestCase
|
||||
|
||||
// The default requirement for 'x' should not allow the separator '.' in this case because it would otherwise match everything
|
||||
// and following optional variables like _format could never match.
|
||||
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\InvalidParameterException');
|
||||
$this->expectException('Symfony\Component\Routing\Exception\InvalidParameterException');
|
||||
$generator->generate('test', ['x' => 'do.t', 'y' => '123', 'z' => 'bar', '_format' => 'xml']);
|
||||
}
|
||||
|
||||
@@ -496,6 +496,27 @@ class UrlGeneratorTest extends TestCase
|
||||
$this->assertSame('/app.php/index.mobile.html', $generator->generate('test', ['page' => 'index', '_format' => 'mobile.html']));
|
||||
}
|
||||
|
||||
public function testImportantVariable()
|
||||
{
|
||||
$routes = $this->getRoutes('test', (new Route('/{page}.{!_format}'))->addDefaults(['_format' => 'mobile.html']));
|
||||
$generator = $this->getGenerator($routes);
|
||||
|
||||
$this->assertSame('/app.php/index.xml', $generator->generate('test', ['page' => 'index', '_format' => 'xml']));
|
||||
$this->assertSame('/app.php/index.mobile.html', $generator->generate('test', ['page' => 'index', '_format' => 'mobile.html']));
|
||||
$this->assertSame('/app.php/index.mobile.html', $generator->generate('test', ['page' => 'index']));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\MissingMandatoryParametersException
|
||||
*/
|
||||
public function testImportantVariableWithNoDefault()
|
||||
{
|
||||
$routes = $this->getRoutes('test', new Route('/{page}.{!_format}'));
|
||||
$generator = $this->getGenerator($routes);
|
||||
|
||||
$generator->generate('test', ['page' => 'index']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\InvalidParameterException
|
||||
*/
|
||||
@@ -567,7 +588,7 @@ class UrlGeneratorTest extends TestCase
|
||||
$routes = $this->getRoutes('test', new Route('/', [], ['foo' => 'bar'], [], '{foo}.example.com'));
|
||||
$generator = $this->getGenerator($routes);
|
||||
$generator->setStrictRequirements(false);
|
||||
$this->assertNull($generator->generate('test', ['foo' => 'baz'], UrlGeneratorInterface::ABSOLUTE_PATH));
|
||||
$this->assertSame('', $generator->generate('test', ['foo' => 'baz'], UrlGeneratorInterface::ABSOLUTE_PATH));
|
||||
}
|
||||
|
||||
public function testHostIsCaseInsensitive()
|
||||
|
||||
@@ -20,6 +20,7 @@ use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\AbstractClassCon
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\ActionPathController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\DefaultValueController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\ExplicitLocalizedActionPathController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\GlobalDefaultsClass;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\InvokableController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\InvokableLocalizedController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\LocalizedActionPathController;
|
||||
@@ -35,6 +36,7 @@ use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\PrefixedActionLo
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\PrefixedActionPathController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RequirementsWithoutPlaceholderNameController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\RouteWithPrefixController;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\AnnotationFixtures\Utf8ActionControllers;
|
||||
|
||||
class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest
|
||||
{
|
||||
@@ -159,6 +161,32 @@ class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest
|
||||
$this->assertEquals('/the/path', $routes->get('post.en')->getPath());
|
||||
}
|
||||
|
||||
public function testGlobalDefaultsRoutesLoadWithAnnotation()
|
||||
{
|
||||
$routes = $this->loader->load(GlobalDefaultsClass::class);
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$specificLocaleRoute = $routes->get('specific_locale');
|
||||
|
||||
$this->assertSame('/defaults/specific-locale', $specificLocaleRoute->getPath());
|
||||
$this->assertSame('s_locale', $specificLocaleRoute->getDefault('_locale'));
|
||||
$this->assertSame('g_format', $specificLocaleRoute->getDefault('_format'));
|
||||
|
||||
$specificFormatRoute = $routes->get('specific_format');
|
||||
|
||||
$this->assertSame('/defaults/specific-format', $specificFormatRoute->getPath());
|
||||
$this->assertSame('g_locale', $specificFormatRoute->getDefault('_locale'));
|
||||
$this->assertSame('s_format', $specificFormatRoute->getDefault('_format'));
|
||||
}
|
||||
|
||||
public function testUtf8RoutesLoadWithAnnotation()
|
||||
{
|
||||
$routes = $this->loader->load(Utf8ActionControllers::class);
|
||||
$this->assertCount(2, $routes);
|
||||
$this->assertTrue($routes->get('one')->getOption('utf8'), 'The route must accept utf8');
|
||||
$this->assertFalse($routes->get('two')->getOption('utf8'), 'The route must not accept utf8');
|
||||
}
|
||||
|
||||
public function testRouteWithPathWithPrefix()
|
||||
{
|
||||
$routes = $this->loader->load(PrefixedActionPathController::class);
|
||||
@@ -278,6 +306,34 @@ class AnnotationClassLoaderTest extends AbstractAnnotationLoaderTest
|
||||
$this->assertEquals('/nl/suffix', $routes->get('action.nl')->getPath());
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires function mb_strtolower
|
||||
*/
|
||||
public function testDefaultRouteName()
|
||||
{
|
||||
$methodRouteData = [
|
||||
'name' => null,
|
||||
];
|
||||
|
||||
$reader = $this->getReader();
|
||||
$reader
|
||||
->expects($this->once())
|
||||
->method('getMethodAnnotations')
|
||||
->will($this->returnValue([new RouteAnnotation($methodRouteData)]))
|
||||
;
|
||||
|
||||
$loader = new class($reader) extends AnnotationClassLoader {
|
||||
protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, $annot)
|
||||
{
|
||||
}
|
||||
};
|
||||
$routeCollection = $loader->load('Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\EncodingClass');
|
||||
|
||||
$defaultName = array_keys($routeCollection->all())[0];
|
||||
|
||||
$this->assertSame($defaultName, 'symfony_component_routing_tests_fixtures_annotatedclasses_encodingclass_routeàction');
|
||||
}
|
||||
|
||||
public function testLoadingRouteWithPrefix()
|
||||
{
|
||||
$routes = $this->loader->load(RouteWithPrefixController::class);
|
||||
|
||||
@@ -29,7 +29,7 @@ class AnnotationDirectoryLoaderTest extends AbstractAnnotationLoaderTest
|
||||
|
||||
public function testLoad()
|
||||
{
|
||||
$this->reader->expects($this->exactly(3))->method('getClassAnnotation');
|
||||
$this->reader->expects($this->exactly(4))->method('getClassAnnotation');
|
||||
|
||||
$this->reader
|
||||
->expects($this->any())
|
||||
@@ -52,6 +52,7 @@ class AnnotationDirectoryLoaderTest extends AbstractAnnotationLoaderTest
|
||||
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BarClass',
|
||||
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\BazClass',
|
||||
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\FooClass',
|
||||
'Symfony\Component\Routing\Tests\Fixtures\AnnotatedClasses\EncodingClass',
|
||||
]);
|
||||
|
||||
$this->reader
|
||||
|
||||
@@ -70,7 +70,7 @@ class ObjectRouteLoaderTest extends TestCase
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @dataProvider getBadResourceStrings
|
||||
*/
|
||||
public function testExceptionWithoutSyntax($resourceString)
|
||||
public function testExceptionWithoutSyntax(string $resourceString): void
|
||||
{
|
||||
$loader = new ObjectRouteLoaderForTest();
|
||||
$loader->load($resourceString);
|
||||
@@ -79,8 +79,12 @@ class ObjectRouteLoaderTest extends TestCase
|
||||
public function getBadResourceStrings()
|
||||
{
|
||||
return [
|
||||
['Foo'],
|
||||
['Foo:Bar:baz'],
|
||||
['Foo::Bar::baz'],
|
||||
['Foo:'],
|
||||
['Foo::'],
|
||||
[':Foo'],
|
||||
['::Foo'],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -84,6 +84,80 @@ class PhpFileLoaderTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
public function testLoadingRouteWithDefaults()
|
||||
{
|
||||
$loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures']));
|
||||
$routes = $loader->load('defaults.php');
|
||||
|
||||
$this->assertCount(1, $routes);
|
||||
|
||||
$defaultsRoute = $routes->get('defaults');
|
||||
|
||||
$this->assertSame('/defaults', $defaultsRoute->getPath());
|
||||
$this->assertSame('en', $defaultsRoute->getDefault('_locale'));
|
||||
$this->assertSame('html', $defaultsRoute->getDefault('_format'));
|
||||
}
|
||||
|
||||
public function testLoadingImportedRoutesWithDefaults()
|
||||
{
|
||||
$loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures']));
|
||||
$routes = $loader->load('importer-with-defaults.php');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('one', $localeRoute = new Route('/defaults/one'));
|
||||
$localeRoute->setDefault('_locale', 'g_locale');
|
||||
$localeRoute->setDefault('_format', 'g_format');
|
||||
$expectedRoutes->add('two', $formatRoute = new Route('/defaults/two'));
|
||||
$formatRoute->setDefault('_locale', 'g_locale');
|
||||
$formatRoute->setDefault('_format', 'g_format');
|
||||
$formatRoute->setDefault('specific', 'imported');
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/imported-with-defaults.php'));
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/importer-with-defaults.php'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingUtf8Route()
|
||||
{
|
||||
$loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
$routes = $loader->load('utf8.php');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('some_route', new Route('/'));
|
||||
|
||||
$expectedRoutes->add('some_utf8_route', $route = new Route('/utf8'));
|
||||
$route->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/utf8.php'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingUtf8ImportedRoutes()
|
||||
{
|
||||
$loader = new PhpFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
$routes = $loader->load('importer-with-utf8.php');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('utf8_one', $one = new Route('/one'));
|
||||
$one->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->add('utf8_two', $two = new Route('/two'));
|
||||
$two->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/imported-with-utf8.php'));
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/importer-with-utf8.php'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testRoutingConfigurator()
|
||||
{
|
||||
$locator = new FileLocator([__DIR__.'/../Fixtures']);
|
||||
|
||||
@@ -13,7 +13,10 @@ namespace Symfony\Component\Routing\Tests\Loader;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
use Symfony\Component\Config\Resource\FileResource;
|
||||
use Symfony\Component\Routing\Loader\XmlFileLoader;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
use Symfony\Component\Routing\Tests\Fixtures\CustomXmlFileLoader;
|
||||
|
||||
class XmlFileLoaderTest extends TestCase
|
||||
@@ -83,24 +86,79 @@ class XmlFileLoaderTest extends TestCase
|
||||
}
|
||||
}
|
||||
|
||||
public function testUtf8Route()
|
||||
public function testLoadingRouteWithDefaults()
|
||||
{
|
||||
$loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures']));
|
||||
$routes = $loader->load('defaults.xml');
|
||||
|
||||
$this->assertCount(1, $routes);
|
||||
|
||||
$defaultsRoute = $routes->get('defaults');
|
||||
|
||||
$this->assertSame('/defaults', $defaultsRoute->getPath());
|
||||
$this->assertSame('en', $defaultsRoute->getDefault('_locale'));
|
||||
$this->assertSame('html', $defaultsRoute->getDefault('_format'));
|
||||
}
|
||||
|
||||
public function testLoadingImportedRoutesWithDefaults()
|
||||
{
|
||||
$loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures']));
|
||||
$routes = $loader->load('importer-with-defaults.xml');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('one', $localeRoute = new Route('/defaults/one'));
|
||||
$localeRoute->setDefault('_locale', 'g_locale');
|
||||
$localeRoute->setDefault('_format', 'g_format');
|
||||
$expectedRoutes->add('two', $formatRoute = new Route('/defaults/two'));
|
||||
$formatRoute->setDefault('_locale', 'g_locale');
|
||||
$formatRoute->setDefault('_format', 'g_format');
|
||||
$formatRoute->setDefault('specific', 'imported');
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/imported-with-defaults.xml'));
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/importer-with-defaults.xml'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingUtf8Route()
|
||||
{
|
||||
$loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
$routeCollection = $loader->load('utf8.xml');
|
||||
$routes = $routeCollection->all();
|
||||
$routes = $loader->load('utf8.xml');
|
||||
|
||||
$this->assertCount(2, $routes, 'Two routes are loaded');
|
||||
$this->assertContainsOnly('Symfony\Component\Routing\Route', $routes);
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$utf8Route = $routeCollection->get('app_utf8');
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('app_utf8', $route = new Route('/utf8'));
|
||||
$route->setOption('utf8', true);
|
||||
|
||||
$this->assertSame('/utf8', $utf8Route->getPath());
|
||||
$this->assertTrue($utf8Route->getOption('utf8'), 'Must be utf8');
|
||||
$expectedRoutes->add('app_no_utf8', $route = new Route('/no-utf8'));
|
||||
$route->setOption('utf8', false);
|
||||
|
||||
$noUtf8Route = $routeCollection->get('app_no_utf8');
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/utf8.xml'));
|
||||
|
||||
$this->assertSame('/no-utf8', $noUtf8Route->getPath());
|
||||
$this->assertFalse($noUtf8Route->getOption('utf8'), 'Must not be utf8');
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingUtf8ImportedRoutes()
|
||||
{
|
||||
$loader = new XmlFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
$routes = $loader->load('importer-with-utf8.xml');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('utf8_one', $one = new Route('/one'));
|
||||
$one->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->add('utf8_two', $two = new Route('/two'));
|
||||
$two->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/imported-with-utf8.xml'));
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/importer-with-utf8.xml'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadLocalized()
|
||||
|
||||
@@ -15,6 +15,8 @@ use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Config\FileLocator;
|
||||
use Symfony\Component\Config\Resource\FileResource;
|
||||
use Symfony\Component\Routing\Loader\YamlFileLoader;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
class YamlFileLoaderTest extends TestCase
|
||||
{
|
||||
@@ -222,6 +224,80 @@ class YamlFileLoaderTest extends TestCase
|
||||
$loader->load('http://remote.com/here.yml');
|
||||
}
|
||||
|
||||
public function testLoadingRouteWithDefaults()
|
||||
{
|
||||
$loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures']));
|
||||
$routes = $loader->load('defaults.yml');
|
||||
|
||||
$this->assertCount(1, $routes);
|
||||
|
||||
$defaultsRoute = $routes->get('defaults');
|
||||
|
||||
$this->assertSame('/defaults', $defaultsRoute->getPath());
|
||||
$this->assertSame('en', $defaultsRoute->getDefault('_locale'));
|
||||
$this->assertSame('html', $defaultsRoute->getDefault('_format'));
|
||||
}
|
||||
|
||||
public function testLoadingImportedRoutesWithDefaults()
|
||||
{
|
||||
$loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures']));
|
||||
$routes = $loader->load('importer-with-defaults.yml');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('one', $localeRoute = new Route('/defaults/one'));
|
||||
$localeRoute->setDefault('_locale', 'g_locale');
|
||||
$localeRoute->setDefault('_format', 'g_format');
|
||||
$expectedRoutes->add('two', $formatRoute = new Route('/defaults/two'));
|
||||
$formatRoute->setDefault('_locale', 'g_locale');
|
||||
$formatRoute->setDefault('_format', 'g_format');
|
||||
$formatRoute->setDefault('specific', 'imported');
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/imported-with-defaults.yml'));
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/importer-with-defaults.yml'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingUtf8Route()
|
||||
{
|
||||
$loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
$routes = $loader->load('utf8.yml');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('some_route', new Route('/'));
|
||||
|
||||
$expectedRoutes->add('some_utf8_route', $route = new Route('/utf8'));
|
||||
$route->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/utf8.yml'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingUtf8ImportedRoutes()
|
||||
{
|
||||
$loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
$routes = $loader->load('importer-with-utf8.yml');
|
||||
|
||||
$this->assertCount(2, $routes);
|
||||
|
||||
$expectedRoutes = new RouteCollection();
|
||||
$expectedRoutes->add('utf8_one', $one = new Route('/one'));
|
||||
$one->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->add('utf8_two', $two = new Route('/two'));
|
||||
$two->setOption('utf8', true);
|
||||
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/imported-with-utf8.yml'));
|
||||
$expectedRoutes->addResource(new FileResource(__DIR__.'/../Fixtures/localized/importer-with-utf8.yml'));
|
||||
|
||||
$this->assertEquals($expectedRoutes, $routes);
|
||||
}
|
||||
|
||||
public function testLoadingLocalizedRoute()
|
||||
{
|
||||
$loader = new YamlFileLoader(new FileLocator([__DIR__.'/../Fixtures/localized']));
|
||||
|
||||
40
vendor/symfony/routing/Tests/Matcher/CompiledRedirectableUrlMatcherTest.php
vendored
Normal file
40
vendor/symfony/routing/Tests/Matcher/CompiledRedirectableUrlMatcherTest.php
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Matcher;
|
||||
|
||||
use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||||
use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
class CompiledRedirectableUrlMatcherTest extends RedirectableUrlMatcherTest
|
||||
{
|
||||
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
|
||||
{
|
||||
$dumper = new CompiledUrlMatcherDumper($routes);
|
||||
$compiledRoutes = $dumper->getCompiledRoutes();
|
||||
|
||||
return $this->getMockBuilder(TestCompiledRedirectableUrlMatcher::class)
|
||||
->setConstructorArgs([$compiledRoutes, $context ?: new RequestContext()])
|
||||
->setMethods(['redirect'])
|
||||
->getMock();
|
||||
}
|
||||
}
|
||||
|
||||
class TestCompiledRedirectableUrlMatcher extends CompiledUrlMatcher implements RedirectableUrlMatcherInterface
|
||||
{
|
||||
public function redirect($path, $route, $scheme = null)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
27
vendor/symfony/routing/Tests/Matcher/CompiledUrlMatcherTest.php
vendored
Normal file
27
vendor/symfony/routing/Tests/Matcher/CompiledUrlMatcherTest.php
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Matcher;
|
||||
|
||||
use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
class CompiledUrlMatcherTest extends UrlMatcherTest
|
||||
{
|
||||
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
|
||||
{
|
||||
$dumper = new CompiledUrlMatcherDumper($routes);
|
||||
|
||||
return new CompiledUrlMatcher($dumper->getCompiledRoutes(), $context ?: new RequestContext());
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,9 @@ use Symfony\Component\Routing\Matcher\UrlMatcher;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
class DumpedRedirectableUrlMatcherTest extends RedirectableUrlMatcherTest
|
||||
{
|
||||
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
|
||||
|
||||
@@ -15,6 +15,9 @@ use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
class DumpedUrlMatcherTest extends UrlMatcherTest
|
||||
{
|
||||
protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null)
|
||||
|
||||
496
vendor/symfony/routing/Tests/Matcher/Dumper/CompiledUrlMatcherDumperTest.php
vendored
Normal file
496
vendor/symfony/routing/Tests/Matcher/Dumper/CompiledUrlMatcherDumperTest.php
vendored
Normal file
@@ -0,0 +1,496 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Component\Routing\Tests\Matcher\Dumper;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
|
||||
use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
|
||||
use Symfony\Component\Routing\Matcher\RedirectableUrlMatcherInterface;
|
||||
use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
class CompiledUrlMatcherDumperTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $dumpPath;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->dumpPath = sys_get_temp_dir().\DIRECTORY_SEPARATOR.'php_matcher.'.uniqid('CompiledUrlMatcher').'.php';
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
{
|
||||
parent::tearDown();
|
||||
|
||||
@unlink($this->dumpPath);
|
||||
}
|
||||
|
||||
public function testRedirectPreservesUrlEncoding()
|
||||
{
|
||||
$collection = new RouteCollection();
|
||||
$collection->add('foo', new Route('/foo:bar/'));
|
||||
|
||||
$matcher = $this->generateDumpedMatcher($collection);
|
||||
$matcher->expects($this->once())->method('redirect')->with('/foo%3Abar/', 'foo')->willReturn([]);
|
||||
|
||||
$matcher->match('/foo%3Abar');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getRouteCollections
|
||||
*/
|
||||
public function testDump(RouteCollection $collection, $fixture)
|
||||
{
|
||||
$basePath = __DIR__.'/../../Fixtures/dumper/';
|
||||
|
||||
$dumper = new CompiledUrlMatcherDumper($collection);
|
||||
$this->assertStringEqualsFile($basePath.$fixture, $dumper->dump());
|
||||
}
|
||||
|
||||
public function getRouteCollections()
|
||||
{
|
||||
/* test case 1 */
|
||||
|
||||
$collection = new RouteCollection();
|
||||
|
||||
$collection->add('overridden', new Route('/overridden'));
|
||||
|
||||
// defaults and requirements
|
||||
$collection->add('foo', new Route(
|
||||
'/foo/{bar}',
|
||||
['def' => 'test'],
|
||||
['bar' => 'baz|symfony']
|
||||
));
|
||||
// method requirement
|
||||
$collection->add('bar', new Route(
|
||||
'/bar/{foo}',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['GET', 'head']
|
||||
));
|
||||
// GET method requirement automatically adds HEAD as valid
|
||||
$collection->add('barhead', new Route(
|
||||
'/barhead/{foo}',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['GET']
|
||||
));
|
||||
// simple
|
||||
$collection->add('baz', new Route(
|
||||
'/test/baz'
|
||||
));
|
||||
// simple with extension
|
||||
$collection->add('baz2', new Route(
|
||||
'/test/baz.html'
|
||||
));
|
||||
// trailing slash
|
||||
$collection->add('baz3', new Route(
|
||||
'/test/baz3/'
|
||||
));
|
||||
// trailing slash with variable
|
||||
$collection->add('baz4', new Route(
|
||||
'/test/{foo}/'
|
||||
));
|
||||
// trailing slash and method
|
||||
$collection->add('baz5', new Route(
|
||||
'/test/{foo}/',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['post']
|
||||
));
|
||||
// complex name
|
||||
$collection->add('baz.baz6', new Route(
|
||||
'/test/{foo}/',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['put']
|
||||
));
|
||||
// defaults without variable
|
||||
$collection->add('foofoo', new Route(
|
||||
'/foofoo',
|
||||
['def' => 'test']
|
||||
));
|
||||
// pattern with quotes
|
||||
$collection->add('quoter', new Route(
|
||||
'/{quoter}',
|
||||
[],
|
||||
['quoter' => '[\']+']
|
||||
));
|
||||
// space in pattern
|
||||
$collection->add('space', new Route(
|
||||
'/spa ce'
|
||||
));
|
||||
|
||||
// prefixes
|
||||
$collection1 = new RouteCollection();
|
||||
$collection1->add('overridden', new Route('/overridden1'));
|
||||
$collection1->add('foo1', (new Route('/{foo}'))->setMethods('PUT'));
|
||||
$collection1->add('bar1', new Route('/{bar}'));
|
||||
$collection1->addPrefix('/b\'b');
|
||||
$collection2 = new RouteCollection();
|
||||
$collection2->addCollection($collection1);
|
||||
$collection2->add('overridden', new Route('/{var}', [], ['var' => '.*']));
|
||||
$collection1 = new RouteCollection();
|
||||
$collection1->add('foo2', new Route('/{foo1}'));
|
||||
$collection1->add('bar2', new Route('/{bar1}'));
|
||||
$collection1->addPrefix('/b\'b');
|
||||
$collection2->addCollection($collection1);
|
||||
$collection2->addPrefix('/a');
|
||||
$collection->addCollection($collection2);
|
||||
|
||||
// overridden through addCollection() and multiple sub-collections with no own prefix
|
||||
$collection1 = new RouteCollection();
|
||||
$collection1->add('overridden2', new Route('/old'));
|
||||
$collection1->add('helloWorld', new Route('/hello/{who}', ['who' => 'World!']));
|
||||
$collection2 = new RouteCollection();
|
||||
$collection3 = new RouteCollection();
|
||||
$collection3->add('overridden2', new Route('/new'));
|
||||
$collection3->add('hey', new Route('/hey/'));
|
||||
$collection2->addCollection($collection3);
|
||||
$collection1->addCollection($collection2);
|
||||
$collection1->addPrefix('/multi');
|
||||
$collection->addCollection($collection1);
|
||||
|
||||
// "dynamic" prefix
|
||||
$collection1 = new RouteCollection();
|
||||
$collection1->add('foo3', new Route('/{foo}'));
|
||||
$collection1->add('bar3', new Route('/{bar}'));
|
||||
$collection1->addPrefix('/b');
|
||||
$collection1->addPrefix('{_locale}');
|
||||
$collection->addCollection($collection1);
|
||||
|
||||
// route between collections
|
||||
$collection->add('ababa', new Route('/ababa'));
|
||||
|
||||
// collection with static prefix but only one route
|
||||
$collection1 = new RouteCollection();
|
||||
$collection1->add('foo4', new Route('/{foo}'));
|
||||
$collection1->addPrefix('/aba');
|
||||
$collection->addCollection($collection1);
|
||||
|
||||
// prefix and host
|
||||
|
||||
$collection1 = new RouteCollection();
|
||||
|
||||
$route1 = new Route('/route1', [], [], [], 'a.example.com');
|
||||
$collection1->add('route1', $route1);
|
||||
|
||||
$route2 = new Route('/c2/route2', [], [], [], 'a.example.com');
|
||||
$collection1->add('route2', $route2);
|
||||
|
||||
$route3 = new Route('/c2/route3', [], [], [], 'b.example.com');
|
||||
$collection1->add('route3', $route3);
|
||||
|
||||
$route4 = new Route('/route4', [], [], [], 'a.example.com');
|
||||
$collection1->add('route4', $route4);
|
||||
|
||||
$route5 = new Route('/route5', [], [], [], 'c.example.com');
|
||||
$collection1->add('route5', $route5);
|
||||
|
||||
$route6 = new Route('/route6', [], [], [], null);
|
||||
$collection1->add('route6', $route6);
|
||||
|
||||
$collection->addCollection($collection1);
|
||||
|
||||
// host and variables
|
||||
|
||||
$collection1 = new RouteCollection();
|
||||
|
||||
$route11 = new Route('/route11', [], [], [], '{var1}.example.com');
|
||||
$collection1->add('route11', $route11);
|
||||
|
||||
$route12 = new Route('/route12', ['var1' => 'val'], [], [], '{var1}.example.com');
|
||||
$collection1->add('route12', $route12);
|
||||
|
||||
$route13 = new Route('/route13/{name}', [], [], [], '{var1}.example.com');
|
||||
$collection1->add('route13', $route13);
|
||||
|
||||
$route14 = new Route('/route14/{name}', ['var1' => 'val'], [], [], '{var1}.example.com');
|
||||
$collection1->add('route14', $route14);
|
||||
|
||||
$route15 = new Route('/route15/{name}', [], [], [], 'c.example.com');
|
||||
$collection1->add('route15', $route15);
|
||||
|
||||
$route16 = new Route('/route16/{name}', ['var1' => 'val'], [], [], null);
|
||||
$collection1->add('route16', $route16);
|
||||
|
||||
$route17 = new Route('/route17', [], [], [], null);
|
||||
$collection1->add('route17', $route17);
|
||||
|
||||
$collection->addCollection($collection1);
|
||||
|
||||
// multiple sub-collections with a single route and a prefix each
|
||||
$collection1 = new RouteCollection();
|
||||
$collection1->add('a', new Route('/a...'));
|
||||
$collection2 = new RouteCollection();
|
||||
$collection2->add('b', new Route('/{var}'));
|
||||
$collection3 = new RouteCollection();
|
||||
$collection3->add('c', new Route('/{var}'));
|
||||
$collection3->addPrefix('/c');
|
||||
$collection2->addCollection($collection3);
|
||||
$collection2->addPrefix('/b');
|
||||
$collection1->addCollection($collection2);
|
||||
$collection1->addPrefix('/a');
|
||||
$collection->addCollection($collection1);
|
||||
|
||||
/* test case 2 */
|
||||
|
||||
$redirectCollection = clone $collection;
|
||||
|
||||
// force HTTPS redirection
|
||||
$redirectCollection->add('secure', new Route(
|
||||
'/secure',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
['https']
|
||||
));
|
||||
|
||||
// force HTTP redirection
|
||||
$redirectCollection->add('nonsecure', new Route(
|
||||
'/nonsecure',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
['http']
|
||||
));
|
||||
|
||||
/* test case 3 */
|
||||
|
||||
$rootprefixCollection = new RouteCollection();
|
||||
$rootprefixCollection->add('static', new Route('/test'));
|
||||
$rootprefixCollection->add('dynamic', new Route('/{var}'));
|
||||
$rootprefixCollection->addPrefix('rootprefix');
|
||||
$route = new Route('/with-condition');
|
||||
$route->setCondition('context.getMethod() == "GET"');
|
||||
$rootprefixCollection->add('with-condition', $route);
|
||||
|
||||
/* test case 4 */
|
||||
$headMatchCasesCollection = new RouteCollection();
|
||||
$headMatchCasesCollection->add('just_head', new Route(
|
||||
'/just_head',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['HEAD']
|
||||
));
|
||||
$headMatchCasesCollection->add('head_and_get', new Route(
|
||||
'/head_and_get',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['HEAD', 'GET']
|
||||
));
|
||||
$headMatchCasesCollection->add('get_and_head', new Route(
|
||||
'/get_and_head',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['GET', 'HEAD']
|
||||
));
|
||||
$headMatchCasesCollection->add('post_and_head', new Route(
|
||||
'/post_and_head',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['POST', 'HEAD']
|
||||
));
|
||||
$headMatchCasesCollection->add('put_and_post', new Route(
|
||||
'/put_and_post',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['PUT', 'POST']
|
||||
));
|
||||
$headMatchCasesCollection->add('put_and_get_and_head', new Route(
|
||||
'/put_and_post',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
'',
|
||||
[],
|
||||
['PUT', 'GET', 'HEAD']
|
||||
));
|
||||
|
||||
/* test case 5 */
|
||||
$groupOptimisedCollection = new RouteCollection();
|
||||
$groupOptimisedCollection->add('a_first', new Route('/a/11'));
|
||||
$groupOptimisedCollection->add('a_second', new Route('/a/22'));
|
||||
$groupOptimisedCollection->add('a_third', new Route('/a/333'));
|
||||
$groupOptimisedCollection->add('a_wildcard', new Route('/{param}'));
|
||||
$groupOptimisedCollection->add('a_fourth', new Route('/a/44/'));
|
||||
$groupOptimisedCollection->add('a_fifth', new Route('/a/55/'));
|
||||
$groupOptimisedCollection->add('a_sixth', new Route('/a/66/'));
|
||||
$groupOptimisedCollection->add('nested_wildcard', new Route('/nested/{param}'));
|
||||
$groupOptimisedCollection->add('nested_a', new Route('/nested/group/a/'));
|
||||
$groupOptimisedCollection->add('nested_b', new Route('/nested/group/b/'));
|
||||
$groupOptimisedCollection->add('nested_c', new Route('/nested/group/c/'));
|
||||
|
||||
$groupOptimisedCollection->add('slashed_a', new Route('/slashed/group/'));
|
||||
$groupOptimisedCollection->add('slashed_b', new Route('/slashed/group/b/'));
|
||||
$groupOptimisedCollection->add('slashed_c', new Route('/slashed/group/c/'));
|
||||
|
||||
/* test case 6 & 7 */
|
||||
$trailingSlashCollection = new RouteCollection();
|
||||
$trailingSlashCollection->add('simple_trailing_slash_no_methods', new Route('/trailing/simple/no-methods/', [], [], [], '', [], []));
|
||||
$trailingSlashCollection->add('simple_trailing_slash_GET_method', new Route('/trailing/simple/get-method/', [], [], [], '', [], ['GET']));
|
||||
$trailingSlashCollection->add('simple_trailing_slash_HEAD_method', new Route('/trailing/simple/head-method/', [], [], [], '', [], ['HEAD']));
|
||||
$trailingSlashCollection->add('simple_trailing_slash_POST_method', new Route('/trailing/simple/post-method/', [], [], [], '', [], ['POST']));
|
||||
$trailingSlashCollection->add('regex_trailing_slash_no_methods', new Route('/trailing/regex/no-methods/{param}/', [], [], [], '', [], []));
|
||||
$trailingSlashCollection->add('regex_trailing_slash_GET_method', new Route('/trailing/regex/get-method/{param}/', [], [], [], '', [], ['GET']));
|
||||
$trailingSlashCollection->add('regex_trailing_slash_HEAD_method', new Route('/trailing/regex/head-method/{param}/', [], [], [], '', [], ['HEAD']));
|
||||
$trailingSlashCollection->add('regex_trailing_slash_POST_method', new Route('/trailing/regex/post-method/{param}/', [], [], [], '', [], ['POST']));
|
||||
|
||||
$trailingSlashCollection->add('simple_not_trailing_slash_no_methods', new Route('/not-trailing/simple/no-methods', [], [], [], '', [], []));
|
||||
$trailingSlashCollection->add('simple_not_trailing_slash_GET_method', new Route('/not-trailing/simple/get-method', [], [], [], '', [], ['GET']));
|
||||
$trailingSlashCollection->add('simple_not_trailing_slash_HEAD_method', new Route('/not-trailing/simple/head-method', [], [], [], '', [], ['HEAD']));
|
||||
$trailingSlashCollection->add('simple_not_trailing_slash_POST_method', new Route('/not-trailing/simple/post-method', [], [], [], '', [], ['POST']));
|
||||
$trailingSlashCollection->add('regex_not_trailing_slash_no_methods', new Route('/not-trailing/regex/no-methods/{param}', [], [], [], '', [], []));
|
||||
$trailingSlashCollection->add('regex_not_trailing_slash_GET_method', new Route('/not-trailing/regex/get-method/{param}', [], [], [], '', [], ['GET']));
|
||||
$trailingSlashCollection->add('regex_not_trailing_slash_HEAD_method', new Route('/not-trailing/regex/head-method/{param}', [], [], [], '', [], ['HEAD']));
|
||||
$trailingSlashCollection->add('regex_not_trailing_slash_POST_method', new Route('/not-trailing/regex/post-method/{param}', [], [], [], '', [], ['POST']));
|
||||
|
||||
/* test case 8 */
|
||||
$unicodeCollection = new RouteCollection();
|
||||
$unicodeCollection->add('a', new Route('/{a}', [], ['a' => 'a'], ['utf8' => false]));
|
||||
$unicodeCollection->add('b', new Route('/{a}', [], ['a' => '.'], ['utf8' => true]));
|
||||
$unicodeCollection->add('c', new Route('/{a}', [], ['a' => '.'], ['utf8' => false]));
|
||||
|
||||
/* test case 9 */
|
||||
$hostTreeCollection = new RouteCollection();
|
||||
$hostTreeCollection->add('a', (new Route('/'))->setHost('{d}.e.c.b.a'));
|
||||
$hostTreeCollection->add('b', (new Route('/'))->setHost('d.c.b.a'));
|
||||
$hostTreeCollection->add('c', (new Route('/'))->setHost('{e}.e.c.b.a'));
|
||||
|
||||
/* test case 10 */
|
||||
$chunkedCollection = new RouteCollection();
|
||||
for ($i = 0; $i < 1000; ++$i) {
|
||||
$h = substr(md5($i), 0, 6);
|
||||
$chunkedCollection->add('_'.$i, new Route('/'.$h.'/{a}/{b}/{c}/'.$h));
|
||||
}
|
||||
|
||||
/* test case 11 */
|
||||
$demoCollection = new RouteCollection();
|
||||
$demoCollection->add('a', new Route('/admin/post/'));
|
||||
$demoCollection->add('b', new Route('/admin/post/new'));
|
||||
$demoCollection->add('c', (new Route('/admin/post/{id}'))->setRequirements(['id' => '\d+']));
|
||||
$demoCollection->add('d', (new Route('/admin/post/{id}/edit'))->setRequirements(['id' => '\d+']));
|
||||
$demoCollection->add('e', (new Route('/admin/post/{id}/delete'))->setRequirements(['id' => '\d+']));
|
||||
$demoCollection->add('f', new Route('/blog/'));
|
||||
$demoCollection->add('g', new Route('/blog/rss.xml'));
|
||||
$demoCollection->add('h', (new Route('/blog/page/{page}'))->setRequirements(['id' => '\d+']));
|
||||
$demoCollection->add('i', (new Route('/blog/posts/{page}'))->setRequirements(['id' => '\d+']));
|
||||
$demoCollection->add('j', (new Route('/blog/comments/{id}/new'))->setRequirements(['id' => '\d+']));
|
||||
$demoCollection->add('k', new Route('/blog/search'));
|
||||
$demoCollection->add('l', new Route('/login'));
|
||||
$demoCollection->add('m', new Route('/logout'));
|
||||
$demoCollection->addPrefix('/{_locale}');
|
||||
$demoCollection->add('n', new Route('/{_locale}'));
|
||||
$demoCollection->addRequirements(['_locale' => 'en|fr']);
|
||||
$demoCollection->addDefaults(['_locale' => 'en']);
|
||||
|
||||
/* test case 12 */
|
||||
$suffixCollection = new RouteCollection();
|
||||
$suffixCollection->add('r1', new Route('abc{foo}/1'));
|
||||
$suffixCollection->add('r2', new Route('abc{foo}/2'));
|
||||
$suffixCollection->add('r10', new Route('abc{foo}/10'));
|
||||
$suffixCollection->add('r20', new Route('abc{foo}/20'));
|
||||
$suffixCollection->add('r100', new Route('abc{foo}/100'));
|
||||
$suffixCollection->add('r200', new Route('abc{foo}/200'));
|
||||
|
||||
/* test case 13 */
|
||||
$hostCollection = new RouteCollection();
|
||||
$hostCollection->add('r1', (new Route('abc{foo}'))->setHost('{foo}.exampple.com'));
|
||||
$hostCollection->add('r2', (new Route('abc{foo}'))->setHost('{foo}.exampple.com'));
|
||||
|
||||
return [
|
||||
[new RouteCollection(), 'compiled_url_matcher0.php'],
|
||||
[$collection, 'compiled_url_matcher1.php'],
|
||||
[$redirectCollection, 'compiled_url_matcher2.php'],
|
||||
[$rootprefixCollection, 'compiled_url_matcher3.php'],
|
||||
[$headMatchCasesCollection, 'compiled_url_matcher4.php'],
|
||||
[$groupOptimisedCollection, 'compiled_url_matcher5.php'],
|
||||
[$trailingSlashCollection, 'compiled_url_matcher6.php'],
|
||||
[$trailingSlashCollection, 'compiled_url_matcher7.php'],
|
||||
[$unicodeCollection, 'compiled_url_matcher8.php'],
|
||||
[$hostTreeCollection, 'compiled_url_matcher9.php'],
|
||||
[$chunkedCollection, 'compiled_url_matcher10.php'],
|
||||
[$demoCollection, 'compiled_url_matcher11.php'],
|
||||
[$suffixCollection, 'compiled_url_matcher12.php'],
|
||||
[$hostCollection, 'compiled_url_matcher13.php'],
|
||||
];
|
||||
}
|
||||
|
||||
private function generateDumpedMatcher(RouteCollection $collection)
|
||||
{
|
||||
$dumper = new CompiledUrlMatcherDumper($collection);
|
||||
$code = $dumper->dump();
|
||||
|
||||
file_put_contents($this->dumpPath, $code);
|
||||
$compiledRoutes = require $this->dumpPath;
|
||||
|
||||
return $this->getMockBuilder(TestCompiledUrlMatcher::class)
|
||||
->setConstructorArgs([$compiledRoutes, new RequestContext()])
|
||||
->setMethods(['redirect'])
|
||||
->getMock();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage Symfony\Component\Routing\Route cannot contain objects
|
||||
*/
|
||||
public function testGenerateDumperMatcherWithObject()
|
||||
{
|
||||
$routeCollection = new RouteCollection();
|
||||
$routeCollection->add('_', new Route('/', [new \stdClass()]));
|
||||
$dumper = new CompiledUrlMatcherDumper($routeCollection);
|
||||
$dumper->dump();
|
||||
}
|
||||
}
|
||||
|
||||
class TestCompiledUrlMatcher extends CompiledUrlMatcher implements RedirectableUrlMatcherInterface
|
||||
{
|
||||
public function redirect($path, $route, $scheme = null)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,9 @@ use Symfony\Component\Routing\RequestContext;
|
||||
use Symfony\Component\Routing\Route;
|
||||
use Symfony\Component\Routing\RouteCollection;
|
||||
|
||||
/**
|
||||
* @group legacy
|
||||
*/
|
||||
class PhpMatcherDumperTest extends TestCase
|
||||
{
|
||||
/**
|
||||
|
||||
@@ -187,6 +187,26 @@ class UrlMatcherTest extends TestCase
|
||||
$this->assertEquals(['_route' => '$péß^a|'], $matcher->match('/bar'));
|
||||
}
|
||||
|
||||
public function testMatchImportantVariable()
|
||||
{
|
||||
$collection = new RouteCollection();
|
||||
$collection->add('index', new Route('/index.{!_format}', ['_format' => 'xml']));
|
||||
|
||||
$matcher = $this->getUrlMatcher($collection);
|
||||
$this->assertEquals(['_route' => 'index', '_format' => 'xml'], $matcher->match('/index.xml'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
|
||||
*/
|
||||
public function testShortPathDoesNotMatchImportantVariable()
|
||||
{
|
||||
$collection = new RouteCollection();
|
||||
$collection->add('index', new Route('/index.{!_format}', ['_format' => 'xml']));
|
||||
|
||||
$this->getUrlMatcher($collection)->match('/index');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
|
||||
*/
|
||||
@@ -232,7 +252,7 @@ class UrlMatcherTest extends TestCase
|
||||
$matcher = $this->getUrlMatcher($collection);
|
||||
|
||||
$this->assertEquals(['_route' => 'foo'], $matcher->match('/foo1'));
|
||||
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\ResourceNotFoundException');
|
||||
$this->expectException('Symfony\Component\Routing\Exception\ResourceNotFoundException');
|
||||
$this->assertEquals([], $matcher->match('/foo'));
|
||||
}
|
||||
|
||||
@@ -301,7 +321,7 @@ class UrlMatcherTest extends TestCase
|
||||
// z and _format are optional.
|
||||
$this->assertEquals(['w' => 'wwwww', 'x' => 'x', 'y' => 'y', 'z' => 'default-z', '_format' => 'html', '_route' => 'test'], $matcher->match('/wwwwwxy'));
|
||||
|
||||
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\ResourceNotFoundException');
|
||||
$this->expectException('Symfony\Component\Routing\Exception\ResourceNotFoundException');
|
||||
$matcher->match('/wxy.html');
|
||||
}
|
||||
|
||||
@@ -316,7 +336,7 @@ class UrlMatcherTest extends TestCase
|
||||
|
||||
// Usually the character in front of an optional parameter can be left out, e.g. with pattern '/get/{what}' just '/get' would match.
|
||||
// But here the 't' in 'get' is not a separating character, so it makes no sense to match without it.
|
||||
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\Routing\Exception\ResourceNotFoundException');
|
||||
$this->expectException('Symfony\Component\Routing\Exception\ResourceNotFoundException');
|
||||
$matcher->match('/ge');
|
||||
}
|
||||
|
||||
@@ -727,6 +747,7 @@ class UrlMatcherTest extends TestCase
|
||||
|
||||
/**
|
||||
* @expectedException \Symfony\Component\Routing\Exception\ResourceNotFoundException
|
||||
* @expectedExceptionMessage No routes found for "/".
|
||||
*/
|
||||
public function testSchemeAndMethodMismatch()
|
||||
{
|
||||
|
||||
30
vendor/symfony/routing/Tests/RouterTest.php
vendored
30
vendor/symfony/routing/Tests/RouterTest.php
vendored
@@ -93,12 +93,9 @@ class RouterTest extends TestCase
|
||||
$this->assertSame($routeCollection, $this->router->getRouteCollection());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideMatcherOptionsPreventingCaching
|
||||
*/
|
||||
public function testMatcherIsCreatedIfCacheIsNotConfigured($option)
|
||||
public function testMatcherIsCreatedIfCacheIsNotConfigured()
|
||||
{
|
||||
$this->router->setOption($option, null);
|
||||
$this->router->setOption('cache_dir', null);
|
||||
|
||||
$this->loader->expects($this->once())
|
||||
->method('load')->with('routing.yml', null)
|
||||
@@ -107,20 +104,9 @@ class RouterTest extends TestCase
|
||||
$this->assertInstanceOf('Symfony\\Component\\Routing\\Matcher\\UrlMatcher', $this->router->getMatcher());
|
||||
}
|
||||
|
||||
public function provideMatcherOptionsPreventingCaching()
|
||||
public function testGeneratorIsCreatedIfCacheIsNotConfigured()
|
||||
{
|
||||
return [
|
||||
['cache_dir'],
|
||||
['matcher_cache_class'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider provideGeneratorOptionsPreventingCaching
|
||||
*/
|
||||
public function testGeneratorIsCreatedIfCacheIsNotConfigured($option)
|
||||
{
|
||||
$this->router->setOption($option, null);
|
||||
$this->router->setOption('cache_dir', null);
|
||||
|
||||
$this->loader->expects($this->once())
|
||||
->method('load')->with('routing.yml', null)
|
||||
@@ -129,14 +115,6 @@ class RouterTest extends TestCase
|
||||
$this->assertInstanceOf('Symfony\\Component\\Routing\\Generator\\UrlGenerator', $this->router->getGenerator());
|
||||
}
|
||||
|
||||
public function provideGeneratorOptionsPreventingCaching()
|
||||
{
|
||||
return [
|
||||
['cache_dir'],
|
||||
['generator_cache_class'],
|
||||
];
|
||||
}
|
||||
|
||||
public function testMatchRequestWithUrlMatcherInterface()
|
||||
{
|
||||
$matcher = $this->getMockBuilder('Symfony\Component\Routing\Matcher\UrlMatcherInterface')->getMock();
|
||||
|
||||
4
vendor/symfony/routing/composer.json
vendored
4
vendor/symfony/routing/composer.json
vendored
@@ -24,7 +24,7 @@
|
||||
"symfony/yaml": "~3.4|~4.0",
|
||||
"symfony/expression-language": "~3.4|~4.0",
|
||||
"symfony/dependency-injection": "~3.4|~4.0",
|
||||
"doctrine/annotations": "~1.0",
|
||||
"doctrine/annotations": "~1.2",
|
||||
"psr/log": "~1.0"
|
||||
},
|
||||
"conflict": {
|
||||
@@ -48,7 +48,7 @@
|
||||
"minimum-stability": "dev",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.2-dev"
|
||||
"dev-master": "4.3-dev"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user