# 依赖容器(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` 的实例.