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中直接调用了
<?php
namespace App\Http\Controllers;
use PublicToolAliase; //这里就是在 aliases 添加的别名了,如果别名换了,也请记得更新这里。
class UserController extends Controller
{
public function foo()
{
echo PublicToolAliase::tool(); //现在,我们就可以像使用静态类一样使用我们的自定义 Facade 了。
}
}
当然这时候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和静态方法最大的区别。
网友评论