---
### 1. 自定义门面类 -- 注册
> `AppServiceProvider` 中写入
public function register()
{
//注册方法
$this->app->singleton('product' , function (){
return new ProductService();
}); //单例模式
}
### 2. 建立一个 Product 类继承 Facade
> #### 这里 @method static getProduct($id) 调用创建的类的静态方法
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
/**
* Class Product
* @package App\Facades
* @method static getProduct($id)
*/
class Product extends Facade
{
protected static function getFacadeAccessor()
{
return 'product';
}
}
### 3. 建立实体类
namespace App;
class ProductService
{
public function getProduct($id)
{
echo "product id: ".$id;
}
}
### 4. 调用静态方法 -- 通过门面
public function facadeTest()
{
return \App\Facades\Product::getProduct(1);
}
### 5. 深入门面 , 为什么能调用 static, 在 Facade 中
> #### 首先看看这个方法存在不,不存在则直接实例化服务对象,然后通过反射传入参数调用可变参数
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);
}