laravel绑定实例到容器和控制器依赖注入实例

1.设置约束(定义接口)用以限制依赖注入

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/9 0009
 * Time: 15:53
 */
namespace App\Contracts;

interface TestContract
{
    public function callMe($controller);
}

2.实现接口定义测试服务类

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/10/9 0009
 * Time: 15:55
 */
namespace App\Services;

use App\Contracts\TestContract;

class TestService implements TestContract
{
    public function callMe($controller)
    {
        dd('Call Me From TestServiceProvider In '.$controller);
    }
}

3.接下来我们定义一个服务提供者TestServiceProvider用于注册该类到容器。创建服务提供者可以使用如下Artisan命令:

php artisan make:provider TestServiceProvider

 

在服务提供者中绑定实例

<?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绑定实例到接口以便依赖注入  construct 方法中
/*        $this->app->bind('App\Contracts\TestContract',function(){
            return new TestService();
        });*/
        //可以使用bind 123 和服务  ,也可以绑定接口以便依赖注入
          $this->app->bind('test',function(){
            return new TestService();
        });


    }
}

  4.注册服务提供者

定义完服务提供者类后,接下来我们需要将该服务提供者注册到应用中,很简单,只需将该类追加到配置文件config/app.phpproviders数组中即可:

'providers' => [

    //其他服务提供者

    App\Providers\TestServiceProvider::class,
],

5.测试服务提供者

Artisan命令创建一个资源控制器TestController

php artisan make:controller TestController

然后在路由配置文件routes.php中定义路由:

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

6.最后去TestController中编写测试代码:

1)构造函数依赖注入类型

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()
    {

       $this->test->callMe('TestController');

    }
}

2)app::make('xxx')从服务容器中取出实例

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App;
use App\Contracts\TestContract;
class TestController extends Controller
{


    /**
     * Display a listing of the resource.
     *
     * @return Response
     * @author LaravelAcademy.org
     */
    public function index()
    {
         $test = App::make('test');
         $test->callMe('TestController');

    }
}

 

posted on 2017-10-17 18:34  running-fly  阅读(402)  评论(0)    收藏  举报

导航