您的位置:首页 > 编程语言 > PHP开发

Laravel中的门面功能Facades

2019-06-17 13:58 1396 查看
Laravel中的门面功能Facades

Laravel中的门面功能是选择性使用的,也可以不用它,不影响功能实现。那么,为什么要用它呢?

只有搞清楚了使用门面的好处,我们才能更好的使用它。

当我们需要调用一个类的非静态方法时,我们有三种方法:
1、依赖注入,获取实例后直接调用。
2、app()方法获取实例,调用。
3、use 进来直接 new,然后调用。

第一种方式是最简单合理的,但是,使用门面后还能再简化一步。
use A;
A::get();
虽然get()方法是非静态的,但是设置了门面后就可以静态化调用。

因此,Facades就是静态代理,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。

Laravel框架自带了一些门面,vendor/illuminate/support/Facades

打开目录下Cache.php
<?php

namespace Illuminate\Support\Facades;

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

Cache门面是常用的缓存类,继承自 Illuminate\Support\Facades\Facade,在getFacadeAccessor
方法中返回一个容器cache,也就是最终是由cache的实例来提供服务的,Cache只是代理。

自定义门面
1、门面代理:app/Support/Facades/TestFacade.php
<?php
namespace App\Support\Facades;

use Illuminate\Support\Facades\Facade;

class TestFacade extends Facade
{
public static function getFacadeAccessor(){
return 'App\Services\Common\TestService';
}
}

2、服务容器:app\Services\Common\TestService.php
<?php
namespace App\Services\Common;

class TestService
{
public function get(){
return 'TestService@get';
}
}

3、使用门面
use App\Support\Facades\TestFacade;
$result = TestFacade::get();

门面多用在工具类的调用上,方便调用与调试。

实际上基类 Facade 实现一了个魔术方法 __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()来实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: