laravel版本5.1+

首先创建测试文件

1
php artisan make:controller TestController

修改路由文件route.php或者routes/web.php

1
Route::get('test', 'TestController@index');

创建服务提供者文件,这个文件的作用就是用来注册自定义的服务容器

1
php artisan make:provider HelloProvider

我们再创建一个容器文件夹app/Repositories这里存放相应的接口和应用类,现在上我们的主角

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
//app/Repositories/Hello.php
/**
 * Created by PhpStorm.
 * User: gpf
 * Date: 2016/12/18
 * Time: 下午9:30
 */

namespace App\Repositories;


interface Hello
{
    function say();
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
//app/Repositories/HelloRepository.php
/**
 * Created by PhpStorm.
 * User: gpf
 * Date: 2016/12/18
 * Time: 下午9:17
 */

 namespace App\Repositories;

class HelloRepository implements Hello
{
    public function say(){
        return 'hello baby';
    }

}

还记得刚才我们创建的HelloProvider吗?现在我们在这里注册一下服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
//app/Provider/HelloProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Repositories\Hello;
class HelloProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
   }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\Repositories\Hello','App\Repositories\HelloRepository');
    }
}

接下来是最重要的一步,那就是去注册这个服务,你发现每次安装一个依赖包的时候都会操作一个文件,那就是config/app.php,在providers这个数组中添加服务

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

现在就可以使用这个啦! 进入我们的TestController

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Repositories\Hello;

class TestController extends Controller
{
    public $provider = null;

    public function __construct(Hello $hello)
    {
        $this->provider = $hello;
    }

    public function index(){
        return $this->provider->say();
    }
}

访问 http://your-domain/test就能看到效果了

这里要记住,我们在控制器中调用的是接口,而接口已经通过provider已经注册绑定了一个符合接口规范的实例,这样的话我们只调用接口提供的外部方法,这样一个好处就是在控制器中我们就专注流程,具体的实现交给服务,内部需要什么依赖就服务自己去解决,而且服务是通用的,每个控制器都能调用,代码的可复用性可维护性,这一点项目初期可能会感觉不到,但是一旦发生变动的时候,重复改动的地方就会非常多,项目经营时间越长这个变动的代价就会越高

试想一下,如果你是每个controller中都写相同的调度逻辑,有一天你的产品经理对你说:这里这里改一下,添加个字段而已很简单的……你会不会有砍死他的冲动?如果用上了服务仓库,你完全可以先看一下仓库中需要改动的方法到底怎么样再考虑砍人的事情 :)