Slim 框架使用依赖容器来预载、管理和注入应用依赖。支持 PSR-11 或 Container-Interop 标准接口形式,框架内置 Pimple 容器,也可以使用 Acclimate 或 PHP-DI 等第三方的容器。
你不具备提供相关性的容器。但是,如果这样做,则必须将容器实例注入Slim应用程序的构造函数中。
$container = new \Slim\Container;
$app = new \Slim\App($container);
向Slim容器添加服务:
$container = $app->getContainer();
$container['myService'] = function ($container) {
$myService = new MyService();
return $myService;
};
接下来,可以在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;
});
要在使用之前测试容器中是否存在服务,请使用以下 has() 方法:
/**
* 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) {
if($this->has('myService')) {
$myService = $this->myService;
}
return $res;
});
Slim使用__get()和__isset()魔术方法,用于应用程序实例上尚不存在的所有属性的应用程序容器。
如果您使用Slim的内置容器,可以不用理会下面的内容。
如果选择第三方容器,则必须自行定义这些必需的服务。
设置
应用程序设置的关联数组,包括键:
环境
实例 \Slim\Http\Environment。
请求
实例 \Psr\Http\Message\ServerRequestInterface。
响应
实例 \Psr\Http\Message\ResponseInterface。
路由器
实例 \Slim\Interfaces\RouterInterface。
foundHandler
实例 \Slim\Interfaces\InvocationStrategyInterface。
phpErrorHandler
如果抛出PHP 7错误,则调用Callable。可调用的必须返回一个实例
\Psr\Http\Message\ResponseInterface 并接受三个参数:
errorHandler
如果抛出异常,则调用Callable。可调用的必须返回一个实例
\Psr\Http\Message\ResponseInterface 并接受三个参数:
notFoundHandler
如果当前HTTP请求URI与应用程序路由不匹配,则调用Callable。可调用的必须返回一个实例
\Psr\Http\Message\ResponseInterface 并接受两个参数:
notAllowedHandler
如果应用程序路由与当前HTTP请求路径匹配但不与其方法匹配,则调用Callable。可调用的必须必须返回一个实例
\Psr\Http\Message\ResponseInterface 并接受三个参数:
实例 \Slim\Interfaces\CallableResolverInterface。