* @throws Exception */ protected function getAppInstance(): App { // Instantiate PHP-DI ContainerBuilder $containerBuilder = new ContainerBuilder(); // Container intentionally not compiled for tests. // Set up settings $settings = require __DIR__ . '/../app/settings.php'; assert($settings instanceof \Closure); $settings($containerBuilder); // Set up dependencies $dependencies = require __DIR__ . '/../app/dependencies.php'; assert($dependencies instanceof \Closure); $dependencies($containerBuilder); // Set up repositories $repositories = require __DIR__ . '/../app/repositories.php'; assert($repositories instanceof \Closure); $repositories($containerBuilder); // Build PHP-DI Container instance $container = $containerBuilder->build(); // Instantiate the app AppFactory::setContainer($container); $app = AppFactory::create(); // Register middleware $middleware = require __DIR__ . '/../app/middleware.php'; assert($middleware instanceof \Closure); $middleware($app); // Register routes $routes = require __DIR__ . '/../app/routes.php'; assert($routes instanceof \Closure); $routes($app); return $app; } /** * @param array> $headers * @param array $cookies * @param array $serverParams */ protected function createRequest( string $method, string $path, array $headers = ['HTTP_ACCEPT' => 'application/json'], array $cookies = [], array $serverParams = [] ): Request { $uri = new Uri('', '', 80, $path); $handle = fopen('php://temp', 'w+'); if ($handle === false) { throw new \RuntimeException('Unable to open php://temp'); } $stream = (new StreamFactory())->createStreamFromResource($handle); $h = new Headers(); foreach ($headers as $name => $value) { $h->addHeader($name, $value); } return new SlimRequest($method, $uri, $h, $cookies, $serverParams, $stream); } }