laravel 服务容器、服务提供器、契约实例示例

本文介绍了如何在Laravel中创建服务提供器、契约和接口实现类,并通过服务容器来绑定和切换不同实现,强调了契约的低耦合性。通过一个详细的Demo,展示了如何在TestServiceProvider中配置接口与实现类的绑定,以及如何在控制器中验证切换的效果。文章还提及了利用Composer和自动加载提升开发效率。
摘要由CSDN通过智能技术生成

刚开始看 laravel 服务容器、契约、服务提供器的确生涩难懂,不单单是概念繁多,而且实际的 demo
很难找(找是找到了,但难用啊),最后就隔一段时间看一遍,大概个十来遍,还真给看出个门道,废话少说上代码。

(1)创建服务提供器

生成文件位于:项目 /app/Providers/TestServiceProvider

php artisan make:provider TestServiceProvider

同时修改配置文件 config/app.php,在 providers 数组中追加该服务提供器

'providers' => [
     App\Providers\TestServiceProvider::class,
],

(2)创建自己的工作目录(Test)

我的工作目录在:项目 /app/YangTest/Test 目录下

// 目录结构  
|---app 
	|---YangTest     
     	|---Test  
        	|---DemoInterface.php  
        	|---DemoProvider.php  
        	|---DemoProvider2.php 

写到这里你可能问我的工作目录下三个文件干什么用呢?不要着急,接下来我们逐个创建文件并进行讲解。
1:DemoInterface.php【接口文件】这个就是 laravel 中提到的
Contracts(契约),使用接口(契约)的原因官方也给了说明:低耦合和简单性,文件内容如下:

<?php 
namespace App\YangTest\Test;
interface DemoInterface
{ 
    function demo1();
    function demo2(); 
} 

接口中只简单定义两个测试方法,记住带上命名空间 App\Xiaocai\Test,这个很重要;
2:DemoProvider.php【接口实现类】,这个官方并没有特别说明,当然,有了接口当然会有对应的实现类去实现接口中的方法
文件内容如下:

<?php 
namespace App\YangTest\Test;
class DemoProvider implements DemoInterface
{
    public function demo1()
    {
    	// TODO: Implement demo1() method.
        return 'demo1';
    }
    public function demo2()
    {
    	// TODO: Implement demo2() method.
        return 'demo2';
    }
}

对于这个实现类,我是这样理解的,laravel
中的契约(接口)通过规定好方法名称,这样,第三方扩展包在想要实现这些契约方法的时候,必然要受到契约提供的方法的约束,防止滥用,使用户在使用
laravel
基础上的扩展包的时候,不必要再去了解底层代码逻辑,方法都是定义好的,尽管不同的包处理的逻辑不同,但是对于用户来说,都是调用的同一个方法,对于如何选择到底使用哪个实现类,我们也准备好了
DemoProvider2.php 类,他是 DemoInterface.php 的第二种实现方法。
3:DemoProvider2.php【接口实现类 2】内容如下

<?php 
namespace App\YangTest\Test;
class DemoProvider2 implements DemoInterface
{
    public function demo1()
    {
        return 'demo1的第二种实现';
    }
    public function demo2()
    {
        return 'demo2的第二种实现';
    }
}

3. 创建测试控制器

命令行运行:

php artisan make:controller TestController

4. 添加路由

为测试控制器添加一个测试路由,修改项目 /routes/api.php 文件,追加代码如下:

Route::get('/test', [\App\Http\Controllers\Test\TestController::class,"index"]);

5. 修改服务提供器文件(TestServiceProvider)

这里是重点!这里是重点!这里是重点!重要的事情我只说三遍

<?php

namespace App\Providers;

use App\YangTest\Test\DemoInterface;
use App\YangTest\Test\DemoProvider2;
use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServiceProvider
{
    // 可以直接用此方法绑定
    public  $bindings = [DemoInterface::class => DemoProvider2::class];

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // $this->app->bind(DemoInterface::class,DemoProvider2::class);
    }
}

在这里就可以对想要使用的实现接口(契约)类进行选择,$this->app->bind (arg1, arg2); 参数 1 代表接口类,参数 2 代表要使用的接口实现类,你可以在这里进行切换选择实现类,切换之后如何验证呢? $bindings 跟 $this->app->bind 类似

验证

修改 TestController 文件

<?php

namespace App\Http\Controllers\Test;

use App\Http\Controllers\Controller;
use App\YangTest\Test\DemoInterface;
use Illuminate\Http\Request;

class TestController extends Controller
{
    //
    public function index(DemoInterface $demo)
    {
        dd($demo->demo1());
    }
}

在这里插入图片描述

我们不妨修改一下实现类,在 TestServiceProvider 文件中修改如下:

    // public  $bindings = [DemoInterface::class => DemoProvider2::class];
    public  $bindings = [DemoInterface::class => DemoProvider::class];

此时再运行,如下
在这里插入图片描述

总结

如此一来,切换实现的方法是不是很简单,只需要在服务提供器中修改即可,果真是低耦合。如果文章中出现什么纰漏欢迎指出,防止祸害他人,如果觉得对您有帮助的话,点个赞支持一下吧

结语

另外 YangTest 工作目录是测试用的,当然如果做项目的话,你也可以把你的代码上传到 composer,这样通过 composer 直接引入到 vendor 目录下,通过 composer 的自动加载机制,这样是不是更能提高你的效率呢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值