Slim Framework 매뉴얼 컨셉 종속성 컨테이너 (Dependency Container)

slim framework
slim framework

종속성 컨테이너 (Dependency Container)

Slim은 선택적 종속성 컨테이너를 사용하여 애플리케이션 종속성을 준비, 관리 및 주입합니다. Slim은 PHP-DI와 같이 PSR-11를 구현하는 컨테이너를 지원한다.

PHP-DI를 사용한 사용 예

종속 컨테이너를 제공할 필요가 없습니다. 그러나 그럴 경우 AppFactory를 만들기 전에 컨테이너의 인스턴스를 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