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.php的providers数组中即可:
'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) 收藏 举报
浙公网安备 33010602011771号