Translated using Weblate (Portuguese (Brazil))
[phpmyadmin.git] / src / Application.php
blob7e1003005f3f7e13e638dba94188f2582bbea1ac
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin;
7 use Fig\Http\Message\StatusCodeInterface;
8 use Laminas\HttpHandlerRunner\Emitter\SapiEmitter;
9 use Laminas\HttpHandlerRunner\RequestHandlerRunner;
10 use PhpMyAdmin\Container\ContainerBuilder;
11 use PhpMyAdmin\Http\Factory\ResponseFactory;
12 use PhpMyAdmin\Http\Factory\ServerRequestFactory;
13 use PhpMyAdmin\Http\Handler\ApplicationHandler;
14 use PhpMyAdmin\Http\Handler\QueueRequestHandler;
15 use PhpMyAdmin\Http\Middleware\Authentication;
16 use PhpMyAdmin\Http\Middleware\ConfigErrorAndPermissionChecking;
17 use PhpMyAdmin\Http\Middleware\ConfigLoading;
18 use PhpMyAdmin\Http\Middleware\CurrentServerGlobalSetting;
19 use PhpMyAdmin\Http\Middleware\DatabaseAndTableSetting;
20 use PhpMyAdmin\Http\Middleware\DatabaseServerVersionChecking;
21 use PhpMyAdmin\Http\Middleware\EncryptedQueryParamsHandling;
22 use PhpMyAdmin\Http\Middleware\ErrorHandling;
23 use PhpMyAdmin\Http\Middleware\LanguageAndThemeCookieSaving;
24 use PhpMyAdmin\Http\Middleware\LanguageLoading;
25 use PhpMyAdmin\Http\Middleware\LoginCookieValiditySetting;
26 use PhpMyAdmin\Http\Middleware\MinimumCommonRedirection;
27 use PhpMyAdmin\Http\Middleware\OutputBuffering;
28 use PhpMyAdmin\Http\Middleware\PhpExtensionsChecking;
29 use PhpMyAdmin\Http\Middleware\PhpSettingsConfiguration;
30 use PhpMyAdmin\Http\Middleware\ProfilingChecking;
31 use PhpMyAdmin\Http\Middleware\RequestProblemChecking;
32 use PhpMyAdmin\Http\Middleware\ResponseRendererLoading;
33 use PhpMyAdmin\Http\Middleware\RouteParsing;
34 use PhpMyAdmin\Http\Middleware\ServerConfigurationChecking;
35 use PhpMyAdmin\Http\Middleware\SessionHandling;
36 use PhpMyAdmin\Http\Middleware\SetupPageRedirection;
37 use PhpMyAdmin\Http\Middleware\SqlDelimiterSetting;
38 use PhpMyAdmin\Http\Middleware\SqlQueryGlobalSetting;
39 use PhpMyAdmin\Http\Middleware\ThemeInitialization;
40 use PhpMyAdmin\Http\Middleware\TokenMismatchChecking;
41 use PhpMyAdmin\Http\Middleware\TokenRequestParamChecking;
42 use PhpMyAdmin\Http\Middleware\TrackerEnabling;
43 use PhpMyAdmin\Http\Middleware\UriSchemeUpdating;
44 use PhpMyAdmin\Http\Middleware\UrlParamsSetting;
45 use PhpMyAdmin\Http\Middleware\UrlRedirection;
46 use PhpMyAdmin\Http\Middleware\UserPreferencesLoading;
47 use PhpMyAdmin\Http\Middleware\ZeroConfPostConnection;
48 use PhpMyAdmin\Http\Response;
49 use PhpMyAdmin\Http\ServerRequest;
50 use PhpMyAdmin\Routing\Routing;
51 use Psr\Http\Message\ResponseInterface;
52 use Psr\Http\Message\ServerRequestInterface;
53 use Throwable;
55 use function sprintf;
57 class Application
59 public function __construct(
60 private readonly ErrorHandler $errorHandler,
61 private readonly Config $config,
62 private readonly Template $template,
63 private readonly ResponseFactory $responseFactory,
64 ) {
67 public static function init(): self
69 /** @var Application $application */
70 $application = ContainerBuilder::getContainer()->get(self::class);
72 return $application;
75 public function run(bool $isSetupPage = false): void
77 $requestHandler = new QueueRequestHandler(new ApplicationHandler($this));
78 $requestHandler->add(new ErrorHandling($this->errorHandler));
79 $requestHandler->add(new OutputBuffering());
80 $requestHandler->add(new PhpExtensionsChecking($this->template, $this->responseFactory));
81 $requestHandler->add(new ServerConfigurationChecking($this->template, $this->responseFactory));
82 $requestHandler->add(new PhpSettingsConfiguration());
83 $requestHandler->add(new RouteParsing());
84 $requestHandler->add(new ConfigLoading($this->config, $this->template, $this->responseFactory));
85 $requestHandler->add(new UriSchemeUpdating($this->config));
86 $requestHandler->add(new SessionHandling(
87 $this->config,
88 $this->errorHandler,
89 $this->template,
90 $this->responseFactory,
91 ));
92 $requestHandler->add(new EncryptedQueryParamsHandling());
93 $requestHandler->add(new UrlParamsSetting($this->config));
94 $requestHandler->add(new TokenRequestParamChecking());
95 $requestHandler->add(new DatabaseAndTableSetting());
96 $requestHandler->add(new SqlQueryGlobalSetting());
97 $requestHandler->add(new LanguageLoading());
98 $requestHandler->add(new ConfigErrorAndPermissionChecking(
99 $this->config,
100 $this->template,
101 $this->responseFactory,
103 $requestHandler->add(new RequestProblemChecking($this->template, $this->responseFactory));
104 $requestHandler->add(new CurrentServerGlobalSetting($this->config));
105 $requestHandler->add(new ThemeInitialization());
106 $requestHandler->add(new UrlRedirection($this->config));
107 $requestHandler->add(new SetupPageRedirection($this->config, $this->responseFactory));
108 $requestHandler->add(new MinimumCommonRedirection($this->config, $this->responseFactory));
109 $requestHandler->add(new LanguageAndThemeCookieSaving($this->config));
110 $requestHandler->add(new LoginCookieValiditySetting($this->config));
111 $requestHandler->add(new Authentication($this->config, $this->template, $this->responseFactory));
112 $requestHandler->add(new DatabaseServerVersionChecking($this->config, $this->template, $this->responseFactory));
113 $requestHandler->add(new SqlDelimiterSetting($this->config));
114 $requestHandler->add(new ResponseRendererLoading($this->config));
115 $requestHandler->add(new TokenMismatchChecking());
116 $requestHandler->add(new ProfilingChecking());
117 $requestHandler->add(new UserPreferencesLoading($this->config));
118 $requestHandler->add(new TrackerEnabling());
119 $requestHandler->add(new ZeroConfPostConnection($this->config));
121 $runner = new RequestHandlerRunner(
122 $requestHandler,
123 new SapiEmitter(),
124 static fn (): ServerRequestInterface => ServerRequestFactory::create()
125 ->fromGlobals()
126 ->withAttribute('isSetupPage', $isSetupPage),
127 function (Throwable $throwable): ResponseInterface {
128 $response = $this->responseFactory->createResponse(StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR);
129 $response->getBody()->write(sprintf('An error occurred: %s', $throwable->getMessage()));
131 return $response;
135 $runner->run();
138 public function handle(ServerRequest $request): Response|null
140 return Routing::callControllerForRoute(
141 $request,
142 Routing::getDispatcher(),
143 ContainerBuilder::getContainer(),
144 $this->responseFactory,