blbl9527

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.

分类:

技术点:

相关文章: