Laravel5.8自建Facade类

1.比如我在app的Services目录下面创建了一个公共类PubilcTool,现在我想把这个工具类自建成Facade

namespace App\Services;

class PubilcTool
{
    public function tool()
    {
         return  'facade test';
    }
}

2.在app下面创建Facades目录(目录位置任意选择,只要注意命名空间即可),然后创建PubilcTool继承Facade类,Facade的原理这里暂不讲解,请先自行查阅或者看源代码下面renturn的tool是等会在服务提供者中要绑定的别名。

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class PubilcTool extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'tool';
    }
}

3.通过命令行创建provider

$ php artisan make:provider PublicToolProvider
namespace App\Providers;

class PublicToolProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('tool', function ($app) {
            return new PublicTool();
        });
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

上面PublicToolProvider中的'tool'和PublicTool类绑定(这是服务容器的概念,请查阅官方文档),第二步Facade中return的'tool'和这里就联系起来了,当框架调用Facade时,PublicToolProvider就会把PublicTool类返回给你。

4.在config/app.php中添加,注意是分开来在providers和aliases数组中

'providers' => [
        ...
        App\Providers\PublicToolProvider::class, 
    ],
'aliases' => [
        ...
        'PublicToolAliase' => App\Custom\Facades\PublicTool::class, //这里写上我们的自定义 Facade,并定义一个别名用于最后引用的名字
    ],

5.最后就可以在任意的controller中直接调用了

当然这时候PhpStorm会报灰,只要再运行下面两部就可以了,没有ider-helper请先安装

composer dump-autoload
php artisan ide-helper:generate

总结:

很多人可能会有疑问,这和调用静态方法有什么区别呢。你可以做一下测试,在一个静态方法中写一个构造函数注入一些参数,而这些参数又是function中所需要的,直接调用静态方法是不会生成实例,自然也不会注入参数。

namespace App\Services;

public $client

class PubilcTool
{
    public function __construct($client)
    {
        $this->client = $client;
    }

    public function tool()
    {
         return  $this->client;
    }
}

但是如果使用Facade的话就可以在服务提供者中这么写,在生成PublicTool类的同时也有了Client实例:

    public function register()
    {
        $this->app->bind('tool', function ($app) {
            return new PublicTool(new Client(config('services.jpush.app_key')));
        });
    }

这就是Facade和静态方法最大的区别。

你可能感兴趣的:(Laravel5.8自建Facade类)