laravel的服务提供者

仓廪实而知礼节,衣食足而知荣辱

在依赖注入这一篇博客里, 我们在一个已有的AppServiceProvider(服务提供者)中做了一个简单的绑定
app\Providers\AppServiceProvider.php

1
2
3
4
5
6
7
use App\Repositories\UserRepository;
use App\Repositories\UserRepositoryInterFace;

public function register()
{
$this->app->bind(UserRepositoryInterFace::class, UserRepository::class);
}

现在我们创建一个自己的服务提供者

创建服务提供者

php artisan make:provider RepostiyServiceProvider
app\Providers\RepostiyServiceProvider.php

注册

config\app.php

1
2
3
4
'providers' => [
......
\App\Providers\RepostiyServiceProvider::class
],

接口和类的绑定

1
2
3
4
5
6
7
8
9
10
11
use App\Repositories\UserRepository;
use App\Repositories\UserRepositoryInterFace;
use Illuminate\Support\ServiceProvider;

class RepostiyServiceProvider extends ServiceProvider
{
.....
public function register()
{
$this->app->bind(UserRepositoryInterFace::class, UserRepository::class);
}

同样实现了上一篇博客的依赖注入
还可以这样绑定

1
2
3
4
5
6
7
public function register()
{
//$this->app->bind(UserRepositoryInterFace::class, UserRepository::class);
$this->app->bind('App\Repositories\UserRepositoryInterFace',function(){
return new UserRepository();
});
}

绑定单例

1
2
3
4
5
6
7
8
use App\Repositories\UserRepository;
public function register()
{
//使用singleton绑定单例
$this->app->singleton('test',function(){
return new UserRepository();
});
}

在HomeController.php中使用

1
2
3
4
5
public function index()
{
$test = \App::make('test');
$test->haha();
}

或者

1
2
3
4
5
public function index()
{
$test = app('test');
$test->haha();
}

绑定一个普通类

现在假设我们有一个特别功能的 FooService 类。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace App\Services;
class FooService
{
public function __construct()
{
...
}
public function doSomething()
{
// Code for Something.
}
}

如果我们要调用类的 doSomething 方法,我们可能会这样做 :

1
2
$fooService = new \App\Services\FooService();
$fooService->doSomething();

这看起来没有什么问题,但比较麻烦的是这儿的 ‘new’ 关键字,我的意思是虽然这样也很好,但是我们可以做的更优雅 (记住写代码要像 Laravel 一样,用优雅的方式)。

如何绑定 ?
绑定简单得可以用一行代码完成

1
$this->app->bind('FooService', \App\Services\FooService::class);

使用

1
2
3
4
5
// 使用IoC 我们可以这么做
$fooService = app()->make('FooService');
$fooService->doSomething();
// 也可以精简为一行代码
app()->make('FooService')->doSomething();

https://laravel-china.org/topics/10273/laravel-service-container-must-know