laravel 용기 지연 로드 및 auth 확장 상세 설명

어제 매 뉴 얼 튜 토리 얼 에 따라 Auth 확장 을 쓰기 시 작 했 습 니 다.패키지 독립 성 원칙 에 따라 Auth:extend()라 는 방법 을 start.phop 에 쓰 고 싶 지 않 습 니 다.저 는 서비스 제공 기 register()방법 에 확장 드라이브 를 등록 하 는 것 을 선 택 했 습 니 다.그러나 일이 뜻 대로 되 지 않 았 다.
문제점 을 발견 하 다
내 가 Loauth Service Provider 에 이렇게 썼 을 때:

public function register()
{
    //
    \Auth::extend('loauth',function($app){});
}
잘못 을 보고 하 다

Call to undefined method Illuminate\Support\Facades\Auth::extend()
원인 을 찾다
그 때 는 궁금 했다.이 유 를 찾 아 Auth 가 등록 하지 않 았 다 고 의심 했다?경로 에서 사용 할 수 있 기 때문에 등 록 된 것 을 확인 합 니 다.php artisan clear-copiled 소 용 없어 요.아무리 생각해 도 이해 가 안 되 고 내 가 실수 로 핵심 류 를 수정 했다 고 의심 할 정도 로 laravel 가방 을 다시 다운로드 했다.문 제 는 여전 하 다.
밤새 고생 끝 에 나 는 AuthServiceProvider 의$defer 속성 에 시선 을 고정 시 켰 다.
매 뉴 얼 및 설명 에 따 르 면$defer 속성 은 이 서비스 제공 자 를 불 러 오 는 것 을 지연 시 키 는 데 사 용 됩 니 다.직 설 적 으로 register()를 지연 시 키 는 방법 이 라 고 합 니 다.provides()방법 에 맞 추 면 이 루어 집 니 다.예 를 들 어:

public function provides()
{
    return array('auth');
}
이것 은 AuthServiceProvider 의 방법 입 니 다.프레임 워 크 가 초기 화 될 때 서비스 제공 자 를 순서대로 불 러 옵 니 다.이 서비스 제공 자 proctected$defer=true 를 발견 하면 provides()방법 을 호출 합 니 다.되 돌아 오 는 배열 은 로드 지연 이 필요 한 서비스 이름 을 포함 하고 있 습 니 다.컨트롤 러 나 다른 곳 에서 Auth::METHOD()를 호출 할 때 만 제공 자의 register()방법 을 호출 합 니 다.
문제점 을 확정 하 다
그러면 문제 가 생 겼 습 니 다.수 동적 으로 로드 를 지연 시 키 는 것 입 니 다.즉,Auth 류 방법 을 호출 할 때 Auth 류 를 자동 으로 예화 해 야 합 니 다.왜 제 가 Loauth Service Provider 에서 호출 할 때 제시 방법 은 존재 하지 않 지만 경로 에 서 는 괜 찮 습 니까?
우선 순위 문제 로 인해 프레임 워 크 에 Loauth ServiceProvider::register()를 등록 할 때 Auth 가 로드 지연 으로 표시 되 지 않 았 기 때문에 선후 문제 가 생 겼 습 니 다.즉시 로드 하 는 서비스 제공 자 는 register 방법 에서 로드 지연 서 비 스 를 호출 할 수 없습니다.
연 구 를 통 해 핵심 코드 에서 증 거 를 순조롭게 찾 았 습 니 다 Illuminate\Foundation\Provider Repository

public function load(Application $app, array $providers)
{
    //...
    // We will go ahead and register all of the eagerly loaded providers with the
    // application so their services can be registered with the application as
    // a provided service. Then we will set the deferred service list on it.
    foreach ($manifest['eager'] as $provider)
    {
        $app->register($this->createProvider($app, $provider));
    }
    //
    $app->setDeferredServices($manifest['deferred']);
}
해결 의 길
문제 의 소 재 를 발 견 했 지만 문제 가 해결 되 는 것 은 아니다.핵심 코드 를 수정 하 는 것 은 현명 한 선택 이 아니 기 때문에 우리 자신의 가방 에서 방법 을 강구 할 수 밖 에 없다.하나의 해결 방안 은 다음 과 같다.

public function register()
{
    //
    $authProvider = new \Illuminate\Auth\AuthServiceProvider($this->app);
    $authProvider->register();
    \Auth::extend('loauth',function($app){});
}
auth 가 아직 등록 되 지 않 았 으 니,우 리 는 그것 의 register 방법 을 수 동 으로 호출 하여 등록 을 도 왔 다.
이상 이 바로 본문의 전체 내용 이 니 여러분 들 이 좋아 하 시 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기