• laravel 服务提供者介绍和使用


    #安装传送门 安装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
    

      

      

     

  • 相关阅读:
    oracle:wm_concat函数与oracle版本
    “default关键字”与“序列化传输”的注意事项
    silverlight:利用telerik中的zip类对字符串进行压缩、解压
    引爆点不是坏事
    Liked:基于FriendFeed API的信息过滤器
    器物的改变
    让Blog成为一个中心?
    环球企业家《信息网站的未来》
    The readings, filtered by social network!
    0509·刘未鹏的TopLanguage聚会[一]
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/8540134.html
Copyright © 2020-2023  润新知