PHP DI(pimple) 사용

PHP로 DI를 만들고 싶어 핌플로 간단히 해봤어요.
나는 이것이 가장 좋은 것인지 전혀 모른다.

독자 대상


디라는 단어를 들어보신 분.
Laavel에서 서비스 용기라는 단어를 들어보신 분.

용어의 정리


DI
외부에서 필요한 인스턴스 가져오기
DI 컨테이너
DI에 편리한 장치, 상자.
설정을 적으면 괜찮을 것 같아요.
주제 밖의 말을 하자면 라벨도 이 조직이 있는데 그걸'서비스 용기'라고 부르는 것 같다.

먼저 DI 모드가 아님

<?php

class Message
{
    private $message;

    public function __construct()
    {
        $this->setMessage();
    }

    private function setMessage (): void
    {
        $this->message = 'こんにちは世界';
    }

    public function getMessage(): string
    {
        return $this->message;
    }
}

class Call
{
    private $message;

    function __construct()
    {
        // 必要なインスタンスを得るためにクラスの内部でインスタンス化しています。
        // 注入にはなっていません。
        $this->message = new Message();
    }

    function callMessage () {
        echo $this->message->getMessage();
    }
}

$call = new Call();

$call->callMessage();

// こんにちは世界

수동 DI


class Call
{
    private $message;

    function __construct(Message $message)
    {
        $this->message = $message;
    }

    function callMessage () {
        echo $this->message->getMessage();
    }
}

// ここで手動でインスタンスを注入しています。
$message = new Message();
$call = new Call($message);

$call->callMessage();
// こんにちは世界

수동 DI가 많아지면 곤란할 거야.


class Call
{
    private $message;

    function __construct(
        Message $message,
        Message2 $message2,
        Message3 $message3
    )
    {
        $this->message = $message;
        $this->message2 = $message2;
        $this->message3 = $message3;
    }

    function callMessage () {
        echo $this->message->getMessage();
        echo $this->message2->getMessage2();
        echo $this->message3->getMessage3();
    }
}

$message = new Message();
$message2 = new Message2();
$message3 = new Message3();

$call = new Call($message, $message2, $message3);

$call->callMessage();

// こんにちは世界こんにちは日本ハローアメリカ

pimple의 구조기를 사용하여 분사하는 예.구조기에 주입하다.

// インストール
$ ./composer.phar require pimple/pimple ~3.0
<?php

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

use Pimple\Container;

$container = new Container();

$container['Message'] = function ($c) {
    return new Message();
};

$container['Message2'] = function ($c) {
    return new Message2();
};

$container['Message3'] = function ($c) {
    return new Message3();
};

// ここでインスタンスをコンテナに入れている感じです。
$container['call'] = function ($c) {
    return new Call($c['Message'], $c['Message2'], $c['Message3']);
};

class Call
{
    private $message;

    function __construct(
        Message $message,
        Message2 $message2,
        Message3 $message3
    )
    {
        $this->message = $message;
        $this->message2 = $message2;
        $this->message3 = $message3;
    }

    function callMessage () {
        echo $this->message->getMessage();
        echo $this->message2->getMessage2();
        echo $this->message3->getMessage3();
    }
}

// この部分を端折ることができます。
//$message = new Message();
//$message2 = new Message2();
//$message3 = new Message3();
//
//$call = new Call($message, $message2, $message3);


$container['call']->callMessage();
// こんにちは世界こんにちは日本ハローアメリカ
설정 설명량이 많고 편리합니다.이런 느낌이지만 다른 반에서 설정을 쓰려면 쓸 때 주입하면 되기 때문에 편리하다.
부산물로서 테스트가 쉬워지고 인터페이스를 사용하여 인터페이스를 주입함으로써 학급 간의 관계를 희소하게 하고 유지보수성을 높일 수 있다.
참고 자료
PIMPLEA simple PHP
Dependency Injection Container
https://pimple.symfony.com/
프레임을 만들면서 Laavel의 아키텍처를 배워요.
https://speakerdeck.com/fendo181/learn-laravels-architecture-while-creating-a-framework?slide=109

좋은 웹페이지 즐겨찾기