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');
}
}
这样就改造完成了
我是温新
每天进步一点点,就一点点
请登录后再评论