服务容器, 服务提供者和门面之间都存在着一些因果关系, 单独的去理解某一个, 不太好理解
个人的理解, 我们新建一个类或一个接口来提供某种服务, 此时有三个对象, 服务(也就是我们新建的类或接口), 服务提供者(也就是 laravel 的 ServiceProvider), 容器(也就是 container app())

我们通过服务提供者, 把一个服务 注册到 容器中

容器

这个不用多说 laravel 的 app就是一个容器,可以使用 app() 来得到这个容器对象

服务

我们来新建一个服务,其实就是自已定义的一个类或接口(但一般来说服务应该是一个接口)

laravel容器化生产环境部署_开发语言


我们创建一个 Animal 接口, 并用 Cat 来实现它, 做为一个 服务吧

<?php
namespace App\Libs\MyLib;

interface Animal{

    public function jump();

    public function run();
}
<?php
namespace App\Libs\MyLib;

class Cat implements Animal{

    public function jump()
    {
        dd("this is the Cat jump");
    }

    public function run()
    {
        dd("this is the Cat run");
    }
}

上面有了服务, 这时就要有一个服务提供者(用于把容器和服务绑定(也收注册))

服务提供者

laravel 创建一个服务提供者 使用 php artisan make:provider XXXServiceProvider.php

laravel容器化生产环境部署_开发语言_02


成功之后, 就会在目录中多一个 服务提供者的类

laravel容器化生产环境部署_服务提供者_03


我们在register中把 Cat 绑定到容器

laravel容器化生产环境部署_开发语言_04


上面, 服务通过服务提供者绑定到了容器中, 我们此时还是不能使用的, 我们还差一步, 要把服务提供者注册到laravel 的配置文件中

laravel容器化生产环境部署_开发语言_05


通过以上的操作, 我们就把服务和容器绑定了, 并且框架在启动时就会做相应的配置

那么我们怎么使用我们注册的服务呢?

laravel容器化生产环境部署_php_06


上面的几种方式, 都是可以从容器中取出服务对象的


上面的几种方法取出服务的对象 写起来是不是有点太长, 太烦了, 我们有没有一种简单点的方法来取得对象呢, 这时就要说起 门面了

看一下 vendor/laravel/framework/src/iiiuminate/support/facades 下的文件, 都是门面的文件, 我们可以 模板的写一个自已的 门面类

laravel容器化生产环境部署_服务提供者_07

laravel容器化生产环境部署_laravel容器化生产环境部署_08


同样我们可以给门面注册一个别名

laravel容器化生产环境部署_laravel_09


laravel容器化生产环境部署_php_10

此时我们就可以使用 门面来用静态方法调用的方式来 调用方法了, (注意, 门面只对方法有用, 对属性调用是没有效果的)