Ver Fonte

update pureplate lib to 2.0 alpha

michelphp há 3 semanas atrás
pai
commit
8212a7d480

+ 45 - 44
composer.json

@@ -1,47 +1,48 @@
 {
-    "name": "michel/michel-core",
-    "description": "The Michel Framework Core provides the essential building blocks for the Michel Framework. It's a lightweight, versatile, and modern PHP framework designed to streamline web development and simplify common tasks.",
-    "type": "package",
-    "license": "MPL-2.0",
-    "authors": [
-        {
-            "name": "Michel.F"
-        }
-    ],
-    "autoload": {
-        "psr-4": {
-            "\\Michel\\Framework\\Core\\": "src",
-            "Test\\Michel\\Framework\\Core\\": "tests"
-        },
-        "files": [
-            "functions/helpers.php",
-            "functions/helpers_file.php",
-            "functions/helpers_string.php",
-            "functions/helpers_array.php",
-            "functions/helpers_date.php"
-        ]
-    },
-    "require": {
-        "php": ">=7.4",
-        "ext-json": "*",
-        "ext-mbstring": "*",
-        "psr/container": "^1.0|^2.0",
-        "psr/http-message": "~1.0|^2.0",
-        "psr/http-server-handler": "^1.0",
-        "psr/http-server-middleware": "^1.0",
-        "psr/event-dispatcher": "^1.0",
-        "psr/http-factory": "^1.0",
-        "psr/log": "^1.1|^2.0",
-        "michel/dotenv": "^1.0",
-        "michel/router": "^1.0",
-        "michel/options-resolver": "^1.0",
-        "michel/console": "^1.0",
-        "michel/vardumper": "^1.0",
-        "michel/psr14-event-dispatcher": "^1.0",
-        "michel/pure-plate": "^1.0",
-        "michel/michel-package-starter": "^1.0"
-    },
-    "require-dev": {
-      "michel/unitester": "^1.0.0"
+  "name": "michel/michel-core",
+  "description": "The Michel Framework Core provides the essential building blocks for the Michel Framework. It's a lightweight, versatile, and modern PHP framework designed to streamline web development and simplify common tasks.",
+  "type": "package",
+  "license": "MPL-2.0",
+  "authors": [
+    {
+      "name": "Michel.F"
     }
+  ],
+  "autoload": {
+    "psr-4": {
+      "\\Michel\\Framework\\Core\\": "src",
+      "Test\\Michel\\Framework\\Core\\": "tests"
+    },
+    "files": [
+      "functions/helpers.php",
+      "functions/helpers_file.php",
+      "functions/helpers_string.php",
+      "functions/helpers_array.php",
+      "functions/helpers_date.php"
+    ]
+  },
+  "minimum-stability": "alpha",
+  "require": {
+    "php": ">=7.4",
+    "ext-json": "*",
+    "ext-mbstring": "*",
+    "psr/container": "^1.0|^2.0",
+    "psr/http-message": "~1.0|^2.0",
+    "psr/http-server-handler": "^1.0",
+    "psr/http-server-middleware": "^1.0",
+    "psr/event-dispatcher": "^1.0",
+    "psr/http-factory": "^1.0",
+    "psr/log": "^1.1|^2.0",
+    "michel/dotenv": "^1.0",
+    "michel/router": "^1.0",
+    "michel/options-resolver": "^1.0",
+    "michel/console": "^1.0",
+    "michel/vardumper": "^1.0",
+    "michel/psr14-event-dispatcher": "^1.0",
+    "michel/pure-plate": "^2.0@alpha",
+    "michel/michel-package-starter": "^1.0"
+  },
+  "require-dev": {
+    "michel/unitester": "^1.0.0"
+  }
 }

+ 4 - 4
src/BaseKernel.php

@@ -125,17 +125,17 @@ abstract class BaseKernel
         return App::createContainer($definitions, ['cache_dir' => $this->getCacheDir()]);
     }
 
-    final protected function logException(Throwable $exception, ServerRequestInterface  $request): void
+    final protected function logException(Throwable $exception, ServerRequestInterface $request): void
     {
         $this->log([
             '@timestamp' => (new DateTimeImmutable())->format('c'),
             'log.level' => 'error',
             'id' => $request->getAttribute('request_id'),
+            'message' => $exception->getMessage(),
             'http.request' => [
                 'method' => $request->getMethod(),
                 'url' => $request->getUri()->__toString(),
             ],
-            'message' => $exception->getMessage(),
             'error' => [
                 'code' => $exception->getCode(),
                 'stack_trace' => $exception->getTrace(),
@@ -145,7 +145,7 @@ abstract class BaseKernel
                 'file' => $exception->getFile(),
                 'line' => $exception->getLine(),
             ],
-        ]);
+        ], sprintf('%s_request_error.log', $this->getEnv()));
     }
 
     final protected function log(array $data, string $logFile = null): void
@@ -208,7 +208,7 @@ abstract class BaseKernel
     private function configureErrorHandling(): void
     {
         ini_set("log_errors", '1');
-        ini_set("error_log", $this->getLogDir() . '/error_log.log');
+        ini_set("error_log", filepath_join($this->getLogDir(), sprintf('%s_error.log', $this->getEnv())));
 
         if ($this->getEnv() === 'dev') {
             ErrorHandler::register();

+ 9 - 1
src/ErrorHandler/ErrorHandler.php

@@ -53,7 +53,15 @@ final class ErrorHandler
         if (ini_get('error_log')) {
             error_log($message);
         }
-        echo $message;
+
+        if (php_sapi_name() == 'cli' || php_sapi_name() == 'phpdbg') {
+            echo $message;
+        }else {
+            $acceptsHeaders = explode(',', getallheaders()['Accept'] ?? []);
+            $handler = new ExceptionHandler(response_factory(), ['debug' => true,]);
+            $response = $handler->renderByMimetype($acceptsHeaders[0] ?? 'text/html', $exception);
+            \send_http_response($response);
+        }
         exit(1);
     }
 

+ 13 - 6
src/ErrorHandler/ExceptionHandler.php

@@ -2,6 +2,7 @@
 
 namespace Michel\Framework\Core\ErrorHandler;
 
+use InvalidArgumentException;
 use Michel\Framework\Core\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
 use Michel\Framework\Core\ErrorHandler\ErrorRenderer\JsonErrorRenderer;
 use Michel\Framework\Core\Http\Exception\HttpException;
@@ -19,36 +20,42 @@ class ExceptionHandler
     public function __construct(ResponseFactoryInterface $responseFactory, array $options = [])
     {
         $this->responseFactory = $responseFactory;
-        
+
         $debug = $options['debug'] ?? false;
-        
+
         if (!isset($options['json_response'])) {
             $options['json_response'] = new JsonErrorRenderer($this->responseFactory, $debug);
         } elseif (!is_callable($options['json_response'])) {
-            throw new \InvalidArgumentException('Option "json_response" must be callable.');
+            throw new InvalidArgumentException('Option "json_response" must be callable.');
         }
 
         if (!isset($options['html_response'])) {
             $options['html_response'] = new HtmlErrorRenderer($this->responseFactory, $debug);
         } elseif (!is_callable($options['html_response'])) {
-             throw new \InvalidArgumentException('Option "html_response" must be callable.');
+            throw new InvalidArgumentException('Option "html_response" must be callable.');
         }
 
         $this->options = $options;
     }
 
-    public function render(ServerRequestInterface $request, Throwable $exception): ResponseInterface
+    public function renderByMimetype(string $mimeType, Throwable $exception): ResponseInterface
     {
         if (!$exception instanceof HttpExceptionInterface) {
             $exception = new HttpException(500, $exception->getMessage(), $exception->getCode(), $exception);
         }
 
-        if ($request->getHeaderLine('accept') === 'application/json') {
+        $mimeType = strtolower($mimeType);
+        if ($mimeType === 'application/json') {
             return $this->renderJsonResponse($exception);
         }
         return $this->renderHtmlResponse($exception);
     }
 
+    public function render(ServerRequestInterface $request, Throwable $exception): ResponseInterface
+    {
+        return $this->renderByMimetype($request->getHeaderLine('accept'), $exception);
+    }
+
     protected function renderJsonResponse(HttpExceptionInterface $exception): ResponseInterface
     {
         $renderer = $this->options['json_response'];

+ 2 - 2
src/Middlewares/DebugMiddleware.php

@@ -6,7 +6,7 @@ namespace Michel\Framework\Core\Middlewares;
 
 use Michel\Framework\Core\Debug\DebugDataCollector;
 use Michel\Framework\Core\Debug\RequestProfiler;
-use Michel\Renderer\PurePlate;
+use Michel\PurePlate\PhpRenderer;
 use Michel\Resolver\Option;
 use Michel\Resolver\OptionsResolver;
 use Psr\Http\Message\ResponseInterface;
@@ -62,7 +62,7 @@ final class DebugMiddleware implements MiddlewareInterface
         $requestProfilerData = $this->requestProfiler->stop();
         if ($this->profiler) {
             if (strpos($response->getHeaderLine('Content-Type'), 'text/html') !== false) {
-                $renderer = new PurePlate(dirname(__DIR__) . '/../resources/debug');
+                $renderer = new PhpRenderer(dirname(__DIR__) . '/../resources/debug');
                 $debugBarHtml = $renderer->render('debugbar.html.php', [
                     'profiler' => $requestProfilerData,
                 ]);

+ 12 - 14
src/Package/MichelCorePackage.php

@@ -22,15 +22,13 @@ use Michel\Framework\Core\Middlewares\ForceHttpsMiddleware;
 use Michel\Framework\Core\Middlewares\IpRestrictionMiddleware;
 use Michel\Framework\Core\Middlewares\MaintenanceMiddleware;
 use Michel\Package\PackageInterface;
+use Michel\PurePlate\Engine;
 use Michel\Route;
 use Michel\Router;
 use Michel\RouterInterface;
 use Michel\RouterMiddleware;
-use Michel\Renderer\PurePlate;
 use Psr\Container\ContainerInterface;
 use Psr\EventDispatcher\EventDispatcherInterface;
-use Twig\Environment;
-use Twig\Loader\FilesystemLoader;
 use function getenv;
 
 final class MichelCorePackage implements PackageInterface
@@ -68,17 +66,17 @@ final class MichelCorePackage implements PackageInterface
                 return new CommandRunner($commands);
             },
             'render' => static function (ContainerInterface $container) {
-                if (class_exists(Environment::class)) {
-                    $loader = new FilesystemLoader($container->get('app.template_dir'));
-                    return new Environment($loader, [
-                        'debug' => $container->get('michel.debug'),
-                        'cache' => $container->get('michel.environment') == 'dev' ? false : $container->get('michel.cache_dir'),
-                    ]);
-                } elseif (class_exists(PurePlate::class)) {
-                    return new PurePlate($container->get('app.template_dir'));
-                }
-
-                throw new LogicException('The "render" requires a Renderer to be available. You can choose between installing "michel/pure-plate" or "twig/twig" depending on your preference.');
+                return $container->get(Engine::class);
+            },
+            Engine::class => static function (ContainerInterface $container) {
+                return new Engine(
+                    $container->get('app.template_dir'),
+                    $container->get('michel.environment') === 'dev',
+                    filepath_join($container->get('michel.cache_dir'), 'pure'),
+                    [
+                        '_container' => $container
+                    ]
+                );
             },
             RouterInterface::class => static function (ContainerInterface $container): object {
                 /**