laravel的“门面”和“契约”

Laravel的Facade就是从容器里调用服务的快捷方式。

没有Facade的时候,你可能要这样拿到一个服务/对象,然后调用:

$service = App::make('some_service');
$service->doSomething();

因为你在容器里注册了'some_service',所以容器能make一个实例给你。

Facade只是用静态方式简化了这个使用过程,底层用__callStatic把函数和参数传给服务实例:

class SomeService extends Facade
{
    protected static function getFacadeAccessor()
    {
       //这里返回的是ServiceProvider中注册时,定义的字符串
        return 'some_service'; // 这是容器里的键
    }
}

SomeService::doSomething(); // 底层和第一段代码是类似的

Contract就是一堆框架自带的接口,可以通过依赖注入得到具体实现。


定义一个Hello接口:
<?php
namespace App\Api\Contracts;

interface Hello
{
    public function hello();
}

实现该Hello接口:
<?php

namespace App\Api\Services;

use App\Api\Contracts\Hello;

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


在provide中注册绑定:实现类
namespace App\Api\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\Api\Contracts\Hello');
        //将Contract接口和它的实现类绑定
        $this->app->bind('App\Api\Contracts\Hello','App\Api\Services\HelloWorld');
    }
}

控制器中实现方法:
use App\Api\Contracts\Hello;

protected $hello;
public function __construct(Hello $hello){
     $this->hello=$hello;
}
public function index(Hello $hello) { // 等服务容器注入一个SomeService。
    $hello->doSomething();
}

Facade和Contract只是依赖注入容器的不同使用方式,用Facade就是自己去容器取(把容器当Service Locator用),用Contract就是等容器注入依赖。

猜你喜欢

转载自blog.csdn.net/weixin_41380972/article/details/82870243