Laravel进阶系列笔记--(四)Laravel 快速使用自定义门面
作者:温新
时间: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');
    }
}
这样就改造完成了
我是温新
每天进步一点点,就一点点
请登录后再评论