依赖容器(Dependency Container)

Slim 使用依赖容器来准备、管理和注入应用程序的相关依赖。Slim 支持 Container-Interop 接口实现的容器。你可以使用 Slim 的内置容器(基于 Pimple)或者第三方的容器,比如 AcclimatePHP-DI

如何使用容器

你并不必须提供一个依赖容器。如果你提供了,那么,你必须注入此容器的实例到 Slim 应用程序的构造函数中。

  1. $container = new \Slim\Container;
  2. $app = new \Slim\App($container);

你可以显式或隐式地从依赖容器中获取服务。你可以像下面这样子从 Slim 应用程序的路由中获取一个显示的容器实例。

  1. /**
  2. * Example GET route
  3. *
  4. * @param \Psr\Http\Message\ServerRequestInterface $req PSR7 request
  5. * @param \Psr\Http\Message\ResponseInterface $res PSR7 response
  6. * @param array $args Route parameters
  7. *
  8. * @return \Psr\Http\Message\ResponseInterface
  9. */
  10. $app->get('/foo', function ($req, $res, $args) {
  11. $myService = $this->get('myService');
  12. return $res;
  13. });

你可以这样隐式地从容器中取得服务:

  1. /**
  2. * Example GET route
  3. *
  4. * @param \Psr\Http\Message\ServerRequestInterface $req PSR7 request
  5. * @param \Psr\Http\Message\ResponseInterface $res PSR7 response
  6. * @param array $args Route parameters
  7. *
  8. * @return \Psr\Http\Message\ResponseInterface
  9. */
  10. $app->get('/foo', function ($req, $res, $args) {
  11. $myService = $this->myService;
  12. return $res;
  13. });

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
  • \ErrorerrorHandler

抛出异常时调用的 Callable。这个 callable 必须返回一个 \Psr\Http\Message\ResponseInterface 的实例,并接收三个参数:

  • \Psr\Http\Message\ServerRequestInterface
  • \Psr\Http\Message\ResponseInterface
  • \ExceptionnotFoundHandler

如果当前的 HTTP 请求 URI 未能匹配到应用程序路由,则调用这个 Callable。这个 callable 必须返回一个 \Psr\Http\Message\ResponseInterface 的实例,并接收三个参数:

  • \Psr\Http\Message\ServerRequestInterface
  • \Psr\Http\Message\ResponseInterfacenotAllowedHandler

如果一个应用程序路由匹配到当前 HTTP 请求的路径而不是它的方法,则调用这个 Callable。这个 callable 必须 返回一个 \Psr\Http\Message\ResponseInterface 的实例并接收三个参数:

  • \Psr\Http\Message\ServerRequestInterface
  • \Psr\Http\Message\ResponseInterface
  • Array of allowed HTTP methodscallableResolver

\Slim\Interfaces\CallableResolverInterface 的实例.