laravel門面模式與服務提供者區別
以 Laravel 自帶的文件系統為例,在 config/app.php 的配置文件的 providers 數組中,注冊了一個服務提供者:
IlluminateFilesystemFilesystemServiceProvider::class,
在 alias 數組中定義了一個門面:
‘File’ => IlluminateSupportFacadesFile::class,
通過這兩個步驟,我們就可以非常方便的使用 Laravel 提供的文件系統相關的操作,而且調用形式很簡潔,如:
File::exist ($path),判斷文件是否存在。 File::get ($path, $lock = false),獲取一個文件的內容。 File::append ($path, $data),把內容追加到一個文件末尾。 File::files ($directory),獲取一個目錄下所有文件。
那么這是如何做到的呢?下面分別講一講 Laravel 的服務提供者和門面模式。
服務提供者
先看看定義:
服務提供者是所有 Laravel 應用程序啟動的中心所在。包括你自己的應用程序,以及所有的 Laravel 核心服務,都是通過服務提供者啟動的。
在文件系統這個服務提供者中,位置 /vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemServiceProvider.php
,register 方法可以看到綁定了一個單例:
protected function registerNativeFilesystem() { $this->app->singleton('files', function () { return new Filesystem; }); }
這個單例是 Filesystem 這個類的單例模式。當然,這個服務提供者中也可以綁定其他的單例,或做