laravel自定义门面类(外观类|facade)
1.为什么要定义门面类?
--我的答案来源于之前看设计模式相关资料得来的,门面为了简化对一个复杂系统的使用。而在laravel中,门面是针对服务的,通过门面可以简化服务类的使用。
2.大致的思路?
首先:有一套服务类{服务类|服务提供者类},然后:添加一个外观类(就是门面类的意思),最后:配置config/app.php,把外观注册一下。
下面分两个大步骤(一)创建服务;(二)创建并配置外观;(三)可以测试了。
(一)创建服务:{服务协约|服务类|服务提供者类|注册|测试}
<?php
//文件:app\Contracts\TestContract.php
namespace App\Contracts;
interface TestContract{
public function callMe($controller);
}
<?php
//文件:app\Services\TestService.php
namespace App\Services;
use App\Contracts\TestContract;
class TestService implements TestContract{
public function callMe($controller){
echo 'TestService method \'callMe($controller)\' is running in controller '.$controller;
}
}
<?php
//文件:app\Providers\TestServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\TestService;
class TestServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton('test',function(){
return new TestService();
});
$this->app->bind('App\Contracts\TestContract',function(){
return new TestService();
});
}
}
//文件:config/app.php 的部分内容,在组中添加
'providers' => [ App\Providers\TestServiceProvider::class,],
<?php
//文件:app\Http\Controllers\TestController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App;
use App\Contracts\TestContract;
class TestController extends Controller
{
public function __construct(TestContract $test){
$this->test = $test;
}
public function index()
{
// $test = App::make('test');
// $test->callMe('TestController');
$this->test->callMe('TestController...');
}
//文件:app\Http\routes.php部分内容
Route::resource('test','TestController');
(二)创建并配置外观:{}
<?php
//文件:app\Facades\TestFacade.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class TestFacade extends Facade
{
protected static function getFacadeAccessor(){
//这里返回的是在服务提供者里面注册到容器中的名称,
//这里返回的是服务的单例
return 'test';
//也可以通过如下方式返回一个服务的新的对象,而不是返回一个单例
//return 'App\Contracts\TestContract'
}
}
//文件:config/app.php
在文件中的'aliases' 数组中添加一条,内容如下:
'Test' => App\Facades\TestFacade::class,
这里解释一下,这个数组是外观配置的地方,每一个记录的键为外观的别名,记录的值为真正的外观类的名称。
<?php
//文件:app\Http\Controllers\TestController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App;
use App\Contracts\TestContract;
------下面是错误的引入外观方式---------
//use App\Facades\TestFacade;
-------下面是正确方式引入外观---------
use Test;
class TestController extends Controller
{
public function index()
{
//第一种方式使用服务,
// $test = App::make('test');
// $test->callMe('TestController');
//第二种方式使用服务,这个服务是个单例,使用此方式需要构造函数进行依赖注入
//$this->test->callMe('TestController...');
//第三种方式使用服务,外观方式,使用此方式需要use引入次外观类,只需引入在config/app.php中定义的别名即可
Test::callMe('TestController');
}
(三)测试:{}
_______________________________________________
that's all.
浙公网安备 33010602011771号