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

최근 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으로 문의하세요.
PHP에서 배열 슬라이딩 윈도우를 구현하는 방법은 무엇입니까?PHP에서 배열 슬라이딩 윈도우를 구현하는 방법은 무엇입니까?May 15, 2025 pm 08:51 PM

PHP에서 배열 슬라이딩 윈도우 구현 기능은 SlideWindow 및 SlideWindowAverage 기능으로 수행 할 수 있습니다. 1. Slide-Window 함수를 사용하여 배열을 고정 크기 서브 어레이로 분할하십시오. 2. SlideWindowAverage 함수를 사용하여 각 창의 평균 값을 계산하십시오. 3. 실시간 데이터 스트림의 경우, 비동기 처리 및 이상치 감지를 Reactphp를 사용하여 사용할 수 있습니다.

PHP에서 __clone 방법을 사용하는 방법은 무엇입니까?PHP에서 __clone 방법을 사용하는 방법은 무엇입니까?May 15, 2025 pm 08:48 PM

PHP의 __clone 방법은 객체 클로닝시 사용자 정의 작업을 수행하는 데 사용됩니다. 클론 키워드를 사용하여 객체를 클로닝 할 때 객체에 __ 클론 메소드가있는 경우 방법이 자동으로 호출되어 클로닝 프로세스 중에 클로닝 된 객체의 독립성을 보장하기 위해 참조 유형 속성을 재설정하는 것과 같은 클로닝 프로세스 중에 맞춤형 처리가 가능합니다.

PHP에서 GOTO 명령문을 사용하는 방법?PHP에서 GOTO 명령문을 사용하는 방법?May 15, 2025 pm 08:45 PM

PHP에서 GOTO 진술은 프로그램의 특정 태그로 무조건 점프하는 데 사용됩니다. 1) 복잡한 중첩 루프 또는 조건부 명세서의 처리를 단순화 할 수 있지만 2) GOTO를 사용하면 코드를 이해하고 유지하기가 어렵게 만들 수 있으며 3) 구조화 된 제어 문의 사용에 우선 순위를 부여하는 것이 좋습니다. 전반적으로, GOTO는 조심스럽게 사용해야하며 모범 사례를 따라 코드의 가독성과 유지 보수 가능성을 보장합니다.

PHP에서 데이터 통계를 구현하는 방법은 무엇입니까?PHP에서 데이터 통계를 구현하는 방법은 무엇입니까?May 15, 2025 pm 08:42 PM

PHP에서 내장 기능, 사용자 정의 기능 및 타사 라이브러리를 사용하여 데이터 통계를 달성 할 수 있습니다. 1) array_sum () 및 count ()와 같은 내장 함수를 사용하여 기본 통계를 수행하십시오. 2) 중앙값과 같은 복잡한 통계를 계산하기 위해 사용자 정의 기능을 작성하십시오. 3) PHP-ML 라이브러리를 사용하여 고급 통계 분석을 수행하십시오. 이러한 방법을 통해 데이터 통계를 효율적으로 수행 할 수 있습니다.

PHP에서 익명 기능을 사용하는 방법은 무엇입니까?PHP에서 익명 기능을 사용하는 방법은 무엇입니까?May 15, 2025 pm 08:39 PM

예, PHP의 익명 함수는 이름이없는 함수를 나타냅니다. 다른 함수의 매개 변수로 전달되고 함수의 리턴 값으로 전달 될 수있어 코드를보다 유연하고 효율적으로 만듭니다. 익명 기능을 사용하는 경우 범위 및 성능 문제에주의를 기울여야합니다.

PHP의 Array_rand에서 키를 무작위로 얻는 방법은 무엇입니까?PHP의 Array_rand에서 키를 무작위로 얻는 방법은 무엇입니까?May 15, 2025 pm 08:36 PM

PHP에서는 Array_rand 함수를 사용하여 어레이에서 키를 무작위로 가져올 수 있습니다. 1) array_rand ($ array)를 사용하여 단일 임의 키를 얻으십시오. 2) array_rand ($ array, n)를 사용하여 n 랜덤 키를 얻습니다. 이 기능은 효율적이고 유연하지만 대규모 데이터의 주요 카운트 및 성능 문제의 한계에주의를 기울여야합니다.

PHP에서 기능의 핫 업데이트를 구현하는 방법은 무엇입니까?PHP에서 기능의 핫 업데이트를 구현하는 방법은 무엇입니까?May 15, 2025 pm 08:33 PM

PHP에서 기능에 대한 핫 업데이트를 구현하는 세 가지 방법이 있습니다. 1. 함수를 다시 작성하고 runkit을 사용하여 함수를 동적으로 다시 작성하십시오. 2. Opcache를 사용하여 Opcache를 다시 시작하여 뜨거운 업데이트를 실현하십시오. 3. 배포자 또는 Ansible과 같은 외부 도구를 사용하여 코드를 자동으로 배포하고 업데이트하십시오.

PHP 배열을 반복하는 동안 요소를 교체하는 방법은 무엇입니까?PHP 배열을 반복하는 동안 요소를 교체하는 방법은 무엇입니까?May 15, 2025 pm 08:30 PM

PHP에서는 다음 방법을 사용하여 배열 요소를 가로 지르고 교체 할 수 있습니다. 1. Foreach 루프 및 참조 (& $ 값)를 사용하여 요소를 수정하지만 참조가 부작용을 유발할 수 있음을 알고 있어야합니다. 2. 루프를 사용하여 참조 문제를 피하기 위해 인덱스와 값에 직접 액세스하십시오. 3. Array_Map 함수를 사용하여 간결한 수정을하지만 키 이름이 재설정됩니다. 4. Array_Walk 함수를 사용하여 값을 수정하고 키 이름을 유지하십시오. 메소드를 선택할 때 성능, 부작용 및 키 이름 유지 요구 사항을 고려해야합니다.

See all articles

핫 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 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경