%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/application/src/Application/Routers/ |
Current File : //www/varak.net/losik.varak.net/vendor/nette/application/src/Application/Routers/Route.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Application\Routers; use Nette; /** * The bidirectional route is responsible for mapping * HTTP request to an array for dispatch and vice-versa. */ class Route extends Nette\Routing\Route implements Nette\Routing\Router { private const PresenterKey = 'presenter', ModuleKey = 'module'; private const UIMeta = [ 'module' => [ self::PATTERN => '[a-z][a-z0-9.-]*', self::FILTER_IN => [self::class, 'path2presenter'], self::FILTER_OUT => [self::class, 'presenter2path'], ], 'presenter' => [ self::PATTERN => '[a-z][a-z0-9.-]*', self::FILTER_IN => [self::class, 'path2presenter'], self::FILTER_OUT => [self::class, 'presenter2path'], ], 'action' => [ self::PATTERN => '[a-z][a-z0-9-]*', self::FILTER_IN => [self::class, 'path2action'], self::FILTER_OUT => [self::class, 'action2path'], ], ]; /** @var int */ private $flags; /** * @param string $mask e.g. '<presenter>/<action>/<id \d{1,3}>' * @param array|string|\Closure $metadata default values or metadata or callback for NetteModule\MicroPresenter */ public function __construct(string $mask, $metadata = [], int $flags = 0) { if (is_string($metadata)) { [$presenter, $action] = Nette\Application\Helpers::splitName($metadata); if (!$presenter) { throw new Nette\InvalidArgumentException("Second argument must be array or string in format Presenter:action, '$metadata' given."); } $metadata = [self::PresenterKey => $presenter]; if ($action !== '') { $metadata['action'] = $action; } } elseif ($metadata instanceof \Closure) { $metadata = [ self::PresenterKey => 'Nette:Micro', 'callback' => $metadata, ]; } if ($flags) { trigger_error(__METHOD__ . '() parameter $flags is deprecated, use RouteList::addRoute(..., ..., $flags) instead.', E_USER_DEPRECATED); } $this->defaultMeta += self::UIMeta; $this->flags = $flags; parent::__construct($mask, $metadata); } /** * Maps HTTP request to an array. */ public function match(Nette\Http\IRequest $httpRequest): ?array { $params = parent::match($httpRequest); if ($params === null) { return null; } elseif (!isset($params[self::PresenterKey])) { throw new Nette\InvalidStateException('Missing presenter in route definition.'); } elseif (!is_string($params[self::PresenterKey])) { return null; } $presenter = $params[self::PresenterKey] ?? null; if (isset($this->getMetadata()[self::ModuleKey], $params[self::ModuleKey]) && is_string($presenter)) { $params[self::PresenterKey] = $params[self::ModuleKey] . ':' . $params[self::PresenterKey]; } unset($params[self::ModuleKey]); return $params; } /** * Constructs absolute URL from array. */ public function constructUrl(array $params, Nette\Http\UrlScript $refUrl): ?string { if ($this->flags & self::ONE_WAY) { return null; } $metadata = $this->getMetadata(); if (isset($metadata[self::ModuleKey])) { // try split into module and [submodule:]presenter parts $presenter = $params[self::PresenterKey]; $module = $metadata[self::ModuleKey]; $a = isset($module['fixity'], $module[self::VALUE]) && strncmp($presenter, $module[self::VALUE] . ':', strlen($module[self::VALUE]) + 1) === 0 ? strlen($module[self::VALUE]) : strrpos($presenter, ':'); if ($a === false) { $params[self::ModuleKey] = isset($module[self::VALUE]) ? '' : null; } else { $params[self::ModuleKey] = substr($presenter, 0, $a); $params[self::PresenterKey] = substr($presenter, $a + 1); } } return parent::constructUrl($params, $refUrl); } /** @internal */ public function getConstantParameters(): array { $res = parent::getConstantParameters(); if (isset($res[self::ModuleKey], $res[self::PresenterKey])) { $res[self::PresenterKey] = $res[self::ModuleKey] . ':' . $res[self::PresenterKey]; } elseif (isset($this->getMetadata()[self::ModuleKey])) { unset($res[self::PresenterKey]); } unset($res[self::ModuleKey]); return $res; } /** @deprecated */ public function getFlags(): int { trigger_error(__METHOD__ . '() is deprecated.', E_USER_DEPRECATED); return $this->flags; } /********************* Inflectors ****************d*g**/ /** * camelCaseAction name -> dash-separated. */ public static function action2path(string $s): string { $s = preg_replace('#(.)(?=[A-Z])#', '$1-', $s); $s = strtolower($s); $s = rawurlencode($s); return $s; } /** * dash-separated -> camelCaseAction name. */ public static function path2action(string $s): string { $s = preg_replace('#-(?=[a-z])#', ' ', $s); $s = lcfirst(ucwords($s)); $s = str_replace(' ', '', $s); return $s; } /** * PascalCase:Presenter name -> dash-and-dot-separated. */ public static function presenter2path(string $s): string { $s = strtr($s, ':', '.'); $s = preg_replace('#([^.])(?=[A-Z])#', '$1-', $s); $s = strtolower($s); $s = rawurlencode($s); return $s; } /** * dash-and-dot-separated -> PascalCase:Presenter name. */ public static function path2presenter(string $s): string { $s = preg_replace('#([.-])(?=[a-z])#', '$1 ', $s); $s = ucwords($s); $s = str_replace('. ', ':', $s); $s = str_replace('- ', '', $s); return $s; } } interface_exists(Nette\Application\IRouter::class);