服务容器, 服务提供者和门面之间都存在着一些因果关系, 单独的去理解某一个, 不太好理解
个人的理解, 我们新建一个类或一个接口来提供某种服务, 此时有三个对象, 服务(也就是我们新建的类或接口), 服务提供者(也就是 laravel 的 ServiceProvider), 容器(也就是 container app())
我们通过服务提供者, 把一个服务 注册到 容器中
容器
这个不用多说 laravel 的 app就是一个容器,可以使用 app() 来得到这个容器对象
服务
我们来新建一个服务,其实就是自已定义的一个类或接口(但一般来说服务应该是一个接口)
我们创建一个 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
成功之后, 就会在目录中多一个 服务提供者的类
我们在register中把 Cat 绑定到容器
上面, 服务通过服务提供者绑定到了容器中, 我们此时还是不能使用的, 我们还差一步, 要把服务提供者注册到laravel 的配置文件中
通过以上的操作, 我们就把服务和容器绑定了, 并且框架在启动时就会做相应的配置
那么我们怎么使用我们注册的服务呢?
上面的几种方式, 都是可以从容器中取出服务对象的
上面的几种方法取出服务的对象 写起来是不是有点太长, 太烦了, 我们有没有一种简单点的方法来取得对象呢, 这时就要说起 门面了
看一下 vendor/laravel/framework/src/iiiuminate/support/facades 下的文件, 都是门面的文件, 我们可以 模板的写一个自已的 门面类
同样我们可以给门面注册一个别名
此时我们就可以使用 门面来用静态方法调用的方式来 调用方法了, (注意, 门面只对方法有用, 对属性调用是没有效果的)