laravel-服务提供者-我是这么理解的

关于 laravel 的很多理解还是比较缺乏,最近看 laravel 学院的基础教程,这里把我的个人理解放这里,方便日后温故。

原理概括

  1. 第一步定义服务类。也就是我们具体的逻辑方法等,定义这个类又应该有契约约束,所以定义接口并让服务类继承实现,所以第一步是包括服务类和接口的定义。
  2. 第二步定义服务提供者。服务有了,需要专人负责实时所提供的服务,实例化对象和绑定在这里完成。
  3. 第三步注册服务。公司装修好了,设备也都能运转了,可要是向所有人提供服务就需要获得政府的认可和注册,告诉政府公司地址,以便管控。
  4. 第四步开店营业。所有事务都以准备完毕,可以开张营业了,店面负责展示和向公司提交订单等业务逻辑(路由、控制器和视图)。

案例实现

1、定义服务类

按照正常思维逻辑,我们需要实现某功能或服务,现在,我们创建服务类,考虑到创建服务类应该先创建其接口来约束该类,所以我们要先创建这个约束其行为的接口app\TestContracts\TestContract.php

<?php

namespace App\Contracts;

interface TestContract
{

public function callMe($controller);
}

然后我们来定义针对这个接口的实现,具体的服务逻辑app\Services\TestService.php

<?php

namespace App\Services;

use App\Contracts\TestContract;

class TestService implements TestContract
{

public function callMe($controller)
{

dd('Call Me From TestServiceProvider In '.$controller);
}
}

2、创建服务提供者

第一步是为了制造机器,机器制造好了,需要用好机器,服务提供者就是用机器的人,绑定和实例化应该是在这里完成。
定义一个服务提供者TestServiceProvider,运行下面的命令:

php artisan make:provider TestServiceProvider

成执行会在app/Providers目录下生成一个TestServiceProvider.php文件,我们修改其内容如下:

<?php

namespace App\Providers;

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

class TestServiceProvider extends ServiceProvider
{

/**
* Bootstrap the application services.
*
* @return void
*/

public function boot()
{

//
}

/**
* Register the application services.
*
* @return void
* @author LaravelAcademy.org
*/

public function register()
{

//使用singleton绑定单例
$this->app->singleton('test',function(){
return new TestService();
});

//使用bind绑定实例到接口以便依赖注入
$this->app->bind('App\Contracts\TestContract',function(){
return new TestService();
});
}
}

register() 方法里的这两种绑定方式是由区别的,可以参考服务容器文档了解更多。

3、注册服务提供者

服务提供者多了,系统难免难于管理,为了更有条理的管理好各类服务提供者,应该有政府出面来负责各类服务的注册,注册的意思就是说,只有在政府注册了的公司才可以合法经营。
laravel 所有的注册都是在config/app.php里。我们在provider数组里追加我们新增加的服务:


// 更多

'providers' => [

//其他服务提供者

App\Providers\TestServiceProvider::class,
],

// 更多

4、测试服务提供者

这里包括创建测试用控制器和视图,添加测试用路由等。

创建控制器

创建TestController控制器,运行:

php artisan make:controller 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;
}

/**
* Display a listing of the resource.
*
* @return Response
* @author LaravelAcademy.org
*/

public function index()
{

// $test = App::make('test');
// $test->callMe('TestController');
$this->test->callMe('TestController');
}

...//其他控制器动作
}

配置路由

routes.php中添加一条路由:

Route::resource('test','TestController');

此时,我们可以测试下:http://youwebsite/test,应该会输出这样一行内容:

“Call Me From TestServiceProvider In TestController”

此外,Laravel服务提供者还支持延迟加载,具体可参考服务提供者文档