在 Laravel 中使用 Facade 和 IoC 有什么意义

Kou*_*sha 5 dependency-injection facade inversion-of-control laravel

如果您要将类作为 IoC 的一部分注入控制器,我不明白 Facade 的意义。

假设我有一个名为PostHelper. 我有以下两个功能:

class PostHelper
{
    public function __construct() {} 

    public function all() {}

    public function get($id) {} 
}
Run Code Online (Sandbox Code Playgroud)

要使用这个助手,无论有没有门面,你都会(在你的控制器中说)

// Without Facade
$helper = new PostHelper();
return $helper->all();

// With Facade
return PostHelper::all();
Run Code Online (Sandbox Code Playgroud)

但是,这是不好的做法,因为我PostHelper在测试时无法模拟它。相反,我会将它传递给我的控制器的构造函数:

class HomeController extends BaseController
{
    private $PostHelper;

    public function __construct(PostHelper $helper)
    {
        $this->PostHelper = $helper;
    }

    public function index()
    {
        return $this->PostHelper->all();
    } 
}
Run Code Online (Sandbox Code Playgroud)

在构造函数中,$this->PostHelper = new $helper()如果我没有创建 Facade ,我就可以使用。无论哪种方式,我在使用 DI 时从不使用 Facade 的静态感觉。

那么使用 Facade 有什么意义呢?

Ake*_*rts 1

引用文档

Facade 为应用程序的 IoC 容器中可用的类提供“静态”接口。Laravel 附带了许多外观,您可能已经在不知情的情况下使用了它们!Laravel“外观”充当 IoC 容器中底层类的“静态代理”,提供简洁、富有表现力的语法的好处,同时保持比传统静态方法更高的可测试性和灵活性。

它只是使用外部依赖项的另一种方式,无需了解依赖项注入、如何使用 IoC 容器注册和/或获取项目等。它们很方便特别是对于缺乏经验的开发人员或 Laravel 新手来说。

如果您要注入依赖项(您应该这样做),则不需要外观。

您实际上可以模拟外观,但我仍然会练习正常的依赖注入。