依存項容器

Slim 使用一個可選的依存項容器來準備、管理和注入應用程式的依存項。Slim 支援實作PSR-11的容器,例如 PHP-DI

PHP-DI 的範例用法

不必提供依存項容器。但是,如果您有提供,則在建立 App 之前,您必須提供一個容器實例給 AppFactory

<?php

use DI\Container;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

// Create Container using PHP-DI
$container = new Container();

// Set container to create App with on AppFactory
AppFactory::setContainer($container);
$app = AppFactory::create();

將服務新增至您的容器

$container->set('myService', function () {
    $settings = [...];
    return new MyService($settings);
});

您可以明確的從您的容器中擷取服務,也可以像這樣從 Slim 應用程式路徑中擷取

/**
 * Example GET route
 *
 * @param  ServerRequestInterface $request  PSR-7 request
 * @param  ResponseInterface      $response  PSR-7 response
 * @param  array                  $args Route parameters
 *
 * @return ResponseInterface
 */
$app->get('/foo', function (Request $request, Response $response, $args) {
    $myService = $this->get('myService');

    // ...do something with $myService...

    return $response;
});

要在使用服務之前測試服務是否在容器中,請使用 has() 方法,就像這樣

/**
 * Example GET route
 *
 * @param  ServerRequestInterface $request  PSR-7 request
 * @param  ResponseInterface      $response  PSR-7 response
 * @param  array                  $args Route parameters
 *
 * @return ResponseInterface
 */
$app->get('/foo', function (Request $request, Response $response, $args) {
    if ($this->has('myService')) {
        $myService = $this->get('myService');
    }
    return $response;
});

透過容器組態應用程式

如果您想要建立已經在您的容器中定義依存項的 App,您可以使用 AppFactory::createFromContainer() 方法。

範例

<?php

use App\Factory\MyResponseFactory;
use DI\Container;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseFactoryInterface;
use Slim\Factory\AppFactory;

require_once __DIR__ . '/../vendor/autoload.php';

// Create Container using PHP-DI
$container = new Container();

// Add custom response factory
$container->set(ResponseFactoryInterface::class, function (ContainerInterface $container) {
    return new MyResponseFactory(...);
});

// Configure the application via container
$app = AppFactory::createFromContainer($container);

// ...

$app->run();

受支援的 App 依存項為

  • Psr\Http\Message\ResponseFactoryInterface
  • Slim\Interfaces\CallableResolverInterface
  • Slim\Interfaces\RouteCollectorInterface
  • Slim\Interfaces\RouteResolverInterface
  • Slim\Interfaces\MiddlewareDispatcherInterface