Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例

Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例

从某种意义上说,服务提供者有点类似HTTP控制器,HTTP控制器用于为相关路由注册提供统一管理,而服务提供者用于为相关服务容器提供统一绑定场所,此外服务提供者还可以做一些初始化启动操作。Laravel的每个核心组件都对应一个服务提供者,可以这么说,服务提供者是Laravel的心脏,是Laravel的核心,核心组件类在这里完成注册、初始化以供后续调用。

既然这么重要,那么如何在自己的Laravel应用中定义和使用服务提供者呢?

1、定义服务类

有了上一节有关服务容器的讲述,理解起服务提供者来很简单。我们这里先定义一个绑定到容器的测试TestService,为了对类的定义加以约束,我们同时还定义一个契约接口TestContract

定义TestContract如下:

<?php

namespace App\Contracts;

interface TestContract
{
    public function callMe($controller);
}

定义TestService如下:

<?php

namespace App\Services;

use App\Contracts\TestContract;

class TestService implements TestContract
{
    public function callMe($controller)
    {
        dd('Call Me From TestServiceProvider In '.$controller);
    }
}

2、创建服务提供者

接下来我们定义一个服务提供者TestServiceProvider用于注册该类到容器。创建服务提供者可以使用如下Artisan命令:

 php artisan make:provider TestServiceProvider 

该命令会在app/Providers目录下生成一个TestServiceProvider.php文件,我们编辑该文件内容如下:

<?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绑定实例到接口以便依赖注入
        $this->app->bind('App\Contracts\TestContract',function(){
            return new TestService();
        });
    }
}

可以看到我们使用了两种绑定方法,更多绑定方法参考服务容器文档

3、注册服务提供者

定义完服务提供者类后,接下来我们需要将该服务提供者注册到应用中,很简单,只需将该类追加到配置文件config/app.phpproviders数组中即可:

'providers' => [

    //其他服务提供者

    App\Providers\TestServiceProvider::class,
],

4、测试服务提供者

这样我们就可以在应用中使用该服务提供者了,为了测试该服务提供者我们首先使用Artisan命令创建一个资源控制器TestController

php artisan make:controller TestController

然后在路由配置文件routes.php中定义路由:

Route::resource('test','TestController');

最后去TestController中编写测试代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
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()
    {
        // $test = App::make('test');
        // $test->callMe('TestController');
        $this->test->callMe('TestController');
    }

    ...//其他控制器动作
}

 

然后我们去浏览器中访问http://laravel.app:8000/test,分别测试使用App::make和依赖注入解析绑定类调用callMe方法的输出,结果一样,都是:

"Call Me From TestServiceProvider In TestController"

好了,大功告成,是不是很简单?!

此外,Laravel服务提供者还支持延迟加载,具体可参考服务提供者文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113202.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 跨域访问是什么_什么是跨域?怎么解决跨域问题

    跨域访问是什么_什么是跨域?怎么解决跨域问题跨域访问是什么同源策略1995年,同源政策由Netscape公司引人浏览器。目前,所有测览器都实行这个政策。同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。随着互联网的发展,“同源政策”越来越严格。目前,如果非同源,共有三种行为受到限制:】Cookie、LocalStorage和IndexDB无法读取DOM无法获得AJAX请求不能发送虽然这些限制是必要的,但是有时很不方便,合理的用途也受到影响。所谓“同源”指的是“三个相同”:协议相同、域名相同以及端相同。域名是什么

    2022年10月1日
    3
  • connection closed gracefully_kalilinux中文乱码

    connection closed gracefully_kalilinux中文乱码使用FTPClient向linux上传文件出现这个错误org.apache.commons.net.ftp.FTPConnectionClosedException:Connectionclosedwithoutindication. atorg.apache.commons.net.ftp.FTP.__getReply(FTP.java:317) atorg.apache….

    2022年8月30日
    2
  • python Input输入

    python Input输入实例age:数字类型age:字符串类型age:输入数字类型转换字符串类型方式2%d数字%f浮点方式3

    2022年7月5日
    24
  • byte类型转换运算

    byte类型转换运算java中正数由原码表示,负数由补码表示!(符号位不取反!)(1)bytea=(byte)128 结果为-128128原码表示:00000000000000000000000010000000,取最后8位,最高位为1,表示负数。取反,加1,结果-128。(2)bytea=(byte)-129 结果为127-129补码表示:111111111111111

    2022年6月24日
    31
  • rstudio安装后打不开_r语言和rstudio的安装

    rstudio安装后打不开_r语言和rstudio的安装1、r语言的下载地址TheComprehensiveRArchiveNetwork​cran.r-project.org2、安装:按着提醒直接下一步,路径不用改,默认的就可以,但是不可以出现中文,64位系统就全选,32位系统不能选64位系统,一个是32位一个是64位。3、下载RStudio安装包RStudio​www.rstudio.com免费的4、安装rstudio跟着提醒点击下一步,安…

    2022年6月27日
    323
  • VS2013/2015 各版本 产品密钥

    VS2013/2015 各版本 产品密钥VS2013 产品密钥 VisualStudioUltimate2013KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9VisualStudioPremium2013KEY(密钥):FBJVC-3CMTX-D8DVP-RTQCT-92494VisualStudioProfessiona

    2022年5月12日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号