Dependency Container
最后更新于:2022-04-01 04:24:23
# Dependency Container
Slim uses a dependency container to prepare, manage, and inject application dependencies. Slim supports containers that implement the [Container-Interop](https://github.com/container-interop/container-interop) interface. You can use Slim’s built-in container (based on [Pimple](http://pimple.sensiolabs.org/)) or third-party containers like [Acclimate](https://github.com/jeremeamia/acclimate-container) or [PHP-DI](http://php-di.org/).
## How to use the container
You don’t *have* to provide a dependency container. If you do, however, you must inject the container instance into the Slim application’s constructor.
~~~
$container = new \Slim\Container;
$app = new \Slim\App($container);
~~~
You can fetch services from your container explicitly or implicitly. You can fetch an explicit reference to the container instance from inside a Slim application route like this:
~~~
/**
* 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) {
$container = $this->getContainer();
$myService = $container->get('myService');
return $res;
});
~~~
You can implicitly fetch services from the container like this:
~~~
/**
* 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.
## Required services
Your container MUST implement these required services. If you use Slim’s built-in container, these are provided for you. If you choose a third-party container, you must define these required services on your own.
### settings
Associative array of application settings, including keys `httpVersion`, `outputBuffering`,`responseChunkSize` and `determineRouteBeforeAppMiddleware`.
### environment
Instance of `\Slim\Interfaces\Http\EnvironmentInterface`.
### request
Instance of `\Psr\Http\Message\ServerRequestInterface`.
### response
Instance of `\Psr\Http\Message\ResponseInterface`.
### router
Instance of `\Slim\Interfaces\RouterInterface`.
### foundHandler
Instance of `\Slim\Interfaces\InvocationStrategyInterface`.
### errorHandler
Callable invoked if application error. The callable MUST return an instance of`\Psr\Http\Message\ResponseInterface` and accept three arguments:
1. `\Psr\Http\Message\ServerRequestInterface`
2. `\Psr\Http\Message\ResponseInterface`
3. `\Exception`
### notFoundHandler
Callable invoked if the current HTTP request URI does not match an application route. The callable MUST return an instance of `\Psr\Http\Message\ResponseInterface` and accept two arguments:
1. `\Psr\Http\Message\ServerRequestInterface`
2. `\Psr\Http\Message\ResponseInterface`
### notAllowedHandler
Callable invoked if an application route matches the current HTTP request path but not its method. The callable MUST return an instance of `\Psr\Http\Message\ResponseInterface`and accept three arguments:
1. `\Psr\Http\Message\ServerRequestInterface`
2. `\Psr\Http\Message\ResponseInterface`
3. Array of allowed HTTP methods