创建自定义 Facades 类

使用Laravel框架必不可少的会用到它很多强大的门面类(Facades),门面提供了一个“静态”接口到服务容器中绑定的类,官方文档阐述了如何使用系统自带的缓存门面,我们这里演示如何创建并使用一个自定义的门面类。

注:本教程基于上一节创建 Service Provider 测试实例服务提供者做部分代码修改,不熟悉的请参阅。

我们首先创建一个需要绑定到服务容器的Test类:

1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App\Facades;

class Test
{
public function doSomething()
{
echo 'This is TestClass\'s method doSomething';
}
}

然后创建一个静态指向Test类的门面类TestClass:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class TestClass extends Facade
{
protected static function getFacadeAccessor()
{
return 'test';
}
}

接下来我们要在服务提供者中绑定Test类到服务容器,修改TestServiceProvider类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\TestService;
use App\Facades\Test;

class TestServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{

}

/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->singleton('test',function(){
//return new TestService();
return new Test;
});

$this->app->bind('App\Contracts\TestContract',function(){
return new TestService();
});
}
}

再然后需要到配置文件config/app.php中注册门面类别名:

1
2
3
4
5
6
'aliases' => [

...//其他门面类别名映射

'TestClass' => App\Facades\TestClass::class,
],

最后修改TestController代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App;
use TestClass;
use App\Contracts\TestContract;

class TestController extends Controller
{

public function __construct(TestContract $test){
$this->test = $test;
}

/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
// $test = App::make('test');
// $test->callMe('TestController');
//$this->test->callMe('TestController');

TestClass::doSomething();
}

...//其他方法
}

注意:不要忘了在调用门面类TestClass的文件顶部使用use TestClass;引入TestClass,否则将不能正确调用。

好了,我们可以去浏览器中测试了,访问http://laravel.app:8000/test,页面将会输出:

This is TestClass's method doSomething