X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fsymfony-cmf%2Frouting%2FCandidates%2FCandidates.php;fp=vendor%2Fsymfony-cmf%2Frouting%2FCandidates%2FCandidates.php;h=21bef551428ca12d77fe5c41172125a82293ce98;hp=0000000000000000000000000000000000000000;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad diff --git a/vendor/symfony-cmf/routing/Candidates/Candidates.php b/vendor/symfony-cmf/routing/Candidates/Candidates.php new file mode 100644 index 000000000..21bef5514 --- /dev/null +++ b/vendor/symfony-cmf/routing/Candidates/Candidates.php @@ -0,0 +1,154 @@ + + */ +class Candidates implements CandidatesInterface +{ + /** + * @var array + */ + protected $locales; + + /** + * A limit to apply to the number of candidates generated. + * + * This is to prevent abusive requests with a lot of "/". The limit is per + * batch, that is if a locale matches you could get as many as 2 * $limit + * candidates if the URL has that many slashes. + * + * @var int + */ + protected $limit; + + /** + * @param array $locales The locales to support. + * @param int $limit A limit to apply to the candidates generated. + */ + public function __construct(array $locales = array(), $limit = 20) + { + $this->setLocales($locales); + $this->limit = $limit; + } + + /** + * Set the locales to support by this strategy. + * + * @param array $locales The locales to support. + */ + public function setLocales(array $locales) + { + $this->locales = $locales; + } + + /** + * {@inheritdoc} + * + * Always returns true. + */ + public function isCandidate($name) + { + return true; + } + + /** + * {@inheritdoc} + * + * Does nothing. + */ + public function restrictQuery($queryBuilder) + { + } + + /** + * {@inheritdoc} + */ + public function getCandidates(Request $request) + { + $url = $request->getPathInfo(); + $candidates = $this->getCandidatesFor($url); + + $locale = $this->determineLocale($url); + if ($locale) { + $candidates = array_unique(array_merge($candidates, $this->getCandidatesFor(substr($url, strlen($locale) + 1)))); + } + + return $candidates; + } + + /** + * Determine the locale of this URL. + * + * @param string $url The url to determine the locale from. + * + * @return string|bool The locale if $url starts with one of the allowed locales. + */ + protected function determineLocale($url) + { + if (!count($this->locales)) { + return false; + } + + $matches = array(); + if (preg_match('#('.implode('|', $this->locales).')(/|$)#', $url, $matches)) { + return $matches[1]; + } + + return false; + } + + /** + * Handle a possible format extension and split the $url on "/". + * + * $prefix is prepended to every candidate generated. + * + * @param string $url The URL to split. + * @param string $prefix A prefix to prepend to every pattern. + * + * @return array Paths that could represent routes that match $url and are + * child of $prefix. + */ + protected function getCandidatesFor($url, $prefix = '') + { + $candidates = array(); + if ('/' !== $url) { + // handle format extension, like .html or .json + if (preg_match('/(.+)\.[a-z]+$/i', $url, $matches)) { + $candidates[] = $prefix.$url; + $url = $matches[1]; + } + + $part = $url; + $count = 0; + while (false !== ($pos = strrpos($part, '/'))) { + if (++$count > $this->limit) { + return $candidates; + } + $candidates[] = $prefix.$part; + $part = substr($url, 0, $pos); + } + } + + $candidates[] = $prefix ?: '/'; + + return $candidates; + } +}