• Laravel中Contracts的理解和使用


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

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

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

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

    第一步,写一个Contract接口:

    <?php
    namespace AppContracts;
    
    interface Hello
    {
        public function hello();
    }

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

    <?php
    namespace AppServices;
    
    use AppContractsHello;
    
    class HelloWorld implements Hello
    {
        function hello(){
            return "Hello!~~";
        }
    }

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

    <?php
    namespace AppProviders;
    
    use IlluminateSupportServiceProvider;
    
    class HelloServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            //
        }
    
        public function register()
        {
            //给这个接口一个别名
            $this->app->bind('Hello','AppContractsHello');
            //将Contract接口和它的实现类绑定
            $this->app->bind
            ('AppContractsHello','AppServicesHelloWorld');
        }
    }

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

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

    AppProvidersHelloServiceProvider::class,

    第五步,可以使用了:

    <?php
    
    namespace AppHttpControllers;
    
    use AppContractsHello;
    
    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实现类中的返回内容了。
    这里对第五步做几点说明:

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

  • 相关阅读:
    Promises-小程序购物车结算
    微信小程序支付
    微信企业付款到零钱
    Ubuntu16 远程连接MySQL
    MySQL数据库中文变问号
    Ubuntu开启ApacheRewrite功能
    大数据2018:云存储已在客观层面扮演数据湖角色
    地平线发布兼具本地端抓拍与识别功能的嵌入式AI摄像机
    肥皂遇上黑科技!异味统统都走开!
    LG新专利或用于移动VR,可通过外部旋钮调节显示屏与透镜
  • 原文地址:https://www.cnblogs.com/vania/p/11858343.html
Copyright © 2020-2023  润新知