search
HomePHP FrameworkLaravelWhy does laravel use facade?

In laravel, because the facade can provide a "static" interface for the application's service container, compared to the traditional static method, the "static" interface provided by the facade is equivalent to a static in the underlying class of the service container. Represents that it can provide a more flexible and easier-to-test syntax, so facades are used in laravel.

Why does laravel use facade?

#The operating environment of this article: Windows 10 system, Laravel version 6, Dell G3 computer.

Why laravel uses facade

The facade in Laravel generally follows the basic idea of ​​the facade pattern. The facade in Laravel provides a [static] interface for the application's service container, which is equivalent to a [static representative] in the underlying class of the service container, which can provide more flexible, easy-to-test, and elegant syntax.

For the facade in Laravel, we will often use it, such as caching.

Cache::get('key');

Another example is the database and Redis we often used before.

DB::connection('mysql2')->table('db_test')->get()->toArray();
 
Redis::connection('default')->client()->get('test')

I found that no, the facade is all static methods. But if you click on it, you will find that there is nothing in this facade category!

class Cache extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'cache';
    }
}

In the Facade class, we don’t need to look at other method functions for now. Just scroll to the bottom and you will find a magic method, __callStatic().

public static function __callStatic($method, $args)
{
    $instance = static::getFacadeRoot();
 
    if (! $instance) {
        throw new RuntimeException('A facade root has not been set.');
    }
 
    return $instance->$method(...$args);
}

__callStatic() means that if the corresponding method is not defined when calling statically, it will enter the __callStatic() method. For example, the Cache::get() method we call is actually currently Neither the Cache facade class nor its parent class Facade defines this method, so it goes directly to __callStatic(). Then, it gets the instance object of our current facade through getFacadeRoot(), and then calls the get() method in the instance object.

Okay, that’s it. In fact, if an interviewer asks you during the interview how to implement the facade mode in Laravel, you can confidently say that the core is the __callStatic() magic method. . So where does this specific instance object come from? Let's continue reading.

Instance Object

Next we look at how to obtain the specific instance object in Facade. Here we have to go back to the service container. But let’s take a look at the entrance first.

In the __callStatic() method, we will see that a static::getFacadeRoot() method is called to obtain the specific instance object.

public static function getFacadeRoot()
{
    return static::resolveFacadeInstance(static::getFacadeAccessor());
}

The content of this method is very simple, it just calls the other two methods. Note that getFacadeAccessor() is implemented in each of our facade subclasses. For example, in the example, it is implemented in the Cache class. It just returns an alias for an instance. Remember where this alias was defined? We have seen it in the service container, which is the ones defined in the registerCoreContainerAliases() method in vendor/laravel/framework/src/Illuminate/Foundation/Application.php.

Next, what we mainly look at is the static::resolveFacadeInstance() method. We can tell from the name that it means to solve the facade instance. If this thing does not return an instance object, it really lives up to its name.

protected static function resolveFacadeInstance($name)
{
    if (is_object($name)) {
        return $name;
    }
 
    if (isset(static::$resolvedInstance[$name])) {
        return static::$resolvedInstance[$name];
    }
 
    if (static::$app) {
        return static::$resolvedInstance[$name] = static::$app[$name];
    }
}

The first judgment is that if an object is passed in, it will be returned directly. The second judgment is that if there is already one in the current instance array, it will not be created again, which is similar to the effect of flyweight mode. Note, static member array! What does that mean? Static and globally shared, that is to say, after your instance object is created, it can be used elsewhere, in a complete singleton state. The last judgment is that if the app, that is, our service container exists, perform the operation of the service container.

Let’s first take a look at when the app attribute is assigned a value. When talking about service providers, there is a bootstrappers attribute array in the Kernel, which has a RegisterFacades provider. Obviously, it is a service provider used to register the facade. In this service provider, we will see code like this.

public function bootstrap(Application $app)
{
    Facade::clearResolvedInstances();
 
    Facade::setFacadeApplication($app);
 
    AliasLoader::getInstance(array_merge(
        $app->make('config')->get('app.aliases', []),
        $app->make(PackageManifest::class)->aliases()
    ))->register();
}

Among them, Facade::setFacadeApplication() injects the Application object of the service container into the static member variable app of the facade class. Note that it is also static and exists globally.

Then we continue back to the resolveFacadeInstance() method.

protected static function resolveFacadeInstance($name)
{
    // …………
    // …………
    if (static::$app) {
        return static::$resolvedInstance[$name] = static::$app[$name];
    }
}

What's going on here? How can I get an instance object through static::$app[$name]? Don't be excited, don't be anxious, think about how to make an object perform such array operations? We learned it before!

This is the ArrayAccess interface. The several methods it must implement allow the object to be used like an array.

OK, now that we know the principle, let’s see if this is the case and find the parent class of Application vendor/laravel/framework/src/Illuminate/Container/Container.php .

class Container implements ArrayAccess, ContainerContract
{
    // …………
    // …………
    public function offsetGet($key)
    {
        return $this->make($key);
    }
    // …………
    // …………
}

It really looks like Baymax, right? You don’t need me to explain any more, right? The make() method has been explained in the previous service container.

Okay, the rest is up to you. Please find the specific implementation class of Cache based on the alias in the registerCoreContainerAliases() method in vendor/laravel/framework/src/Illuminate/Foundation/Application.php, and then analyze it The implementation of get(), set(), forget() and other methods, and see how they use different cache storage solutions according to our configuration files.

[Related recommendations: laravel video tutorial]

The above is the detailed content of Why does laravel use facade?. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
What is the latest Laravel version?What is the latest Laravel version?May 09, 2025 am 12:09 AM

As of October 2023, Laravel's latest version is 10.x. 1.Laravel10.x supports PHP8.1, improving development efficiency. 2.Jetstream improves support for Livewire and Inertia.js, simplifies front-end development. 3.EloquentORM adds full-text search function to improve data processing performance. 4. Pay attention to dependency package compatibility when using it and apply cache optimization performance.

Laravel Migrations: A Beginner's Guide to Database ManagementLaravel Migrations: A Beginner's Guide to Database ManagementMay 09, 2025 am 12:07 AM

LaravelMigrationsstreamlinedatabasemanagementbyprovidingversioncontrolforyourdatabaseschema.1)Theyallowyoutodefineandsharethestructureofyourdatabase,makingiteasytomanagechangesovertime.2)Migrationscanbecreatedandrunusingsimplecommands,ensuringthateve

Laravel migration: Best coding guideLaravel migration: Best coding guideMay 09, 2025 am 12:03 AM

Laravel's migration system is a powerful tool for developers to design and manage databases. 1) Ensure that the migration file is named clearly and use verbs to describe the operation. 2) Consider data integrity and performance, such as adding unique constraints to fields. 3) Use transaction processing to ensure database consistency. 4) Create an index at the end of the migration to optimize performance. 5) Maintain the atomicity of migration, and each file contains only one logical operation. Through these practices, efficient and maintainable migration code can be written.

Latest Laravel Version: Stay Up-to-Date with the Newest FeaturesLatest Laravel Version: Stay Up-to-Date with the Newest FeaturesMay 09, 2025 am 12:03 AM

Laravel's latest version is 10.x, released in early 2023. This version brings enhanced EloquentORM functionality and a simplified routing system, improving development efficiency and performance, but it needs to be tested carefully during upgrades to prevent problems.

Mastering Laravel Soft Deletes: Best Practices and Advanced TechniquesMastering Laravel Soft Deletes: Best Practices and Advanced TechniquesMay 08, 2025 am 12:25 AM

Laravelsoftdeletesallow"deletion"withoutremovingrecordsfromthedatabase.Toimplement:1)UsetheSoftDeletestraitinyourmodel.2)UsewithTrashed()toincludesoft-deletedrecordsinqueries.3)CreatecustomscopeslikeonlyTrashed()forstreamlinedcode.4)Impleme

Laravel Soft Deletes: Restoring and Permanently Deleting RecordsLaravel Soft Deletes: Restoring and Permanently Deleting RecordsMay 08, 2025 am 12:24 AM

In Laravel, restore the soft deleted records using the restore() method, and permanently delete the forceDelete() method. 1) Use withTrashed()->find()->restore() to restore a single record, and use onlyTrashed()->restore() to restore a single record. 2) Permanently delete a single record using withTrashed()->find()->forceDelete(), and multiple records use onlyTrashed()->forceDelete().

The Current Laravel Release: Download and Upgrade Today!The Current Laravel Release: Download and Upgrade Today!May 08, 2025 am 12:22 AM

You should download and upgrade to the latest Laravel version as it provides enhanced EloquentORM capabilities and new routing features, which can improve application efficiency and security. To upgrade, follow these steps: 1. Back up the current application, 2. Update the composer.json file to the latest version, 3. Run the update command. While some common problems may be encountered, such as discarded functions and package compatibility, these issues can be solved through reference documentation and community support.

Laravel: When should I update to the last version?Laravel: When should I update to the last version?May 08, 2025 am 12:18 AM

YoushouldupdatetothelatestLaravelversionwhenthebenefitsclearlyoutweighthecosts.1)Newfeaturesandimprovementscanenhanceyourapplication.2)Securityupdatesarecrucialifvulnerabilitiesareaddressed.3)Performancegainsmayjustifyanupdateifyourappstruggles.4)Ens

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

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

Hot Tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools