💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Application ***** The Application`Slim\App`is the entry point to your Slim application and is used to register the routes that link to your callbacks or controllers. 应用程序`Slim\App`是Slim应用程序的入口点,用于注册链接到回调或控制器的路由。 ~~~php <?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require __DIR__ . '/../vendor/autoload.php'; // Instantiate app $app = AppFactory::create(); // Add Error Handling Middleware $app->addErrorMiddleware(true, false, false); // Add route callbacks $app->get('/', function (Request $request, Response $response, array $args) { $response->getBody()->write('Hello World'); return $response; }); // Run application $app->run(); ~~~ ## Advanced Notices and Warnings Handling ## 预先通知和警告处理 **Warnings**and**Notices**are not caught by default. If you wish your application to display an error page when they happen, you will need to implement code similar to the following`index.php`. **警告**和**通知**默认不被捕获。如果您希望您的应用程序在错误发生时显示一个错误页面,您将需要实现类似于以下`index.php`的代码。 ~~~php <?php use MyApp\Handlers\ErrorHandler; use MyApp\Handlers\ShutdownHandler; use Slim\Exception\HttpInternalServerErrorException; use Slim\Factory\AppFactory; use Slim\Factory\ServerRequestCreatorFactory; require __DIR__ . '/../vendor/autoload.php'; // Set that to your needs $displayErrorDetails = true; $app = AppFactory::create(); $callableResolver = $app->getCallableResolver(); $responseFactory = $app->getResponseFactory(); $serverRequestCreator = ServerRequestCreatorFactory::create(); $request = $serverRequestCreator->createFromGlobals(); $errorHandler = new HttpErrorHandler($callableResolver, $responseFactory); $shutdownHandler = new ShutdownHandler($request, $errorHandler, $displayErrorDetails); register_shutdown_function($shutdownHandler); // Add Routing Middleware $app->addRoutingMiddleware(); // Add Error Handling Middleware $errorMiddleware = $app->addErrorMiddleware($displayErrorDetails, false, false); $errorMiddleware->setDefaultErrorHandler($errorHandler); $app->run(); ~~~ ## Advanced Custom Error Handler ## 高级自定义错误处理程序 ~~~php <?php namespace MyApp\Handlers; use Psr\Http\Message\ResponseInterface; use Slim\Exception\HttpBadRequestException; use Slim\Exception\HttpException; use Slim\Exception\HttpForbiddenException; use Slim\Exception\HttpMethodNotAllowedException; use Slim\Exception\HttpNotFoundException; use Slim\Exception\HttpNotImplementedException; use Slim\Exception\HttpUnauthorizedException; use Slim\Handlers\ErrorHandler; use Exception; use Throwable; class HttpErrorHandler extends ErrorHandler { public const BAD_REQUEST = 'BAD_REQUEST'; public const INSUFFICIENT_PRIVILEGES = 'INSUFFICIENT_PRIVILEGES'; public const NOT_ALLOWED = 'NOT_ALLOWED'; public const NOT_IMPLEMENTED = 'NOT_IMPLEMENTED'; public const RESOURCE_NOT_FOUND = 'RESOURCE_NOT_FOUND'; public const SERVER_ERROR = 'SERVER_ERROR'; public const UNAUTHENTICATED = 'UNAUTHENTICATED'; protected function respond(): ResponseInterface { $exception = $this->exception; $statusCode = 500; $type = self::SERVER_ERROR; $description = 'An internal error has occurred while processing your request.'; if ($exception instanceof HttpException) { $statusCode = $exception->getCode(); $description = $exception->getMessage(); if ($exception instanceof HttpNotFoundException) { $type = self::RESOURCE_NOT_FOUND; } elseif ($exception instanceof HttpMethodNotAllowedException) { $type = self::NOT_ALLOWED; } elseif ($exception instanceof HttpUnauthorizedException) { $type = self::UNAUTHENTICATED; } elseif ($exception instanceof HttpForbiddenException) { $type = self::UNAUTHENTICATED; } elseif ($exception instanceof HttpBadRequestException) { $type = self::BAD_REQUEST; } elseif ($exception instanceof HttpNotImplementedException) { $type = self::NOT_IMPLEMENTED; } } if ( !($exception instanceof HttpException) && ($exception instanceof Exception || $exception instanceof Throwable) && $this->displayErrorDetails ) { $description = $exception->getMessage(); } $error = [ 'statusCode' => $statusCode, 'error' => [ 'type' => $type, 'description' => $description, ], ]; $payload = json_encode($error, JSON_PRETTY_PRINT); $response = $this->responseFactory->createResponse($statusCode); $response->getBody()->write($payload); return $response; } } ~~~ ## Advanced Shutdown Handler ## 先进的关闭处理程序 ~~~php <?php namespace MyApp\Handlers; use MyApp\Handlers\HttpErrorHandler; use Psr\Http\Message\ServerRequestInterface; use Slim\Exception\HttpInternalServerErrorException; use Slim\ResponseEmitter; class ShutdownHandler { /** * @var Request */ private $request; /** * @var HttpErrorHandler */ private $errorHandler; /** * @var bool */ private $displayErrorDetails; /** * ShutdownHandler constructor. * * @param Request $request * @param HttpErrorHandler $errorHandler * @param bool $displayErrorDetails */ public function __construct(Request $request, HttpErrorHandler $errorHandler, bool $displayErrorDetails) { $this->request = $request; $this->errorHandler = $errorHandler; $this->displayErrorDetails = $displayErrorDetails; } public function __invoke() { $error = error_get_last(); if ($error) { $errorFile = $error['file']; $errorLine = $error['line']; $errorMessage = $error['message']; $errorType = $error['type']; $message = 'An error while processing your request. Please try again later.'; if ($this->displayErrorDetails) { switch ($errorType) { case E_USER_ERROR: $message = "FATAL ERROR: {$errorMessage}. "; $message .= " on line {$errorLine} in file {$errorFile}."; break; case E_USER_WARNING: $message = "WARNING: {$errorMessage}"; break; case E_USER_NOTICE: $message = "NOTICE: {$errorMessage}"; break; default: $message = "ERROR: {$errorMessage}"; $message .= " on line {$errorLine} in file {$errorFile}."; break; } } $exception = new HttpInternalServerErrorException($this->request, $message); $response = $this->errorHandler->__invoke($this->request, $exception, $this->displayErrorDetails, false, false); if (ob_get_contents()) { ob_clean(); } $responseEmitter = new ResponseEmitter(); $responseEmitter->emit($response); } } } ~~~ # 官方实例 [Slim-Skeleton](https://github.com/slimphp/Slim-Skeleton)