summaryrefslogtreecommitdiff
path: root/index.php
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@webtrees.net>2019-04-02 12:49:16 +0100
committerGreg Roach <fisharebest@webtrees.net>2019-04-10 10:46:01 +0100
commit6ccdf4f0fd1b65a5d54259c969912382ce49629d (patch)
tree05b5413ec6c06cec5ba59c24fd73dd2034ff1b74 /index.php
parente2e7f6bfc3bed346c21ad436fd1055ed03e163c3 (diff)
downloadwebtrees-6ccdf4f0fd1b65a5d54259c969912382ce49629d.tar.gz
webtrees-6ccdf4f0fd1b65a5d54259c969912382ce49629d.tar.bz2
webtrees-6ccdf4f0fd1b65a5d54259c969912382ce49629d.zip
Convert requests, middleware and reponses to use PSR-7, PSR-15 and PSR-17
Diffstat (limited to 'index.php')
-rw-r--r--index.php176
1 files changed, 62 insertions, 114 deletions
diff --git a/index.php b/index.php
index a19b547b41..9e615438a8 100644
--- a/index.php
+++ b/index.php
@@ -15,31 +15,35 @@
*/
declare(strict_types=1);
-use Fisharebest\Webtrees\Database;
use Fisharebest\Webtrees\DebugBar;
-use Fisharebest\Webtrees\Exceptions\Handler;
-use Fisharebest\Webtrees\Http\Controllers\SetupController;
use Fisharebest\Webtrees\Http\Middleware\BootModules;
use Fisharebest\Webtrees\Http\Middleware\CheckCsrf;
use Fisharebest\Webtrees\Http\Middleware\CheckForMaintenanceMode;
use Fisharebest\Webtrees\Http\Middleware\DebugBarData;
+use Fisharebest\Webtrees\Http\Middleware\ExceptionHandler;
use Fisharebest\Webtrees\Http\Middleware\Housekeeping;
-use Fisharebest\Webtrees\Http\Middleware\MiddlewareInterface;
+use Fisharebest\Webtrees\Http\Middleware\ModuleMiddleware;
+use Fisharebest\Webtrees\Http\Middleware\RequestRouter;
+use Fisharebest\Webtrees\Http\Middleware\UpdateDatabaseSchema;
+use Fisharebest\Webtrees\Http\Middleware\UseCache;
+use Fisharebest\Webtrees\Http\Middleware\UseDatabase;
use Fisharebest\Webtrees\Http\Middleware\UseFilesystem;
use Fisharebest\Webtrees\Http\Middleware\UseLocale;
use Fisharebest\Webtrees\Http\Middleware\UseSession;
use Fisharebest\Webtrees\Http\Middleware\UseTheme;
use Fisharebest\Webtrees\Http\Middleware\UseTransaction;
use Fisharebest\Webtrees\Http\Middleware\UseTree;
-use Fisharebest\Webtrees\Services\MigrationService;
-use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Services\TimeoutService;
+use Fisharebest\Webtrees\Http\Request as SymfonyRequest;
use Fisharebest\Webtrees\Webtrees;
-use Illuminate\Cache\ArrayStore;
-use Illuminate\Cache\Repository;
-use Illuminate\Support\Collection;
-use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
+use Middleland\Dispatcher;
+use Narrowspark\HttpEmitter\SapiEmitter;
+use Nyholm\Psr7\Factory\Psr17Factory;
+use Nyholm\Psr7Server\ServerRequestCreator;
+use Psr\Http\Message\ResponseFactoryInterface;
+use Psr\Http\Message\ServerRequestFactoryInterface;
+use Psr\Http\Message\StreamFactoryInterface;
+use Psr\Http\Message\UploadedFileFactoryInterface;
+use Psr\Http\Message\UriFactoryInterface;
require __DIR__ . '/vendor/autoload.php';
@@ -47,6 +51,24 @@ const WT_ROOT = __DIR__ . DIRECTORY_SEPARATOR;
Webtrees::init();
+// Use nyholm/psr7 for our PSR7 messages and PSR17 factory.
+app()->bind(ResponseFactoryInterface::class, Psr17Factory::class);
+app()->bind(ServerRequestFactoryInterface::class, Psr17Factory::class);
+app()->bind(StreamFactoryInterface::class, Psr17Factory::class);
+app()->bind(UploadedFileFactoryInterface::class, Psr17Factory::class);
+app()->bind(UriFactoryInterface::class, Psr17Factory::class);
+
+// Use nyholm/psr7-server to create a request from the PHP environment.
+$server_request_creator = new ServerRequestCreator(
+ app(ServerRequestFactoryInterface::class),
+ app(UriFactoryInterface::class),
+ app(UploadedFileFactoryInterface::class),
+ app(StreamFactoryInterface::class)
+);
+
+// Create a PSR-7 request
+$request = $server_request_creator->fromGlobals();
+
// Initialise the DebugBar for development.
// Use `composer install --dev` on a development build to enable.
// Note that you may need to increase the size of the fcgi buffers on nginx.
@@ -55,111 +77,37 @@ Webtrees::init();
// fastcgi_buffer_size 32m;
DebugBar::init(class_exists('\\DebugBar\\StandardDebugBar'));
-// Use an array cache for database calls, etc.
-app()->instance('cache.array', new Repository(new ArrayStore()));
-
-// Start the timer.
-app()->instance(TimeoutService::class, new TimeoutService(microtime(true)));
-
-// Extract the request parameters.
-$request = Request::createFromGlobals();
-app()->instance(Request::class, $request);
+// Until all the code is rewritten to use PSR-7 requests, we still need our hybrid request.
+$request = SymfonyRequest::createFromGlobals();
// Calculate the base URL, so we can generate absolute URLs.
-$request_uri = $request->getSchemeAndHttpHost() . $request->getRequestUri();
-
// Remove any PHP script name and parameters.
-$base_uri = preg_replace('/[^\/]+\.php(\?.*)?$/', '', $request_uri);
-define('WT_BASE_URL', $base_uri);
-
-try {
- // No config file? Run the setup wizard
- if (!file_exists(Webtrees::CONFIG_FILE)) {
- define('WT_DATA_DIR', 'data/');
-
- /** @var SetupController $controller */
- $controller = app(SetupController::class);
- $response = $controller->setup($request);
- $response->prepare($request)->send();
-
- return;
- }
-
- $database_config = parse_ini_file(Webtrees::CONFIG_FILE);
-
- // Read the connection settings and create the database
- Database::connect($database_config);
-
- // Update the database schema, if necessary.
- app(MigrationService::class)->updateSchema('\Fisharebest\Webtrees\Schema', 'WT_SCHEMA_VERSION', Webtrees::SCHEMA_VERSION);
-
- // Middleware allows code to intercept the request before it reaches the controller, and to
- // intercept the response afterwards.
- //
- // +----------------------------------+
- // | Middleware1 |
- // | +------------------------------+ |
- // | | Middleware2 | |
- // | | +--------------------------+ | |
- // | | | | | |
- // Request ----|-|-|-> Controller::action() --|-|-|---> Response
- // | | | | | |
- // | | +--------------------------+ | |
- // | | | |
- // | +------------------------------+ |
- // | |
- // +----------------------------------+
-
- // Create the middleware, from the "inside" to the "outside".
- /** @var Collection $middleware_stack */
- $middleware_stack = app(ModuleService::class)
- ->findByInterface(MiddlewareInterface::class);
-
- // Core middleware.
- $middleware_stack = $middleware_stack->merge([
- CheckCsrf::class,
- UseTransaction::class,
- Housekeeping::class,
- DebugBarData::class,
- BootModules::class,
- UseTheme::class,
- UseLocale::class,
- UseTree::class,
- UseSession::class,
- UseFilesystem::class,
- CheckForMaintenanceMode::class,
- ]);
-
- // Construct the core middleware *after* loading the modules, to reduce dependencies.
- $middleware_stack = $middleware_stack->map(static function ($middleware): MiddlewareInterface {
- return $middleware instanceof MiddlewareInterface ? $middleware : app($middleware);
- });
-
- // Create a pipeline, which applies the middleware as a nested function call.
- $pipeline = $middleware_stack->reduce(static function (Closure $next, MiddlewareInterface $middleware): Closure {
- // Create a closure to apply the middleware.
- return function (Request $request) use ($middleware, $next): Response {
- return $middleware->handle($request, $next);
- };
- }, static function (Request $request): Response {
- // Load the route and routing table.
- $route = $request->get('route');
- $routes = require 'routes/web.php';
-
- // Find the controller and action for the selected route
- $controller_action = $routes[$request->getMethod() . ':' . $route] ?? 'ErrorController@noRouteFound';
- [$controller_name, $action] = explode('@', $controller_action);
- $controller_class = '\\Fisharebest\\Webtrees\\Http\\Controllers\\' . $controller_name;
-
- $controller = app($controller_class);
+define('WT_BASE_URL', preg_replace('/[^\/]+\.php(\?.*)?$/', '', $request->getUri()));
- return app()->dispatch($controller, $action);
- });
+$middleware = [
+ ExceptionHandler::class,
+ CheckForMaintenanceMode::class,
+ UseDatabase::class,
+ DebugBarData::class,
+ UpdateDatabaseSchema::class,
+ UseCache::class,
+ UseFilesystem::class,
+ UseSession::class,
+ UseTree::class,
+ UseLocale::class,
+ UseTheme::class,
+ Housekeeping::class,
+ CheckCsrf::class,
+ UseTransaction::class,
+ BootModules::class,
+ ModuleMiddleware::class,
+ RequestRouter::class,
+];
- $response = $pipeline($request);
-} catch (Throwable $exception) {
- $response = (new Handler())->render($request, $exception);
-}
+// Dispatch the middleware.
+$dispatcher = new Dispatcher($middleware, app());
+$response = $dispatcher->dispatch($request);
-// Send response
-$response->prepare($request)->send();
+// Emit the response.
+$emitter = new SapiEmitter();
+$emitter->emit($response);