laravel 服务提供者介绍和使用

#安装传送门 安装composer,以及通过composer安装laravel

#讲解使用

服务提供者这个具体表现都是围绕着依赖注入

在根目录config/app.php的providers中的数组中配置

 

#服务提供者可以理解成,为了能在系统的上下文中能够使用类示例,系统内部封装了反射分析容器中的注册的绑定类名或者别名,进行依赖管理和注入。

比如我需要在全文调用一个log方法,这个方法是用来进行项目中的debug的输出,替换掉普通的echo方法。类似tp3.2的想法会在系统的公共方法中写好,但是laravel基本都是oop所以这种就变成了类的调用的形式。可以在系统上注册一个服务提供者,然后在laravel的生命周期里面可以进行使用。下面是测试示例以及步骤

#先创建一个测试的log类

namespace App\Http\Logic;


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中加入服务提供者

App\Providers\MlogProvider::class,  

在controller中进行测试

<?php

namespace App\Http\Controllers;

use App\Http\Logic\LogLogic;
use Illuminate\Http\Request;

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 App\Http\Logic;


class TestSingletonLogic
{
    public  function  step1(){
        //利用app方法创建
        $logLogic = resolve(LogLogic::class);
        $logLogic->type = 'Redis';
    }
}  

修改controller

<?php

namespace App\Http\Controllers;

use App\Http\Logic\LogLogic;
use App\Http\Logic\TestSingletonLogic;
use Illuminate\Http\Request;

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

  

  

 

转载于:https://www.cnblogs.com/gavinjunftd/p/8540134.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值