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.

posted on 2017-03-07 10:47  blbl9527  阅读(303)  评论(0)    收藏  举报

导航


github sina微博 FB