Table of Contents
Why laravel uses facade
Home PHP Framework Laravel Why does laravel use facade?

Why does laravel use facade?

Jun 06, 2022 pm 04:02 PM
laravel

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');
Copy after login

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')
Copy after login

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';
    }
}
Copy after login

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);
}
Copy after login

__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());
}
Copy after login

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];
    }
}
Copy after login

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();
}
Copy after login

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];
    }
}
Copy after login

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);
    }
    // …………
    // …………
}
Copy after login

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 of this Website
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

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

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1663
14
PHP Tutorial
1263
29
C# Tutorial
1237
24
Laravel Introduction Example Laravel Introduction Example Apr 18, 2025 pm 12:45 PM

Laravel is a PHP framework for easy building of web applications. It provides a range of powerful features including: Installation: Install the Laravel CLI globally with Composer and create applications in the project directory. Routing: Define the relationship between the URL and the handler in routes/web.php. View: Create a view in resources/views to render the application's interface. Database Integration: Provides out-of-the-box integration with databases such as MySQL and uses migration to create and modify tables. Model and Controller: The model represents the database entity and the controller processes HTTP requests.

Solve caching issues in Craft CMS: Using wiejeben/craft-laravel-mix plug-in Solve caching issues in Craft CMS: Using wiejeben/craft-laravel-mix plug-in Apr 18, 2025 am 09:24 AM

When developing websites using CraftCMS, you often encounter resource file caching problems, especially when you frequently update CSS and JavaScript files, old versions of files may still be cached by the browser, causing users to not see the latest changes in time. This problem not only affects the user experience, but also increases the difficulty of development and debugging. Recently, I encountered similar troubles in my project, and after some exploration, I found the plugin wiejeben/craft-laravel-mix, which perfectly solved my caching problem.

Laravel user login function Laravel user login function Apr 18, 2025 pm 12:48 PM

Laravel provides a comprehensive Auth framework for implementing user login functions, including: Defining user models (Eloquent model), creating login forms (Blade template engine), writing login controllers (inheriting Auth\LoginController), verifying login requests (Auth::attempt) Redirecting after login is successful (redirect) considering security factors: hash passwords, anti-CSRF protection, rate limiting and security headers. In addition, the Auth framework also provides functions such as resetting passwords, registering and verifying emails. For details, please refer to the Laravel documentation: https://laravel.com/doc

Laravel and the Backend: Powering Web Application Logic Laravel and the Backend: Powering Web Application Logic Apr 11, 2025 am 11:29 AM

How does Laravel play a role in backend logic? It simplifies and enhances backend development through routing systems, EloquentORM, authentication and authorization, event and listeners, and performance optimization. 1. The routing system allows the definition of URL structure and request processing logic. 2.EloquentORM simplifies database interaction. 3. The authentication and authorization system is convenient for user management. 4. The event and listener implement loosely coupled code structure. 5. Performance optimization improves application efficiency through caching and queueing.

Laravel framework installation method Laravel framework installation method Apr 18, 2025 pm 12:54 PM

Article summary: This article provides detailed step-by-step instructions to guide readers on how to easily install the Laravel framework. Laravel is a powerful PHP framework that speeds up the development process of web applications. This tutorial covers the installation process from system requirements to configuring databases and setting up routing. By following these steps, readers can quickly and efficiently lay a solid foundation for their Laravel project.

How to learn Laravel How to learn Laravel for free How to learn Laravel How to learn Laravel for free Apr 18, 2025 pm 12:51 PM

Want to learn the Laravel framework, but suffer from no resources or economic pressure? This article provides you with free learning of Laravel, teaching you how to use resources such as online platforms, documents and community forums to lay a solid foundation for your PHP development journey from getting started to master.

How to view the version number of laravel? How to view the version number of laravel How to view the version number of laravel? How to view the version number of laravel Apr 18, 2025 pm 01:00 PM

The Laravel framework has built-in methods to easily view its version number to meet the different needs of developers. This article will explore these methods, including using the Composer command line tool, accessing .env files, or obtaining version information through PHP code. These methods are essential for maintaining and managing versioning of Laravel applications.

What versions of laravel are there? How to choose the version of laravel for beginners What versions of laravel are there? How to choose the version of laravel for beginners Apr 18, 2025 pm 01:03 PM

In the Laravel framework version selection guide for beginners, this article dives into the version differences of Laravel, designed to assist beginners in making informed choices among many versions. We will focus on the key features of each release, compare their pros and cons, and provide useful advice to help beginners choose the most suitable version of Laravel based on their skill level and project requirements. For beginners, choosing a suitable version of Laravel is crucial because it can significantly impact their learning curve and overall development experience.

See all articles