依赖容器(Dependency Container)

最后更新于:2022-04-01 22:33:43

# 依赖容器(Dependency Container) Slim 使用依赖容器来准备、管理和注入应用程序的相关依赖。Slim 支持 [Container-Interop](https://github.com/container-interop/container-interop) 接口实现的容器。你可以使用 Slim 的内置容器(基于 [Pimple](http://pimple.sensiolabs.org/))或者第三方的容器,比如 [Acclimate](https://github.com/jeremeamia/acclimate-container) 或 [PHP-DI](http://php-di.org/)。 ## 如何使用容器 你并不_必须_提供一个依赖容器。如果你提供了,那么,你必须注入此容器的实例到 Slim 应用程序的构造函数中。 ``` $container = new \Slim\Container; $app = new \Slim\App($container); ``` 你可以显式或隐式地从依赖容器中获取服务。你可以像下面这样子从 Slim 应用程序的路由中获取一个显示的容器实例。 ``` /** * Example GET route * * @param \Psr\Http\Message\ServerRequestInterface $req PSR7 request * @param \Psr\Http\Message\ResponseInterface $res PSR7 response * @param array $args Route parameters * * @return \Psr\Http\Message\ResponseInterface */ $app->get('/foo', function ($req, $res, $args) { $myService = $this->get('myService'); return $res; }); ``` 你可以这样隐式地从容器中取得服务: ``` /** * Example GET route * * @param \Psr\Http\Message\ServerRequestInterface $req PSR7 request * @param \Psr\Http\Message\ResponseInterface $res PSR7 response * @param array $args Route parameters * * @return \Psr\Http\Message\ResponseInterface */ $app->get('/foo', function ($req, $res, $args) { $myService = $this->myService; return $res; }); ``` Slim uses `__get()` and `__isset()` magic methods that defer to the application’s container for all properties that do not already exist on the application instance. ## 必需的服务 你的容器必须实现这些必需的服务。如果你使用的是 Slim 内置的容器,这些服务都是已经准备好了的。如果你选择使用第三方容器,那么你必须自己来实现这些服务。 settings 应用程序设置项的关联数组(Associative array),包括以下关键字: * `httpVersion` * `responseChunkSize` * `outputBuffering` * `determineRouteBeforeAppMiddleware`. * `displayErrorDetails`. environment `\Slim\Interfaces\Http\EnvironmentInterface` 的实例. request `\Psr\Http\Message\ServerRequestInterface`的实例. response `\Psr\Http\Message\ResponseInterface`的实例. router `\Slim\Interfaces\RouterInterface`的实例. foundHandler `\Slim\Interfaces\InvocationStrategyInterface` 的实例. phpErrorHandler PHP 7 错误被抛出时调用的 Callable。这个 callable **必须**返回一个 `\Psr\Http\Message\ResponseInterface` 的实例,并接收三个参数: 1. `\Psr\Http\Message\ServerRequestInterface` 2. `\Psr\Http\Message\ResponseInterface` 3. `\Error` errorHandler 抛出异常时调用的 Callable。这个 callable **必须**返回一个 `\Psr\Http\Message\ResponseInterface` 的实例,并接收三个参数: 1. `\Psr\Http\Message\ServerRequestInterface` 2. `\Psr\Http\Message\ResponseInterface` 3. `\Exception` notFoundHandler 如果当前的 HTTP 请求 URI 未能匹配到应用程序路由,则调用这个 Callable。这个 callable **必须**返回一个 `\Psr\Http\Message\ResponseInterface` 的实例,并接收三个参数: 1. `\Psr\Http\Message\ServerRequestInterface` 2. `\Psr\Http\Message\ResponseInterface` notAllowedHandler 如果一个应用程序路由匹配到当前 HTTP 请求的路径而不是它的方法,则调用这个 Callable。这个 callable **必须** 返回一个 `\Psr\Http\Message\ResponseInterface` 的实例并接收三个参数: 1. `\Psr\Http\Message\ServerRequestInterface` 2. `\Psr\Http\Message\ResponseInterface` 3. Array of allowed HTTP methods callableResolver `\Slim\Interfaces\CallableResolverInterface` 的实例.
';