목차
总结
요약
백엔드 개발 PHP 튜토리얼 Laravel Service Provider 개발 중 지연 로딩을 설정할 때 발생하는 문제에 대한 솔루션

Laravel Service Provider 개발 중 지연 로딩을 설정할 때 발생하는 문제에 대한 솔루션

Jan 03, 2018 pm 03:05 PM
laravel service

최근 laravel-database-logger 패키지를 개발할 때 ServiceProvider defer 속성을 ​​true로 설정하면 register 메서드가 생성되는 것을 발견했습니다. 등록된 미들웨어가 잘못되었습니다. 이 글은 Laravel Service Provider 개발 중 지연 로딩을 설정할 때 발생하는 문제에 대한 해결책을 주로 여러분과 공유합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다. defer 属性设置为 true 时,会导致在 register 方法中注册的 middleware 无效。本文主要和大家分享Laravel Service Provider 开发时设置延迟加载时遇到的问题决绝办法,希望能帮助到大家。

class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
     protected $defer = true;
     
     public function register()
     {
        $this->mergeConfigFrom(
            __DIR__ . '/../config/config.php', 'ibrand.dblogger'
        );


        $this->app->singleton(DbLogger::class, function ($app) {
            return new DbLogger();
        });

        //当 $defer 设置为 true 时,在路由中引用 databaselogger middleware 会报错,提示 databaselogger class not found.
        $this->app[\Illuminate\Routing\Router::class]->middleware('databaselogger', Middleware::class);

    }
    
    public function provides()
    {
        return [DbLogger::class];
    }
}
로그인 후 복사

当问题出现的时候就怀疑是因为设置了 defer 属性设置为 true 导致的,立刻就修改源码把 protected $defer = true; 的代码注释掉,结果仍然是提示 databaselogger class not found.,说明 Laravel 并没有注册此 ServiceProvder

接下来就是想如何解决此问题,尝试了下面的方法:

1. 验证本身代码是否存在问题

在正常注册的 AppServiceProvider 中注册自己的 ServiceProvider

public function register()
    {
        //
        $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class);
    }
로그인 후 복사

注册后结果一切正常。

2. 研究源码
config/app.phpproviders 注册无效,但是在其他 ServiceProvider 中注册有效,说明是其他问题。

通过研究 IlluminateFoundationApplication 源码找到 registerConfiguredProviders 方法:

Laravel 是在此方法中去读取 config/app.php 中的 providers 内容并loadProviderRepository 中。

(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                    ->load($providers->collapse()->toArray());
로그인 후 복사

重点在 $this->getCachedServicesPath() ,通过源码发现 Laravel 是根据 bootstrap/cache/services.php 文件去决定如何注册 ServiceProvider

此时想到了为什么之前注释了 //protected $defer = true; 代码后仍然无效的原因。

所以为了让注释后的 //protected $defer = true; 代码有效需要执行

php artisan clear-compiled 
php artisan optimize
로그인 후 복사

之后问题就解决了,也更加深入理解了 ServiceProvider 的原理。

所以切记:如果准备采用延迟加载ServiceProvider时,严禁进行注册 middleware, route 等系列操作。同时,更改 defer 属性值后,需要执行 php artisan clear-compiled php artisan optimize 以更新 ServiceProvider 缓存。

3. 为什么 AppServiceProvider 中注册有效?

愿意很简单,因为 AppServiceProvider 并没有延迟加载,因此在执行 AppServiceProviderregister 方法去注册新的 ServiceProvider 也是不会延迟加载的。

总结

  1. 谨慎使用延迟加载 ServiceProvider

  2. 更改 defer 属性值后,需要执行 php artisan clear-compiled php artisan optimize 以更新 ServiceProvider 缓存。

  3. 严禁在延迟加载的 ServiceProvider 注册 middlewarerouterrreee

    문제가 발생했을 때 defer 속성을 ​​true로 설정하여 발생한 문제인 것으로 의심되어 즉시 소스 코드를 수정하여 protected $defer를 설정했습니다. = true; 코드가 주석 처리되어도 결과는 여전히 databaselogger 클래스를 찾을 수 없습니다.라는 메시지입니다. 이는 Laravel이 이 ServiceProvder
를 등록하지 않았음을 나타냅니다. 다음 단계는 이 문제를 해결하는 방법입니다. 다음 방법을 시도해 보세요.


1. 자신의 코드에 문제가 있는지 확인하세요.

에 자신의 ServiceProvider를 등록하세요. AppServiceProvider가 정상적으로 등록되었습니다. rrreee등록 후 모든 것이 잘 진행되었습니다.

2. 소스 코드 연구 config/app.phpproviders 등록은 유효하지 않지만 다른 ServiceProvider에서는 등록이 유효하다면 다른 문제가 있다는 뜻입니다.

IlluminateFoundationApplication 소스 코드를 연구하여 registerConfiguredProviders 메서드를 찾으세요.

Laravel은 이 메서드 코드>공급자에서 config/app.php를 읽습니다. 콘텐츠를 ProviderRepository로드합니다. rrreee

초점은 $this->getCachedServicesPath()에 있습니다. 소스 코드를 통해 Laravel은 bootstrap/cache를 기반으로 <code>ServiceProvider를 등록하는 방법을 결정한다는 것을 확인했습니다. /services.php 파일입니다.


이때, 앞서 댓글을 달았던 //protected $defer = true; 코드가 여전히 유효하지 않은 이유를 생각해봤습니다.

🎜그래서 주석 처리된 //protected $defer = true; 코드를 유효하게 만들기 위해서는 실행이 필요합니다🎜rrreee🎜이후에는 문제가 해결되었고 ServiceProvider의 원칙이 더욱 강화되었습니다. 깊이 이해했습니다. 🎜
그러므로 기억하세요: 지연 로딩 ServiceProvider를 사용하려는 경우 미들웨어, 경로 및 기타 일련의 작업을 등록하는 것은 엄격히 금지됩니다. 동시에 defer 속성 값을 변경한 후 php artisanclear-compiledphp artisan Optimize를 실행하여 ServiceProvider를 업데이트해야 합니다. 은닉처.
🎜3. AppServiceProvider에 등록하는 것이 유효한 이유는 무엇입니까? 🎜🎜매우 간단합니다. AppServiceProvider는 로딩을 지연시키지 않기 때문에 AppServiceProviderregister 메소드를 실행하여 새로운 ServiceProvider도 지연 로드되지 않습니다. 🎜

요약

  1. 🎜지연 로딩을 주의해서 사용하세요 ServiceProvider🎜🎜
  2. 🎜변경 defer 속성 값 뒤에 <code>php artisanclear-compiledphp artisan Optimize를 실행하여 ServiceProvider 캐시를 업데이트해야 합니다. 🎜🎜
  3. 🎜지연 로드된 ServiceProvider미들웨어route를 등록하는 것은 엄격히 금지됩니다. 🎜🎜🎜🎜관련 권장 사항: 🎜🎜🎜🎜laravel5의 서비스 공급자 및 Facade 생성 방법에 대한 자세한 설명🎜🎜🎜🎜Laravel Service Providers 문제🎜🎜🎜🎜laravel5가 서비스 공급자 및 Facade를 생성하는 방법🎜🎜🎜🎜 🎜

위 내용은 Laravel Service Provider 개발 중 지연 로딩을 설정할 때 발생하는 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Laravel에서 이메일 전송이 실패 할 때 반환 코드를 얻는 방법은 무엇입니까? Laravel에서 이메일 전송이 실패 할 때 반환 코드를 얻는 방법은 무엇입니까? Apr 01, 2025 pm 02:45 PM

Laravel 이메일 전송이 실패 할 때 반환 코드를 얻는 방법. Laravel을 사용하여 응용 프로그램을 개발할 때 종종 확인 코드를 보내야하는 상황이 발생합니다. 그리고 실제로 ...

laravel 일정 작업이 실행되지 않습니다 : 스케줄 후 작업이 실행되지 않으면 어떻게해야합니까? laravel 일정 작업이 실행되지 않습니다 : 스케줄 후 작업이 실행되지 않으면 어떻게해야합니까? Mar 31, 2025 pm 11:24 PM

laravel 일정 작업 실행 비 응답 문제 해결 Laravel의 일정 작업 일정을 사용할 때 많은 개발자 가이 문제에 직면합니다 : 스케줄 : 실행 ...

Laravel에서는 이메일로 확인 코드를 보내지 못하는 상황을 처리하는 방법은 무엇입니까? Laravel에서는 이메일로 확인 코드를 보내지 못하는 상황을 처리하는 방법은 무엇입니까? Mar 31, 2025 pm 11:48 PM

Laravel의 이메일을 처리하지 않는 방법은 LaRavel을 사용하는 것입니다.

DCAT 관리자에서 데이터를 추가하기 위해 클릭하는 사용자 정의 테이블 기능을 구현하는 방법은 무엇입니까? DCAT 관리자에서 데이터를 추가하기 위해 클릭하는 사용자 정의 테이블 기능을 구현하는 방법은 무엇입니까? Apr 01, 2025 am 07:09 AM

DCAT를 사용할 때 DCATADMIN (LARAVEL-ADMIN)에서 데이터를 추가하려면 사용자 정의의 테이블 기능을 구현하는 방법 ...

Laravel Redis Connection 공유 : 선택 메소드가 다른 연결에 영향을 미치는 이유는 무엇입니까? Laravel Redis Connection 공유 : 선택 메소드가 다른 연결에 영향을 미치는 이유는 무엇입니까? Apr 01, 2025 am 07:45 AM

Laravel 프레임 워크 및 Laravel 프레임 워크 및 Redis를 사용할 때 Redis 연결을 공유하는 데 영향을 줄 수 있습니다. 개발자는 문제가 발생할 수 있습니다. 구성을 통해 ...

Laravel 멀티 테넌트 확장 STANCL/TENANCY : 테넌트 데이터베이스 연결의 호스트 주소를 사용자 정의하는 방법은 무엇입니까? Laravel 멀티 테넌트 확장 STANCL/TENANCY : 테넌트 데이터베이스 연결의 호스트 주소를 사용자 정의하는 방법은 무엇입니까? Apr 01, 2025 am 09:09 AM

Laravel 다중 테넌트 확장 패키지 패키지 패키지 패키지 패키지 Stancl/Tenancy, ...

Bangla 부분 모델 검색의 Laravel Eloquent Orm) Bangla 부분 모델 검색의 Laravel Eloquent Orm) Apr 08, 2025 pm 02:06 PM

Laraveleloquent 모델 검색 : 데이터베이스 데이터를 쉽게 얻을 수 있습니다. 이 기사는 데이터베이스에서 데이터를 효율적으로 얻는 데 도움이되는 다양한 웅변 모델 검색 기술을 자세히 소개합니다. 1. 모든 기록을 얻으십시오. 모든 () 메소드를 사용하여 데이터베이스 테이블에서 모든 레코드를 가져옵니다. 이것은 컬렉션을 반환합니다. Foreach 루프 또는 기타 수집 방법을 사용하여 데이터에 액세스 할 수 있습니다 : Foreach ($ postas $ post) {echo $ post->

Laravel 's geospatial : 대화식지도의 최적화 및 많은 양의 데이터 Laravel 's geospatial : 대화식지도의 최적화 및 많은 양의 데이터 Apr 08, 2025 pm 12:24 PM

7 백만 레코드를 효율적으로 처리하고 지리 공간 기술로 대화식지도를 만듭니다. 이 기사는 Laravel과 MySQL을 사용하여 7 백만 개 이상의 레코드를 효율적으로 처리하고 대화식지도 시각화로 변환하는 방법을 살펴 봅니다. 초기 챌린지 프로젝트 요구 사항 : MySQL 데이터베이스에서 7 백만 레코드를 사용하여 귀중한 통찰력을 추출합니다. 많은 사람들이 먼저 프로그래밍 언어를 고려하지만 데이터베이스 자체를 무시합니다. 요구 사항을 충족시킬 수 있습니까? 데이터 마이그레이션 또는 구조 조정이 필요합니까? MySQL이 큰 데이터로드를 견딜 수 있습니까? 예비 분석 : 주요 필터 및 속성을 식별해야합니다. 분석 후, 몇 가지 속성만이 솔루션과 관련이 있음이 밝혀졌습니다. 필터의 타당성을 확인하고 검색을 최적화하기위한 제한 사항을 설정했습니다. 도시를 기반으로 한지도 검색

See all articles