使用Laravel框架必不可少的会用到它很多强大的门面类(Facades),门面提供了一个“静态”接口到服务容器中绑定的类,官方文档阐述了如何使用系统自带的缓存门面,我们这里演示如何创建并使用一个自定义的门面类。
注:本教程基于上一节服务提供者做部分代码修改,不熟悉的请参阅。
我们首先创建一个需要绑定到服务容器的Test类:
<?php namespace App\Facades; class Test { public function doSomething() { echo 'This is TestClass\'s method doSomething'; } }
然后创建一个静态指向Test类的门面类TestClass:
<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class TestClass extends Facade { protected static function getFacadeAccessor() { return 'test'; } }
接下来我们要在服务提供者中绑定Test类到服务容器,修改TestServiceProvider类如下:
<?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
中注册门面类别名:
'aliases' => [ ...//其他门面类别名映射 'TestClass' => App\Facades\TestClass::class, ],
最后修改TestController代码如下:
<?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