%PDF- %PDF-
| Direktori : /www/varak.net/losik.varak.net/vendor/nette/application/src/Application/ |
| Current File : /www/varak.net/losik.varak.net/vendor/nette/application/src/Application/LinkGenerator.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;
use Nette;
use Nette\Http\UrlScript;
use Nette\Routing\Router;
/**
* Link generator.
*/
final class LinkGenerator
{
use Nette\SmartObject;
/** @var Router */
private $router;
/** @var UrlScript */
private $refUrl;
/** @var IPresenterFactory|null */
private $presenterFactory;
public function __construct(Router $router, UrlScript $refUrl, ?IPresenterFactory $presenterFactory = null)
{
$this->router = $router;
$this->refUrl = $refUrl;
$this->presenterFactory = $presenterFactory;
}
/**
* Generates URL to presenter.
* @param string $dest in format "[[[module:]presenter:]action] [#fragment]"
* @throws UI\InvalidLinkException
*/
public function link(string $dest, array $params = []): string
{
if (!preg_match('~^([\w:]+):(\w*+)(#.*)?()$~D', $dest, $m)) {
throw new UI\InvalidLinkException("Invalid link destination '$dest'.");
}
[, $presenter, $action, $frag] = $m;
try {
$class = $this->presenterFactory
? $this->presenterFactory->getPresenterClass($presenter)
: null;
} catch (InvalidPresenterException $e) {
throw new UI\InvalidLinkException($e->getMessage(), 0, $e);
}
if (is_subclass_of($class, UI\Presenter::class)) {
if ($action === '') {
$action = UI\Presenter::DefaultAction;
}
if (
method_exists($class, $method = $class::formatActionMethod($action))
|| method_exists($class, $method = $class::formatRenderMethod($action))
) {
UI\Presenter::argsToParams($class, $method, $params, [], $missing);
if ($missing) {
$rp = $missing[0];
throw new UI\InvalidLinkException("Missing parameter \${$rp->getName()} required by {$rp->getDeclaringClass()->getName()}::{$rp->getDeclaringFunction()->getName()}()");
}
} elseif (array_key_exists(0, $params)) {
throw new UI\InvalidLinkException("Unable to pass parameters to action '$presenter:$action', missing corresponding method.");
}
}
if ($action !== '') {
$params[UI\Presenter::ActionKey] = $action;
}
$params[UI\Presenter::PresenterKey] = $presenter;
$url = $this->router->constructUrl($params, $this->refUrl);
if ($url === null) {
unset($params[UI\Presenter::ActionKey], $params[UI\Presenter::PresenterKey]);
$paramsDecoded = urldecode(http_build_query($params, '', ', '));
throw new UI\InvalidLinkException("No route for $dest($paramsDecoded)");
}
return $url . $frag;
}
public function withReferenceUrl(string $url): self
{
return new self(
$this->router,
new UrlScript($url),
$this->presenterFactory
);
}
}