仓廪实而知礼节,衣食足而知荣辱
在依赖注入这一篇博客里, 我们在一个已有的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('App\Repositories\UserRepositoryInterFace',function(){ return new UserRepository(); }); }
|
绑定单例
1 2 3 4 5 6 7 8
| use App\Repositories\UserRepository; public function register() { $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() { } }
|
如果我们要调用类的 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
| $fooService = app()->make('FooService'); $fooService->doSomething();
app()->make('FooService')->doSomething();
|
https://laravel-china.org/topics/10273/laravel-service-container-must-know