#安装传送门 安装composer,以及通过composer安装laravel
#讲解使用
服务提供者这个具体表现都是围绕着依赖注入
在根目录config/app.php的providers中的数组中配置
#服务提供者可以理解成,为了能在系统的上下文中能够使用类示例,系统内部封装了反射分析容器中的注册的绑定类名或者别名,进行依赖管理和注入。
比如我需要在全文调用一个log方法,这个方法是用来进行项目中的debug的输出,替换掉普通的echo方法。类似tp3.2的想法会在系统的公共方法中写好,但是laravel基本都是oop所以这种就变成了类的调用的形式。可以在系统上注册一个服务提供者,然后在laravel的生命周期里面可以进行使用。下面是测试示例以及步骤
#先创建一个测试的log类
namespace AppHttpLogic; class LogLogic { public $type = null; public function __construct($type) { $allowType = ['MonogDB','File','Redis']; if(!in_array($type,$allowType)){ throw new Exception("can't find driver"); } $this->type = $type; } /** * @param $str */ public function log($str){ echo "当前使用的是".$this->type."驱动:{$str}"; } }
类我们创建好了,当然可以随处调用。但是我们可以通过依赖注入的方式能更加直观调用
接下来我们创建一个服务提供者
php artisan make:provider MlogProvider
在类中的register方法中进行实例化,以及绑定到容器
bind和singleton的区别是,bind是每次都是通过函数返回类的是实例,singleton是通过函数返回已经存在的实例(参照单例)
class MlogProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * @return void */ public function register() { // $this->app->bind(LogLogic::class, function ($app) { return new LogLogic(config('mconfig.logDriver')); }); } }
然后我们创建一个配置文件,config/mconfig。
return [ 'logDriver'=>'File' ];
在config/app.php中加入服务提供者
AppProvidersMlogProvider::class,
在controller中进行测试
<?php namespace AppHttpControllers; use AppHttpLogicLogLogic; use IlluminateHttpRequest; class UsersController extends Controller { // public function index(Request $requser,LogLogic $logLogic){ $logLogic->log('hello'); } }
然后访问路由:会正常输出
当前使用的是File驱动:hello
接下来我们测试一下单例的绑定
修改服务提供者
public function register() { // $this->app->singleton(LogLogic::class, function ($app) { return new LogLogic(config('mconfig.logDriver')); }); }
我们写入一个逻辑类,这里会去容器中获取LogLogic的实例,然后更改驱动为redis
<?php /** * Created by PhpStorm. * User: xujun * Date: 2018/3/10 * Time: 14:53 */ namespace AppHttpLogic; class TestSingletonLogic { public function step1(){ //利用app方法创建 $logLogic = resolve(LogLogic::class); $logLogic->type = 'Redis'; } }
修改controller
<?php namespace AppHttpControllers; use AppHttpLogicLogLogic; use AppHttpLogicTestSingletonLogic; use IlluminateHttpRequest; class UsersController extends Controller { // public function index(Request $requser,LogLogic $logLogic){ $logLogic->log('hello'); //将类型变成MonogDB $logLogic->type = 'MonogDB'; (new TestSingletonLogic())->step1(); $logLogic->log('laravel'); } }
输出结果,说明了容器内的对象是单例。
当前使用的是File驱动:hello当前使用的是Redis驱动:laravel