


Solutions to problems encountered when setting up lazy loading during Laravel Service Provider development
Recently when developing the laravel-database-logger package, I found that setting the ServiceProvider defer
property to true
will result in registration in the register
method. The middleware
is invalid. This article mainly shares with you the solutions to the problems encountered when setting up lazy loading during Laravel Service Provider development. I hope it can help everyone.
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]; } }
When the problem occurred, I suspected that it was caused by setting the defer
attribute to true
. I immediately modified the source code to protected $defer = true;
code is commented out, and the result is still the prompt databaselogger class not found.
, indicating that Laravel has not registered this ServiceProvder
The next step is what to do To solve this problem, I tried the following methods:
1. Verify whether there is a problem with your own code
Register yourself in the normally registered AppServiceProvider
After the ServiceProvider
public function register() { // $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class); }
was registered, everything was normal.
2. Study the source code
The registration of providers
in config/app.php
is invalid, but in other ServiceProvider# If the registration in ## is valid, it means there is another problem.
registerConfiguredProviders method by studying the
Illuminate\Foundation\Application source code:
config/ in this method providers
content in app.php and
load to
ProviderRepository.
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath())) ->load($providers->collapse()->toArray());
$this->getCachedServicesPath(). Through the source code, we found that Laravel determines how to register based on the
bootstrap/cache/services.php file
ServiceProvider.
//protected $defer = true; code was still invalid.
//protected $defer = true; to be effective, the code needs to be executed.
php artisan clear-compiled php artisan optimize
ServiceProvider, it is strictly prohibited to register middleware, route and other series of operations. At the same time, after changing the
deferattribute value, you need to execute
php artisan clear-compiledand
php artisan optimizeto update the ServiceProvider cache.
3. Why is registration in AppServiceProvider valid?
It is very simple, becauseAppServiceProvider is not delayed loading, so the
register method in
AppServiceProvider is executed to register a new one
ServiceProvider will not be delayed loaded either.
- Use lazy loading with caution
ServiceProvider
- Change
defer
After setting the attribute value,
php artisan clear-compiledand
php artisan optimizeneed to be executed to update the ServiceProvider cache.
- It is strictly prohibited to register
middleware
and
routein lazy-loaded
ServiceProvider.
Detailed explanation of laravel5's method of creating service provider and facade
Laravel Service Providers question
How to create service provider and facade in laravel5
The above is the detailed content of Solutions to problems encountered when setting up lazy loading during Laravel Service Provider development. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Method for obtaining the return code when Laravel email sending fails. When using Laravel to develop applications, you often encounter situations where you need to send verification codes. And in reality...

The method of handling Laravel's email failure to send verification code is to use Laravel...

How to implement the table function of custom click to add data in dcatadmin (laravel-admin) When using dcat...

The impact of sharing of Redis connections in Laravel framework and select methods When using Laravel framework and Redis, developers may encounter a problem: through configuration...

Custom tenant database connection in Laravel multi-tenant extension package stancl/tenancy When building multi-tenant applications using Laravel multi-tenant extension package stancl/tenancy,...

LaravelEloquent Model Retrieval: Easily obtaining database data EloquentORM provides a concise and easy-to-understand way to operate the database. This article will introduce various Eloquent model search techniques in detail to help you obtain data from the database efficiently. 1. Get all records. Use the all() method to get all records in the database table: useApp\Models\Post;$posts=Post::all(); This will return a collection. You can access data using foreach loop or other collection methods: foreach($postsas$post){echo$post->

How to check the validity of Redis connections in Laravel6 projects is a common problem, especially when projects rely on Redis for business processing. The following is...

A problem of duplicate class definition during Laravel database migration occurs. When using the Laravel framework for database migration, developers may encounter "classes have been used...
