%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/MicroPresenter.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 NetteModule; use Latte; use Nette; use Nette\Application; use Nette\Application\Responses; use Nette\Http; use Nette\Routing\Router; /** * Micro presenter. */ final class MicroPresenter implements Application\IPresenter { use Nette\SmartObject; /** @var Nette\DI\Container|null */ private $context; /** @var Nette\Http\IRequest|null */ private $httpRequest; /** @var Router|null */ private $router; /** @var Application\Request|null */ private $request; public function __construct( ?Nette\DI\Container $context = null, ?Http\IRequest $httpRequest = null, ?Router $router = null ) { $this->context = $context; $this->httpRequest = $httpRequest; $this->router = $router; } /** * Gets the context. */ public function getContext(): ?Nette\DI\Container { return $this->context; } public function run(Application\Request $request): Application\Response { $this->request = $request; if ( $this->httpRequest && $this->router && !$this->httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head')) ) { $refUrl = $this->httpRequest->getUrl()->withoutUserInfo(); $url = $this->router->constructUrl($request->toArray(), $refUrl); if ($url !== null && !$refUrl->isEqual($url)) { return new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY); } } $params = $request->getParameters(); $callback = $params['callback'] ?? null; if (!is_object($callback) || !is_callable($callback)) { throw new Application\BadRequestException('Parameter callback is not a valid closure.'); } $reflection = Nette\Utils\Callback::toReflection($callback); if ($this->context) { foreach ($reflection->getParameters() as $param) { if ($param->getType()) { $params[$param->getName()] = $this->context->getByType($param->getType()->getName(), false); } } } $params['presenter'] = $this; try { $params = Application\UI\ComponentReflection::combineArgs($reflection, $params); } catch (Nette\InvalidArgumentException $e) { $this->error($e->getMessage()); } $response = $callback(...array_values($params)); if (is_string($response)) { $response = [$response, []]; } if (is_array($response)) { [$templateSource, $templateParams] = $response; $response = $this->createTemplate()->setParameters($templateParams); if (!$templateSource instanceof \SplFileInfo) { $response->getLatte()->setLoader(new Latte\Loaders\StringLoader); } $response->setFile((string) $templateSource); } if ($response instanceof Application\UI\Template) { return new Responses\TextResponse($response); } else { return $response ?: new Responses\VoidResponse; } } /** * Template factory. */ public function createTemplate(?string $class = null, ?callable $latteFactory = null): Application\UI\Template { $latte = $latteFactory ? $latteFactory() : $this->getContext()->getByType(Nette\Bridges\ApplicationLatte\LatteFactory::class)->create(); $template = $class ? new $class : new Nette\Bridges\ApplicationLatte\DefaultTemplate($latte); $template->setParameters($this->request->getParameters()); $template->presenter = $this; $template->context = $this->context; if ($this->httpRequest) { $url = $this->httpRequest->getUrl()->withoutUserInfo(); $template->baseUrl = rtrim($url->getBaseUrl(), '/'); $template->basePath = rtrim($url->getBasePath(), '/'); } return $template; } /** * Redirects to another URL. */ public function redirectUrl(string $url, int $httpCode = Http\IResponse::S302_FOUND): Responses\RedirectResponse { return new Responses\RedirectResponse($url, $httpCode); } /** * Throws HTTP error. * @throws Nette\Application\BadRequestException */ public function error(string $message = '', int $httpCode = Http\IResponse::S404_NOT_FOUND): void { throw new Application\BadRequestException($message, $httpCode); } public function getRequest(): ?Nette\Application\Request { return $this->request; } }