laravel門面和服務提供者使用


    關於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.phpaliases屬性中追加下面的代碼:

 'Foo' => App\CustomFacades\Foo::class,

以上步驟就注冊完成了,我們可以調用測試一下是否可用。
routes\console.php里面添加下面的代碼:

Artisan::command('testFacade',function(){
    dd(Foo::get());
});

然后在項目根目錄的終端里面,調用下面的命令:

php artisan testFacade

如果輸出 hello facade則說明都注冊成功,接下來,我們可以在項目的任何地方使用該自定義門面啦。

結束語

本篇文章主要介紹了怎么在laravel中使用自定義的服務提供者和門面類,基本上都是參照的官方文檔,如果有什么錯誤或者其他的地方,還望各位多指點指點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM