라라벨에서 파사드 시작하기

8689 단어 phplaravel
라라벨의 Facades를 사용하면 마치 정적 메소드인 것처럼 비정적 메소드를 호출할 수 있습니다. 이렇게 하면 사용할 때마다 개체를 만들 필요 없이 특정 클래스의 메서드를 호출할 수 있습니다. 기본적으로 서비스 컨테이너를 사용하는 것과 동일한 이점이 있습니다.

Laravel로 우리 자신의 Facades를 구현하는 방법을 살펴보기 전에 먼저 Laravel이 Facades를 사용하는 방법에 대한 몇 가지 예를 살펴보겠습니다.

Laravel 프레임워크는 Facades를 vendor/laravel/frameworks/src/Illuminate/Support/Facades 디렉토리에 저장합니다. 거기에서 DB.php , View.php , Validator.php , Request.php 와 같은 익숙한 것을 볼 수 있습니다. 이러한 파일 중 하나를 열면 다음과 같은 코드가 표시됩니다.

class DB extends Facade
{

    protected static function getFacadeAccessor()
    {
        return 'db';
    }
}


이 클래스는 Facade 클래스(같은 디렉토리에 있는 Facade.php)를 확장합니다. 그것을 열면 테스트 목적으로 많은 방법이 표시됩니다. 우리는 오늘 그것들을 다루지 않을 것입니다. 대신 __callStatic 메서드에 중점을 둘 것입니다. 이 메서드는 확장 클래스(예: getFacadeAccesor() 클래스)에서 DB 메서드를 호출하고 해당 메서드에서 반환되는 클래스의 인스턴스를 확인합니다. 이 경우 db 클래스입니다.

기본Facade 클래스에서 메서드 호출을 추적하려고 해도 정말 혼란스럽게 들립니다. 그럼 먼저 간단한 예를 살펴보겠습니다.
app/ShowName.php 파일을 만들고 다음을 추가합니다.

<?php
namespace App;

class ShowName {

    public static function __callStatic($method, $arguments)
    {
        dd($method);
    }
}


그런 다음 routes/web.php 파일에 다음 경로를 추가합니다.

Route::get('show', function(App\ShowName $obj) {

    $obj::someMethodName('cat', 'dog');
});


그러면 "somemethodName"또는 호출한 메서드가 출력되어야 합니다.

여기에서 메서드에 전달된 인수에 액세스할 수도 있습니다.

dd($arguments);


그러면 다음 출력이 표시됩니다.

array:2 [▼
  0 => "cat"
  1 => "dog"
]


이것이 Facades 작동 방식의 기본 아이디어입니다. Facade에는 이 __callStatic() 메서드가 있어 서비스 컨테이너에서 기본을 확인합니다. 이것은 Facades가 실제로 서비스 컨테이너를 사용하는 것을 대체하지 않는다는 것을 의미합니다. 메서드를 더 쉽게 호출할 수 있도록 하는 보완 기능입니다.

이제 Facades가 배후에서 어떻게 작동하는지 알았으므로 이제 직접 구현해 보겠습니다.

이전의 app/ShowName.php 파일을 열고 __callStatic() 메서드를 다음으로 업데이트합니다.

public static function __callStatic($method, $arguments)
{
    return (self::resolveFacade('ShowName'))->$method(...$arguments);
}


그런 다음 이 메서드를 추가합니다.

public static function resolveFacade($name)
{
    return app()[$name];
}


이 메서드는 서비스 컨테이너에서 특정 클래스를 확인합니다. 이것은 앱 서비스 공급자에서 Facade를 바인딩하는 경우에만 작동합니다.

// app/Providers/AppServiceProvider.php

$this->app->bind('ShowName', function () {
    return new ShowNameService;
});

ShowNameService에는 다음이 포함됩니다.

<?php
// app/Services/ShowNameService.php

namespace App\Services;

class ShowNameService {

    public function hello($name)
    {
        return 'hello ' . $name;
    }
}


그런 다음 config/app.php 파일을 열고 aliases 배열에 새 항목을 추가합니다.

'aliases' => [
    // ...
    'ShowName' => App\ShowName::class, // add this
],


완료되면 이제 ShowNameService 파사드를 사용하여 ShowName 클래스에서 메서드를 호출할 수 있습니다.

Route::get('hello', function() {

    return ShowName::hello('cat'); // outputs: "hello cat"
});


그런 다음 ShowNameService 클래스에 새 메서드를 추가하는 경우:

public function hi($name)
{
    return 'hi ' . $name;
}


여전히 Facade를 통해 호출할 수 있어야 합니다.

ShowName::hi('cat'); // outputs: "hi cat"


matthaeus의 표지 이미지: https://unsplash.com/photos/hew8vAvvvz4

좋은 웹페이지 즐겨찾기