---
### 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);
}