- First commit of this smallish kernel
This commit is contained in:
		
						commit
						8ab2d24073
					
				
							
								
								
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | The MIT License (MIT) | ||||||
|  | 
 | ||||||
|  | Copyright (c) 2020 Dave Mc Nicoll | ||||||
|  | 
 | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  | 
 | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | SOFTWARE. | ||||||
							
								
								
									
										24
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								composer.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | { | ||||||
|  |     "name": "mcnd/lean", | ||||||
|  |     "description": "A more-than-micro framework for basic apps", | ||||||
|  |     "type": "library", | ||||||
|  |     "license": "MIT", | ||||||
|  |     "authors": [ | ||||||
|  |         { | ||||||
|  |             "name": "Dave Mc Nicoll", | ||||||
|  |             "email": "mcndave@gmail.com" | ||||||
|  |         } | ||||||
|  |     ], | ||||||
|  |     "require": { | ||||||
|  |         "vlucas/phpdotenv": "^3.4@dev", | ||||||
|  |         "php-di/php-di": "dev-master", | ||||||
|  |         "league/route": "dev-master", | ||||||
|  |         "laminas/laminas-diactoros ": "^2.4.1@dev", | ||||||
|  |         "laminas/laminas-httphandlerrunner": "^1.2@dev" | ||||||
|  |     }, | ||||||
|  |     "autoload": { | ||||||
|  |         "psr-4": { | ||||||
|  |             "Lean\\": "src/" | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										134
									
								
								src/Kernel.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								src/Kernel.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,134 @@ | |||||||
|  | <?php declare(strict_types=1); | ||||||
|  | 
 | ||||||
|  | namespace Lean; | ||||||
|  | 
 | ||||||
|  | use Dotenv\Dotenv; | ||||||
|  | 
 | ||||||
|  | use DI\ContainerBuilder, | ||||||
|  |     DI\Container; | ||||||
|  | 
 | ||||||
|  | use League\Route\Strategy\ApplicationStrategy; | ||||||
|  | 
 | ||||||
|  | use Psr\Http\Message\ServerRequestInterface; | ||||||
|  | 
 | ||||||
|  | use Zend\Diactoros\ServerRequestFactory, | ||||||
|  |     Zend\HttpHandlerRunner\Emitter\EmitterInterface; | ||||||
|  | 
 | ||||||
|  | class Kernel { | ||||||
|  | 
 | ||||||
|  |     protected Container $container; | ||||||
|  | 
 | ||||||
|  |     protected string $locale; | ||||||
|  | 
 | ||||||
|  |     public array $paths = []; | ||||||
|  | 
 | ||||||
|  |     public int $errorReporting = E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE; | ||||||
|  | 
 | ||||||
|  |     public string $definitionFilePath; | ||||||
|  | 
 | ||||||
|  |     public string $errorLogPath; | ||||||
|  | 
 | ||||||
|  |     public string $projectPath; | ||||||
|  | 
 | ||||||
|  |     public string $routeDefinitionList = 'routes.list'; | ||||||
|  | 
 | ||||||
|  |     public function __construct(string $projectPath) | ||||||
|  |     { | ||||||
|  |         $this->projectPath = $projectPath; | ||||||
|  | 
 | ||||||
|  |         $this->setEnvironment(); | ||||||
|  |         $this->initializeEngine(); | ||||||
|  |         $this->setupContainer(); | ||||||
|  |         $this->serviceContainer(); | ||||||
|  |         $this->handleRequest(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public static function putenv($var, $value) | ||||||
|  |     { | ||||||
|  |         putenv("$var=$value"); | ||||||
|  |         $_ENV[$var] = $value; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function setEnvironment() { | ||||||
|  |         static::putenv('PROJECT_PATH', $this->projectPath); | ||||||
|  | 
 | ||||||
|  |         // Environment vars (accessible from \DI\env(), getenv(), $_ENV and $_SERVER)
 | ||||||
|  |         Dotenv::create(getenv("PROJECT_PATH"))->load(); | ||||||
|  | 
 | ||||||
|  |         // Paths and directories
 | ||||||
|  |         foreach($this->paths as $name => $envkey) { | ||||||
|  |             static::putenv($name, realpath(getenv("PROJECT_PATH") . DIRECTORY_SEPARATOR . getenv($envkey))); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // Override using headers
 | ||||||
|  |         foreach(['APP_ENV', 'DEBUG', ] as $env) { | ||||||
|  |             if ( null !== $value = $_SERVER["HTTP_$env"] ?? null ) { | ||||||
|  |                 static::putenv($env, $value); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function initializeEngine() : self | ||||||
|  |     { | ||||||
|  |         # Defining default locale and timezone
 | ||||||
|  |         date_default_timezone_set(getenv("DEFAULT_TIMEZONE")); | ||||||
|  | 
 | ||||||
|  |         setlocale(LC_ALL, $this->locale = getenv("DEFAULT_LOCAL")); | ||||||
|  |         setlocale(LC_TIME, getenv("DEFAULT_TIME"), getenv("DEFAULT_TIME_FALLBACK")); | ||||||
|  | 
 | ||||||
|  |         ini_set("log_errors", "1"); | ||||||
|  |         ini_set("error_log", $this->errorLogPath); | ||||||
|  |         ini_set('display_errors', getenv("DEBUG") ? 'on' : 'off'); | ||||||
|  | 
 | ||||||
|  |         error_reporting($this->errorReporting); | ||||||
|  | 
 | ||||||
|  |         return $this; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function setupContainer() : self | ||||||
|  |     { | ||||||
|  |         $containerBuilder = new ContainerBuilder(); | ||||||
|  | 
 | ||||||
|  |         if (getenv("APP_ENV") === "prod") { | ||||||
|  |             if (getenv("CACHE_PATH")) { | ||||||
|  |                 $containerBuilder->enableCompilation(getenv("CACHE_PATH") . "/di/"); | ||||||
|  |                 $containerBuilder->writeProxiesToFile(true); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $containerBuilder->useAnnotations(false); | ||||||
|  | 
 | ||||||
|  |         if ($this->definitionFilePath ?? false) { | ||||||
|  |             $containerBuilder->addDefinitions(require($this->definitionFilePath)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $this->container = $containerBuilder->build(); | ||||||
|  | 
 | ||||||
|  |         return $this; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function serviceContainer() : self | ||||||
|  |     { | ||||||
|  |         return $this; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function handleRequest() : self | ||||||
|  |     { | ||||||
|  |         ServerRequestFactory::fromGlobals($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES); | ||||||
|  | 
 | ||||||
|  |         // Router
 | ||||||
|  |         $routeFactory = $this->container->get($this->routeDefinitionList); | ||||||
|  | 
 | ||||||
|  |         $router = $routeFactory($this->container); | ||||||
|  | 
 | ||||||
|  |         $router->setStrategy($this->container->get(ApplicationStrategy::class)); | ||||||
|  | 
 | ||||||
|  |         // Handle requests
 | ||||||
|  |         $response = $router->dispatch($this->container->get(ServerRequestInterface::class)); | ||||||
|  | 
 | ||||||
|  |         // Reply to clients
 | ||||||
|  |         $this->container->get(EmitterInterface::class)->emit($response); | ||||||
|  | 
 | ||||||
|  |         return $this; | ||||||
|  |     } | ||||||
|  | }; | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user