Laravel中Contracts的理解和使用

这两天详细的学习了下lavarel中Contracts和Facades这两部分内容。这一篇就先谈谈对contracts的理解和用法。


Laravel 的 Contracts 是一组定义了框架核心服务的接口。说白了就是一组接口。使用它就是为了降低耦合性。

即便如此,是不是也有同学会搞不清楚Contracts在lavarel体系中的到底在一个什么样的位置?下面上一张自制的图,也许有地方不对,但是初学的同学可以通过它大概的,简单的解决下心中的困惑。

这里写图片描述

通过这张图我们可以看到,当写好自定义的Contract接口及其实现类后,在ServiceProvider中绑定,此时服务容器已经登记上这个Contract了。之后就可以在要用到它的地方,经过服务容器解析直接使用了。


下面就详细写一下怎么具体的使用:

第一步,写一个Contract接口:

<?php
namespace App\Contracts;

interface Hello
{
    public function hello();
}

第二步,写上面Contract的实现类:

<?php
namespace App\Services;

use App\Contracts\Hello;

class HelloWorld implements Hello
{
    function hello(){
        return "Hello!~~";
    }
}

第三步,写一个自定义的ServiceProvider:

<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelloServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    public function register()
    {
        //给这个接口一个别名
        $this->app->bind('Hello','App\Contracts\Hello');
        //将Contract接口和它的实现类绑定
        $this->app->bind
        ('App\Contracts\Hello','App\Services\HelloWorld');
    }
}

这里起别名的作用,是为了在使用的时候方便,不需要写完整的命名空间;绑定的作用是为了使用Contracts时,服务容器能够有线索找到它的实现类,从而解析出来。

第四步,在config\app.php中注册这个服务提供者:
在providers中加入这行代码即可:

  App\Providers\HelloServiceProvider::class,

第五步,可以使用了:

<?php

namespace App\Http\Controllers;

use App\Contracts\Hello;

class DiaryController extends Controller
{
    /**
     * 测试:Hello实例
     *
     * @var Hello
     */
    protected $hello;

    /**
     * Create a new controller instance.
     * 创造一个Hello实例
     *
     * @param  Hello $hello
     * @return void
     */
    public function __construct(Hello $hello){
        $this->hello=$hello;
    }

    /**
     * Display a list of all of the user's diaries.
     *
     * @return Response
     */
    public function index(){
        return view('diaries.index',[
            'hello'=>$this->hello->hello(),
        ]);
    }
}

之后就可以在返回的视图中通过{{$hello}}来打印出Contract实现类中的返回内容了。
这里对第五步做几点说明:

  1. 在构造方法中,将Contract接口引入(注入)这里参数中‘Hello’就是刚才起的别名。
  2. 因为刚才已经在服务提供者中绑定了Contract和其实现方法,所以这里能够通过Hello这个Contract,解析并使用其实现类中的方法hello().

以上就是我对laravel中Contracts的理解。哪里不对还请纠正。

另外,尊重版权,转载请注明出处,谢谢大家!

                                                        by:Vin
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值