依赖容器(Dependency Container)

Slim 使用依赖容器来准备、管理和注入应用程序的相关依赖。Slim 支持 Container-Interop 接口实现的容器。你可以使用 Slim 的内置容器(基于 Pimple)或者第三方的容器,比如 AcclimatePHP-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 的实例,并接收三个参数:

  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 的实例.