關於laravel門面和服務提供者使用的一點見解,門面之詞,不足之處,還請多多指教。
在laravel中,我們可能需要用到自己添加的類時,可以建立一個文件夾專門存放類文件,也可以使用laravel的服務提供者的方式來使用。
這兩者其實區別不大,主要是前者使用的話,會跟業務代碼產生依賴,想象一下,如果一個控制器之中引用了很多自定義的類文件的話,那么可以想像會產生多少依賴,所以我們可以使用服務提供者的方式,向laravel的容器內注冊類,這樣的話,就能夠在一個單獨的配置文件里面來管理依賴,邏輯和后期維護也會方便不少。
使用門面主要是可以不需要去實例化類,可以使用靜態方法的方式去訪問類的方法,用起來也比較方便,不過這樣其實也有缺點,比如不能夠直接跳轉到對應的方法內部,也不能直觀的去了解這個方法的用法,個人開發可能影響不大,不過如果團隊開發的,其實用起來可能會讓人有點暈暈的吧。
好了,話不多說,還是用代碼來說話吧。
此代碼是建立在laravel5.3的基礎上
一、建立一個需要用到類
在app
目錄下面見一個lib\Tools\FooBar.php
文件,這是我們的工具類,里面是我們定義的代碼。
<?php
namespace App\Lib\Tools;
class FooBar
{
public function get()
{
return 'hello facade';
}
}
二、建立一個服務提供者
使用php artisan make:provider FooServiceProvider
創建一個服務提供者,並將我們剛才編寫的工具類注冊到容器里面,
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Lib\Tools\FooBar;
class FooServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->bind('foo',function(){
return new FooBar();
});
}
}
如果需要慢加載的話,則需要添加在改服務提供者中添加一個$defer
屬性。並定義一個provides方法。如下所示:
protected $defer = true;
public function provides()
{
return [FooBar::class];
}
三、注冊服務提供者
在config\app.php
文件中的providers
屬性里面注冊我們剛添加的服務提供者,如下所示:
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\FooServiceProvider::class,
這樣我們就可以在項目中的任何地方使用我們剛才定義的工具類,可以直接在某個類的方法里面注入,然后就可以直接調用了。如果想要使用門面的話,可以往下看。
四、創建一個門面類
在app
目錄下面創建一個門面類,App\CustomFacades\Foo.php
,目錄這里是我自己建立的,這個可以隨便創建。只要在后面注冊的時候一致就可以。代碼如下:
<?php
namespace App\CustomFacades;
use Illuminate\Support\Facades\Facade;
class Foo extends Facade
{
protected static function getFacadeAccessor()
{
return 'foo';
}
}
五、注冊門面
在config\app.php
的aliases
屬性中追加下面的代碼:
'Foo' => App\CustomFacades\Foo::class,
以上步驟就注冊完成了,我們可以調用測試一下是否可用。
在routes\console.php
里面添加下面的代碼:
Artisan::command('testFacade',function(){
dd(Foo::get());
});
然后在項目根目錄的終端里面,調用下面的命令:
php artisan testFacade
如果輸出 hello facade
則說明都注冊成功,接下來,我們可以在項目的任何地方使用該自定義門面啦。
結束語
本篇文章主要介紹了怎么在laravel中使用自定義的服務提供者和門面類,基本上都是參照的官方文檔,如果有什么錯誤或者其他的地方,還望各位多指點指點。