서비스 프로바이더는 라라벨 부팅과정(시작시)에 확장기능을 추가하여 사용할 수 있게 한다.
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]
인자로 받은것과 동일하게 의존성이 모두 해결되어서 나온다. 파사드가 이렇게 편리하다.