NelmioApiDocBundle/Routing/FilteredRouteCollectionBuilder.php

78 lines
2.3 KiB
PHP
Raw Normal View History

<?php
/*
2016-12-29 12:09:26 +01:00
* This file is part of the NelmioApiDocBundle package.
*
2016-12-29 12:09:26 +01:00
* (c) Nelmio
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
2016-12-29 12:09:26 +01:00
namespace Nelmio\ApiDocBundle\Routing;
2018-03-13 12:40:36 -03:00
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
final class FilteredRouteCollectionBuilder
{
2018-03-13 12:40:36 -03:00
private $options;
2018-03-13 12:40:36 -03:00
public function __construct(array $options = [])
{
2018-03-13 12:40:36 -03:00
$resolver = new OptionsResolver();
$resolver
->setDefaults([
'path_patterns' => [],
'host_patterns' => [],
])
->setAllowedTypes('path_patterns', 'string[]')
->setAllowedTypes('host_patterns', 'string[]')
;
if (array_key_exists(0, $options)) {
@trigger_error(sprintf('Passing an indexed array with a collection of path patterns as argument 1 for `%s()` is deprecated since 3.2.0, expected structure is an array containing parameterized options.', __METHOD__), E_USER_DEPRECATED);
$normalizedOptions = ['path_patterns' => $options];
$options = $normalizedOptions;
}
$this->options = $resolver->resolve($options);
}
public function filter(RouteCollection $routes): RouteCollection
{
$filteredRoutes = new RouteCollection();
foreach ($routes->all() as $name => $route) {
2018-03-13 12:40:36 -03:00
if ($this->matchPath($route) && $this->matchHost($route)) {
$filteredRoutes->add($name, $route);
}
}
return $filteredRoutes;
}
2018-03-13 12:40:36 -03:00
private function matchPath(Route $route): bool
{
2018-03-13 12:40:36 -03:00
foreach ($this->options['path_patterns'] as $pathPattern) {
if (preg_match('{'.$pathPattern.'}', $route->getPath())) {
return true;
}
}
2018-03-13 12:40:36 -03:00
return 0 === count($this->options['path_patterns']);
}
private function matchHost(Route $route): bool
{
foreach ($this->options['host_patterns'] as $hostPattern) {
if (preg_match('{'.$hostPattern.'}', $route->getHost())) {
return true;
}
}
return 0 === count($this->options['host_patterns']);
}
}