Laravel 서비스 용기 의 장점 을 상세히 이해 하 다.

개술
laravel 서비스 용 기 는 고도 로 자동 화 된 공장 과 같 습 니 다.필요 한 것 은 모델 을 맞 추고 특정한 인 터 페 이 스 를 사용 하여 만 듭 니 다.
서비스 용 기 를 사 용 했 기 때문에 laravel 의 대부분 대상 을 예화 하 는 방식 은 다음 과 같 습 니 다.

$obj1 = $container->make('class1', 'class2');
 
$obj2 = $container->make('class3', 'class4');
그러나 서비스 용 기 를 사용 하지 않 은 상태 에서 다음 과 같은 방식 으로 도 할 수 있다.

$obj1 = new class1(new class2());
 
$obj2 = new class3(new class4());
서비스 용 기 를 사용 하 는 장점
다음 에 우 리 는 구체 적 인 예 를 통 해 그의 장점 을 분석한다.
이메일
우 리 는 메 일 을 보 내 는 기능 을 하나의 클래스 로 봉 하여 사용 해 야 할 때,발송 방법 을 실례 화하 고 호출한다.
다음은 laravel 서비스 용 기 를 사용 하지 않 고 흔히 볼 수 있 는 방식 입 니 다.

/**
 
 *       
 
 */
 
class EmailService{
    public function send(){
        //todo       
    }
}
//                      
 
$emailService = new EmailService();
 
$emailService->send();
laravel 서비스 용 기 를 사용 한 후:

$this->app->bind('emailService', function ($app) {
    return new EmailService();
});
//                      
$emailService = app('emailService');
$emailService->send();
이 로 인해 우리 의 코드 는 더욱 간결 해 졌 고 중간 층 이 있 기 때문에 유연성 이 향상 되 었 다(디 결합).그러면 테스트(테스트 할 때 우 리 는 이메일 서비스 류 를 위조 하여 교체 할 수 있다)든 이메일 서비스 류 를 최적화 하 든 더욱 편리 해 졌 다.

//         
$this->app->bind('emailService', function ($app) {
    return new SupperEmailService();
});
다른 호출 된 부분 은 전혀 움 직 이지 않 습 니 다.만약 에 저희 가 이 바 인 딩 작업 이 없다 면 메 일 서 비 스 를 사용 하 는 모든 곳 에서 변경 해 야 합 니 다.

//   EamilSerice          
$emailService = new SupperEmailService();
$emailService->send();
예 2.단일 모델 실현
또한 위의 예 입 니 다.성능 을 고려 하여 SupperEamilService 류 가 단일 모드 를 실현 해 야 합 니 다.따라서 laravel 서비스 용 기 를 사용 하지 않 은 상태 에서 SupperEmailService 류 를 다음 과 같이 변경 합 니 다.

class SupperEamilService{
    //               
    static private $instance;
    //        
    private function __construct(){
        
    }
    //      
    private function __clone(){

    }
    static public function getInstance(){
        //  $instance   Uni   
        //     
        if (!self::$instance instanceof self) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    //      
    public function send(){

    }

}
그 밖 에 현재 SupperEamilService 류 구조 함수 가 사유 이기 때문에 new 키 워드 를 통 해 대상 을 예화 할 수 없 기 때문에 모든 예화 SupperEmailService 류 의 곳 에서 다음 과 같이 변경 해 야 합 니 다.

$emailService=SupperEmailService::getInstance();
$emailService->send();
laravel 서비스 용 기 는 천성적으로 하나의 예 를 지원 합 니 다.다음은 laravel 의 실현 방식 입 니 다.

//    bind  singleton
$this->app->singleton('emailService', function ($app) {
    return new SupperEmailService();
});
하나의 예 를 실현 하려 면 심지어 한 줄 의 코드 만 바 꾸 고 원래 의 bid 방법 을 singleton 으로 바 꾸 어야 합 니 다.용 기 를 통 해 꺼 낸 것 이 하나의 예 입 니 다.정말 편리 합 니 다.
여행자
이 예 는 한 여행자 가 티베트 로 여행 을 간다 고 가정 하면 기차(train)를 타 거나 걸 어서 갈 수 있다.
laravel 서비스 용 기 를 사용 하지 않 음:

<?php
interface TrafficTool{
    public function go();
}
class Train implements TrafficTool{
    public function go(){
        echo "train....";
    }

}
class Leg implements TrafficTool{
    public function go(){
        echo "leg..";
    }
}
class Traveller{
    /**
    * @var Leg|null|Train
    *     
    */
    protected $_trafficTool;
    public function __construct(TrafficTool $trafficTool){
        $this->_trafficTool = $trafficTool;
    }
    public function visitTibet() {
        $this->_trafficTool->go();
    }

}
여행자 가 기 차 를 타고 여행 을 가 려 면 보통 우 리 는 이렇게 쓴다.

<?php
$train = new Train();
$tra = new Traveller($train);
$tra->visitTibet();
사실 이런 표기 법 은 이미 매우 좋다.왜냐하면 여행 도구 에 대한 의존 은 이미 인 터 페 이 스 를 통 해 외부 로 옮 겨 졌 기 때문이다.그러나 new 를 사용 하여 대상 을 예화 할 때 의존 이 생 긴 다.예 를 들 어 위의 trafficTool)은 우리 가 Traveller 를 만 들 기 전에$trafficTool,즉 Traveller 가 trafficTool 에 의존 해 야 한 다 는 것 을 의미한다.new 를 사용 하여 Traveller 와 trafficTool 사이 에 결합 이 생 겼 다.그러면 이 두 구성 요 소 는 분리 할 수 없다.
이제 laravel 서비스 용 기 를 사용 하 는 것 이 어떻게 실현 되 는 지 살 펴 보 겠 습 니 다.
서비스 용기 에 클래스 바 인 딩

<?php
namespace App\Providers;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider{
    public function register(){
        //         
        $this->app->bind( 'TrafficTool', 'Train');
        $this->app->bind('Traveller', 'Traveller');
    }
}
실례 화 대상

<?php
//      
$tra = app()->make('Traveller');
$tra->visitTibet();
우리 가 서비스 용 기 를 사용 하여 여행 류 의 대상 을 가 져 올 때 용 기 는 대상 이 필요 로 하 는 인 자 를 자동 으로 주입 합 니 다.그 전에 저 는 특정한 유형 만 연결 하면 됩 니 다.이렇게 해 야 진정한 자동 화 를 나타 내 고 여행 류 와 여행 도구 류 를 완전히 결합 시 켰 습 니 다.우리 가 여행 방식 을 바 꿔 야 할 때,우 리 는 바 인 딩 만 바 꾸 면 된다.
총결산
위 에 몇 가지 간단 한 예 를 들 어 laravel 서비스 용 기 를 완전히 이해 하고 파악 할 수 있다 면 실제 개발 에서 더 많은 편 의 를 제공 할 것 이다.물론 완벽 한 것 도 아니 지만,어쨌든 실제 사용 에서 장점 을 살 리 고 단점 을 피 하 는 것 이 관건 이다.
이상 은 Laravel 서비스 용기 의 장점 에 대한 상세 한 내용 입 니 다.Laravel 서비스 용기 의 장점 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기