Laravel Service Provider 开发时设置延迟加载时遇到的问题决绝办法
近日在开发 laravel-database-logger 包的时候,发现设置 ServiceProvider 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
中注册有效,说明是其他问题。
通过研究 Illuminate\Foundation\Application
源码找到 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
。
相关推荐:
laravel5创建service provider和facade的方法详解
laravel5如何创建service provider和facade
Atas ialah kandungan terperinci Laravel Service Provider 开发时设置延迟加载时遇到的问题决绝办法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Kaedah untuk mendapatkan kod kembali apabila menghantar e -mel Laravel gagal. Apabila menggunakan Laravel untuk membangunkan aplikasi, anda sering menghadapi situasi di mana anda perlu menghantar kod pengesahan. Dan pada hakikatnya ...

Tugas Jadual Laravel menjalankan penyelesaian masalah yang tidak responsif semasa menggunakan penjadualan tugas jadual Laravel, banyak pemaju akan menghadapi masalah ini: Jadual: Jalankan ...

Kaedah mengendalikan kegagalan e -mel Laravel untuk menghantar kod pengesahan adalah menggunakan Laravel ...

Cara melaksanakan fungsi jadual klik tersuai untuk menambah data dalam dcatadmin (laravel-admin) semasa menggunakan dcat ...

Kesan perkongsian sambungan Redis dalam rangka kerja Laravel dan pilih kaedah apabila menggunakan Rangka Kerja Laravel dan Redis, pemaju mungkin menghadapi masalah: melalui konfigurasi ...

Sambungan pangkalan data penyewa tersuai dalam pakej lanjutan multi-penyewa Larave Stancl/penyewaan ketika membina aplikasi multi-penyewa menggunakan pakej lanjutan multi-penyewa Larave Stancl/penyewaan, ...

Pengambilan Model Laraveleloquent: Mudah mendapatkan data pangkalan data Eloquentorm menyediakan cara ringkas dan mudah difahami untuk mengendalikan pangkalan data. Artikel ini akan memperkenalkan pelbagai teknik carian model fasih secara terperinci untuk membantu anda mendapatkan data dari pangkalan data dengan cekap. 1. Dapatkan semua rekod. Gunakan kaedah semua () untuk mendapatkan semua rekod dalam jadual pangkalan data: USEAPP \ MODELS \ POST; $ POSTS = POST :: SEMUA (); Ini akan mengembalikan koleksi. Anda boleh mengakses data menggunakan gelung foreach atau kaedah pengumpulan lain: foreach ($ postsas $ post) {echo $ post->

Cecair memproses 7 juta rekod dan membuat peta interaktif dengan teknologi geospatial. Artikel ini meneroka cara memproses lebih dari 7 juta rekod menggunakan Laravel dan MySQL dan mengubahnya menjadi visualisasi peta interaktif. Keperluan Projek Cabaran Awal: Ekstrak Wawasan berharga menggunakan 7 juta rekod dalam pangkalan data MySQL. Ramai orang mula -mula mempertimbangkan bahasa pengaturcaraan, tetapi mengabaikan pangkalan data itu sendiri: Bolehkah ia memenuhi keperluan? Adakah penghijrahan data atau pelarasan struktur diperlukan? Bolehkah MySQL menahan beban data yang besar? Analisis awal: Penapis utama dan sifat perlu dikenalpasti. Selepas analisis, didapati bahawa hanya beberapa atribut yang berkaitan dengan penyelesaiannya. Kami mengesahkan kemungkinan penapis dan menetapkan beberapa sekatan untuk mengoptimumkan carian. Carian Peta Berdasarkan Bandar
