首頁 >php框架 >Laravel >Laravel Facade 的詳細解讀

Laravel Facade 的詳細解讀

藏色散人
藏色散人轉載
2020-11-09 15:26:032366瀏覽

#下面由Laravel教學專欄給大家介紹Laravel Facade 的詳細解讀,希望對需要的朋友有幫助!

Laravel Facade 的詳細解讀

大家好,今天帶來的內容是 Laravel 的 Facade 機制實作原理。

Facade的簡單使用

資料庫的使用:

$users = DB::connection('foo')->select(...);

IOC容器

眾所周知,IOC容器是 Laravel 框架的最最重要的部分。它提供了兩個功能,IOC和容器。

  • IOC(Inversion of Control),也叫控制反轉。說穿了,就是控制對象的生成,使開發者不用關心對象的如何生成,只需要關心它的使用。
  • 而透過IOC機制產生的物件實例需要一個存放的位置,以便之後繼續使用,便是它的容器功能。

這次不準備講解IOC容器的具體實現,之後會有文章詳細解讀它。關於IOC容器,讀者只需要記住兩點即可:

  1. 根據配置產生物件實例;
  2. 儲存物件實例,方便隨時取用;

#簡化後Facade 類別

<?php
namespace facades;

abstract class Facade
{
    protected static $app;

    /** 
     * Set the application instance.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public static function setFacadeApplication($app)
    {   
        static::$app = $app;
    } 

    /** 
     * Get the registered name of the component.
     *
     * @return string
     *
     * @throws \RuntimeException
     */
    protected static function getFacadeAccessor()
    {
        throw new RuntimeException(&#39;Facade does not implement getFacadeAccessor method.&#39;);
    }

    /** 
     * Get the root object behind the facade.
     *
     * @return mixed
     */
    public static function getFacadeRoot()
    {   
        return static::resolveFacadeInstance(static::getFacadeAccessor());
    } 

    /**
     * Resolve the facade root instance from the container.
     *
     * @param  string|object  $name
     * @return mixed
     */
    protected static function resolveFacadeInstance($name)
    {
        return static::$app->instances[$name];
    }

    public static function __callStatic($method, $args)
    {
        $instance = static::getFacadeRoot();

        if (! $instance) {
            throw new RuntimeException(&#39;A facade root has not been set.&#39;);
        }   

        switch (count($args)) {
            case 0:
                return $instance->$method();
            case 1:
                return $instance->$method($args[0]);
            case 2:
                return $instance->$method($args[0], $args[1]);
            case 3:
                return $instance->$method($args[0], $args[1], $args[2]);
            case 4:
                return $instance->$method($args[0], $args[1], $args[2], $args[3]);
            default:
                return call_user_func_array([$instance, $method], $args);
        } 
    }
}

程式碼說明:

  1. $app中存放的就是一個IOC容器實例,它是在框架初始化時,透過setFacadeApplication( ) 這個靜態方法設定的
  2. 它實作了__callStatic 魔術方法
  3. getFacadeAccessor() 方法需要子類別去繼承,傳回一個string的標識,透過這個標識,IOC容器便能傳回它所綁定類別(框架初始化或其它時刻綁定)的物件
  4. 透過$instance 呼叫具體的方法

創建自己的Facade:

TEST1的具體邏輯:

<?php
class Test1{
	public function hello()
	{
		print("hello world");
	}}

TEST1 類別的Facade:

<?php
namespace facades;/**
 * Class Test1
 * @package facades
 *
 * @method static setOverRecommendInfo [设置播放完毕时的回调函数]
 * @method static setHandlerPlayer [明确指定下一首时的执行类]
 */class Test1Facade extends Facade{
    protected static function getFacadeAccessor()
    {   
        return &#39;test1&#39;;
    }   }

使用:

use facades\Test1Facade;Test1Facade::hello();  // 这是 Facade 调用

解釋:

    ##facades\Test1Facade 呼叫靜態方法hello () 時,由於沒有定義此方法,會呼叫__callStatic;
  1. 在__callStatic 中,首先是取得對應的實例,即
  2. return static::$app->instances[$name ];。這其中的$name,即為facades\Test1 裡的test1
  3. $app, 即為IOC 容器,類別的實例化過程,就交由它來處理。

以上是Laravel Facade 的詳細解讀的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除