依赖容器(Dependency Container)
Slim 使用依赖容器来准备、管理和注入应用程序的相关依赖。Slim 支持 Container-Interop 接口实现的容器。你可以使用 Slim 的内置容器(基于 Pimple)或者第三方的容器,比如 Acclimate 或 PHP-DI。
如何使用容器
你并不必须提供一个依赖容器。如果你提供了,那么,你必须注入此容器的实例到 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
的实例,并接收三个参数:
\Psr\Http\Message\ServerRequestInterface
\Psr\Http\Message\ResponseInterface
\Error
errorHandler
抛出异常时调用的 Callable。这个 callable 必须返回一个 \Psr\Http\Message\ResponseInterface
的实例,并接收三个参数:
\Psr\Http\Message\ServerRequestInterface
\Psr\Http\Message\ResponseInterface
\Exception
notFoundHandler
如果当前的 HTTP 请求 URI 未能匹配到应用程序路由,则调用这个 Callable。这个 callable 必须返回一个 \Psr\Http\Message\ResponseInterface
的实例,并接收三个参数:
\Psr\Http\Message\ServerRequestInterface
\Psr\Http\Message\ResponseInterface
notAllowedHandler
如果一个应用程序路由匹配到当前 HTTP 请求的路径而不是它的方法,则调用这个 Callable。这个 callable 必须 返回一个 \Psr\Http\Message\ResponseInterface
的实例并接收三个参数:
\Psr\Http\Message\ServerRequestInterface
\Psr\Http\Message\ResponseInterface
- Array of allowed HTTP methods
callableResolver
\Slim\Interfaces\CallableResolverInterface
的实例.