Laravel Service Provider 와 Facade 예제 > IT 기술백서

IT 기술백서

직접 알아내거나 검색하기 귀찮아서 모아 둔 것

php | Laravel Service Provider 와 Facade 예제

본문

서비스 프로바이더는 라라벨 부팅과정(시작시)에 확장기능을 추가하여 사용할 수 있게 한다.

register 에서 바인딩시키고 boot 에서는 실제로 인스턴스화 될때 추가작업을 할 수 있다.

의존성을 알아서 제어해준다.

 

1. 자신이 사용할 대상 클래스가 아래와 같다고 간주한다.

 

App\Payment.php 

[code]

<?php

namespace App;


class Payment

{

    private $str;


    public function __construct($str)

    {

        $this->str = $str;

    }


    public function process()

    {

        echo $this->str;

    }

}

[/code]


2. ServiceProvider 를 만든다.

App\Provider\PaymentServiceProvider.php

[code]

<?php

namespace App\Providers;


use Illuminate\Support\ServiceProvider;


use App\Payment;


class PaymentServiceProvider extends ServiceProvider

{

    public function register() {

        $this->app->bind(Payment::class, function($app) {

            return new Payment("가즈아~");

        });

    }


    public function boot() {

        

    }

}

[/code]

 

3. config/app.php 의 Provider 항목에 추가해준다.

[code]

'providers' => [

  ...

  App\Providers\PaymentServiceProvider::class,

]

[/code]

 

프로바이더 생성이 끝났다.  컨트롤러에서 사용해보자.

App\Http\Controllers\TestController.php

[code]

<?php

namespace App\Http\Controllers;


use Illuminate\Http\Request;


class TestController extends Controller

{

    public function test(Request $request, \App\Payment $payment)

    {

        $payment->process();

    }

}

[/code]

 

출력결과

[code]

가즈아~

[/code]

 

test() 메소드에서 인자로만 받았을 뿐인데 $str 에 "가즈아~" 가 이미 등록되어서 출력된다.  문자열이 아니라 클래스를 넣는다고 가정할때 내부적인 의존적 객체들이 자동으로 만들어져 나온다.  아주 편리하다.


이제 여기서 더 편하게 Facade 를 만들어 보자.

Payment 의 메소드 process() 는 static 메소드가 아니다.

파사드를 이용한다면 이를 마치 static 메소드처름 이용할 수 있다.

그리고 역시 의존성이 다 해결되어 생성되기 때문에 편리하다.

 

1. 위의 PaymentServiceProvider.php 에서 bind 항목에 클래스명 대신 임의의 이름으로 수정해준다.

여기서는 payment 라고 하겠다.

[code]

...

        $this->app->bind('payment', function($app) {

            return new Payment("가즈아~");

        });

...

[/code]

 

2. 파사드 클래스를 만들어준다.  여기서는 App\Helpers\Payment.php 에 만들어줬다.

[code]

<?php

namespace App\Helpers;


use Illuminate\Support\Facades\Facade;


class Payment extends Facade {

    protected static function getFacadeAccessor() {

        return 'payment'; // 서비스 프로바이더에서 정해준 이름

    }

}

[/code]

 

3. 파사드를 config/app.php 에 등록해준다.

[code]

'aliases' => [

    ...

    'Payment' => App\Helpers\Payment::class,  // 앞에 Payment 는 use 를 할때 사용하는 이름이다.

]

[/code]

 

준비는 끝났다.  위에 App\Http\Controller\TestController.php 를 아래와 같이 수정한다.

test() 메소드의 인자로 받지 않고 바로 생성해서 쓴다.

[code]

<?php

namespace App\Http\Controllers;


use Illuminate\Http\Request;


use Payment; // config/app.php 에서 지정한 이름


class TestController extends Controller

{

    public function test()

    {

        Payment::process(); // 이렇게 사용한다.

    }

}

[/code]

출력결과

[code]

가즈아~

[/code]

 

인자로 받은것과 동일하게 의존성이 모두 해결되어서 나온다.  파사드가 이렇게 편리하다.

 

댓글 0개

등록된 댓글이 없습니다.

Menu