Laravel进阶系列笔记--(四)Laravel 快速使用自定义门面

作者: 温新

分类: 【Laravel】

阅读: 2128

时间: 2021-08-12 13:27:04

作者:温新

时间:2021-07-05

hi,我是温新,一名PHPer。

什么是门面

**门面(Facades)为应用的服务容器提供了一个静态访问的接口。**大白话一句说:门面就是使用可以静态调用的方式去调用类中的方法。

门面工作原理

在Laravel应用中,门面就是一个可以从容器中访问对象的类。其核心是Facade类。无论是Laravel预定义的还是自定的门面,其核心都是继承自Illuminate\Support\Facades\Facade类。

为什么可以使用静态方式去调用方法?其原理就是Facade基类中使用了__callStatic()魔术方法。

自定义Facade

第一步:手动创建工具类文件

文件位置:app/Tool/TestTool.php

// app/Tool/TestTool.php
<?php
namespace App\Tool;

// 测试工具类
class TestTool
{
    public function say()
    {
        echo '我已经被静态调用了';
    }
}

第二步:创建门面代理类

文件:app/Facades/TestTool.php

该文件的主要作用是使得可以用静态方式调用app/Tool/TestTool.php中的方法

<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class TestTool extends Facade
{
    protected static function getFacadeAccessor()
    {
       // 注意 返回的名称
       return 'testtool';
    }
}

第三步:创建服务提供者

创建服务提供者

php artisan make:provider  TestToolServiceProvider 

绑定到服务容器

<?php

namespace App\Providers;

use App\Tool\TestTool;
use Illuminate\Support\ServiceProvider;

class TestToolServiceProvider extends ServiceProvider
{
    public function register()
    {
        // 注意:这里的`testtool`要与第二步中的返回名称一致
        $this->app->bind('testtool', function(){
            return new TestTool();
        });
    }

    public function boot()
    {
    }
}

第四步:注册服务者与门面

文件:config/app.php

// 注册服务提供者
'providers' => [
    App\Providers\TestToolServiceProvider::class,
],
// 注册自定门面
'aliases' => [
    'TestTool'=>App\Facades\TestTool::class,
],

第五步:调用

测试:web.php

// web.php
Route::get('fa', function(){
    // 这样可以
    return \App\Facades\TestTool::say();
    // 这样也可以
    // return \TestTool::say();
	 // 这样还可以
    return TestTool::say();
});

任务:将上一篇文章实现的服务提供者改为静态访问

到这里已经可以对上一篇文章进行改造了。

第一步:新增静态代理类

文件:app/Facades/Test.php

<?php
namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class Test extends Facade
{
    public static function getFacadeAccessor()
    {
        return 'test';
    }
}

第二步:修改服务提供者类

文件:app/Providers/TestServiceProvider.php

public function register()
{
    $this->app->bind('test', function(){
        return new TestService();
    });
}

第三步:注册服务提供者与门面

文件:config/app.php

// 服务提供者
'providers' => [
    App\Providers\TestServiceProvider::class,
],
// 门面
'aliases' => [
    'Test'=>App\Facades\Test::class,
],

第四步:改造控制器方法

文件:TestController.php

<?php
namespace App\Http\Controllers;

use App\Facades\Test;

class TestController extends Controller
{
    public function test()
    {
        return Test::say('hi');
    }
}

这样就改造完成了

我是温新

每天进步一点点,就一点点

请登录后再评论