최근 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.php
中 providers
注册无效,但是在其他 ServiceProvider
中注册有效,说明是其他问题。
通过研究 IlluminateFoundationApplication
源码找到 registerConfiguredProviders
方法:
Laravel 是在此方法中去读取 config/app.php
中的 providers
内容并load
到 ProviderRepository
中。
(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
并没有延迟加载,因此在执行 AppServiceProvider
中 register
方法去注册新的 ServiceProvider
也是不会延迟加载的。
总结
谨慎使用延迟加载
ServiceProvider
更改
defer
属性值后,需要执行php artisan clear-compiled
和php artisan optimize
以更新 ServiceProvider 缓存。-
严禁在延迟加载的
문제가 발생했을 때ServiceProvider
注册middleware
和route
rrreeedefer
속성을 true
로 설정하여 발생한 문제인 것으로 의심되어 즉시 소스 코드를 수정하여protected $defer를 설정했습니다. = true;
코드가 주석 처리되어도 결과는 여전히databaselogger 클래스를 찾을 수 없습니다.
라는 메시지입니다. 이는 Laravel이 이ServiceProvder
1. 자신의 코드에 문제가 있는지 확인하세요.
에 자신의 ServiceProvider
를 등록하세요. AppServiceProvider
가 정상적으로 등록되었습니다. rrreee등록 후 모든 것이 잘 진행되었습니다.
2. 소스 코드 연구 config/app.php
의 providers
등록은 유효하지 않지만 다른 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의 원칙이 더욱 강화되었습니다. 깊이 이해했습니다. 🎜그러므로 기억하세요: 지연 로딩🎜3. AppServiceProvider에 등록하는 것이 유효한 이유는 무엇입니까? 🎜🎜매우 간단합니다.ServiceProvider
를 사용하려는 경우 미들웨어, 경로 및 기타 일련의 작업을 등록하는 것은 엄격히 금지됩니다. 동시에defer
속성 값을 변경한 후php artisanclear-compiled
및php artisan Optimize
를 실행하여 ServiceProvider를 업데이트해야 합니다. 은닉처.
AppServiceProvider
는 로딩을 지연시키지 않기 때문에 AppServiceProvider
의 register
메소드를 실행하여 새로운 ServiceProvider도 지연 로드되지 않습니다. 🎜요약
- 🎜지연 로딩을 주의해서 사용하세요
ServiceProvider
🎜🎜 - 🎜변경
defer 속성 값 뒤에 <code>php artisanclear-compiled
및php artisan Optimize
를 실행하여 ServiceProvider 캐시를 업데이트해야 합니다. 🎜🎜 - 🎜지연 로드된
ServiceProvider
에미들웨어
및route
를 등록하는 것은 엄격히 금지됩니다. 🎜🎜🎜🎜관련 권장 사항: 🎜🎜🎜🎜laravel5의 서비스 공급자 및 Facade 생성 방법에 대한 자세한 설명🎜🎜🎜🎜Laravel Service Providers 문제🎜🎜🎜🎜laravel5가 서비스 공급자 및 Facade를 생성하는 방법🎜🎜🎜🎜 🎜
위 내용은 Laravel Service Provider 개발 중 지연 로딩을 설정할 때 발생하는 문제에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

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

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

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

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

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

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

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


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

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

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

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

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경