当前位置: 首页 > 后端技术 > PHP

Laravel自定义服务提供者

时间:2023-03-29 13:40:46 PHP

简介Laravel的服务提供者是框架的核心,提供路由、日志、缓存等功能。这里要实现的需求是使用第三方API获取天气情况,涉及到服务提供者、合约、依赖注入等,相关内容可以通过下面的参考资料了解。本文内容不做介绍。代码可以在GitHub上查看。创建服务提供者可以使用artisan快速创建服务提供者,在app/Providers目录下执行phpartisanmake:providerWeatherServiceProvider创建一个WeatherServiceProvider.php文件;在config/app.php中注册服务提供者,并在providers数组中创建服务提供者在创建的服务提供者App\Providers\WeatherServiceProvider::class中写入,并创建一个合约如下在app目录下新建Contracts目录存储合同文件;在app/Contracts目录下创建合约,即Weather.php接口文件。接口中只定义了公共函数getWeather($cityName);一种方法用于获取天气信息;执行合约,在app目录下新建Service/Weather目录,存放实现Weather.php合约的文件;选择第三方天气API来实现合约。这是了解天气的用途。API调用,可以查看文档;最终创建的文件是app/Service/Weather/Xinzhi.php。继承自Weather.php接口文件,必须实现所有的getWeather方法,代码可在GitHub上查看;这是一个伏笔。除了上面的xinzhi.php,选择和风天气实现合约,文件为app/Service/Weather/Hefeng.php。检查GitHub的代码;我们已经实现了服务提供者绑定的契约,接下来就是绑定具体的实现类了。回到一开始创建的服务提供者,在注册方法中添加如下代码$this->app->bind('App\Contracts\Weather',function(){returnnewXinzhi();});终于可以正常使用了。创建一个新路由并测试它。尝试通过依赖注入调用publicfunctiongetWeather(Request$request,Weather$weather){return$weather->getWeather($request->input('city','beijing'));}完成以上所有步骤,这个要求就满足了。好像很麻烦对不对?可以封装一个函数,直接调用。无需自定义服务提供商或创建合同。其实,上述步骤的目的之一就是副标题中的两个字——解耦。假设,我们需要在很多代码中使用这个功能,突然有一天,这个API挂了,怎么办?环顾四周,检查代码,然后修改它,注意参数,返回值等。只是听起来很烦人。这时候,如果我们的代码按照上面的步骤进行开发,解决方案就会大不一样了。总之,一行代码就可以搞定。还记得上面的铺垫吗,实现接口的实例有两个。修改自定义服务提供者注册如下$this->app->bind('App\Contracts\Weather',function(){//returnnewXinzhi();returnnewHefeng();});修改合约绑定后,所有使用Weather合约进行依赖注入的实例都会从Xinzhi.php实例切换到Hefeng.php实例。当然,合约不仅仅是脱钩。代码更易于理解和维护,甚至可以作为一份简洁的开发文档。如需更深入的了解,请参阅以下参考资料。参考资料:底层原理-服务提供者、底层原理-契约、Laravel服务容器实例教程-深入理解控制反转(IoC)和依赖注入(DI)、Laravel依赖注入从学徒到匠人系列文章。