Laravel 在拉雷维尔与国际奥委会一起使用门面有什么意义

Laravel 在拉雷维尔与国际奥委会一起使用门面有什么意义,laravel,dependency-injection,inversion-of-control,facade,Laravel,Dependency Injection,Inversion Of Control,Facade,如果要将类作为IoC的一部分注入控制器,我不理解Facade的意义 假设我有一个名为PostHelper的定制外观。我有以下两个功能: class PostHelper { public function __construct() {} public function all() {} public function get($id) {} } 要使用此辅助对象,无论有无立面,您都可以(在控制器中) 但是,这是一种糟糕的做法,因为我无法在测试PostHelpe

如果要将类作为IoC的一部分注入控制器,我不理解Facade的意义

假设我有一个名为
PostHelper
的定制外观。我有以下两个功能:

class PostHelper
{
    public function __construct() {} 

    public function all() {}

    public function get($id) {} 
}
要使用此辅助对象,无论有无立面,您都可以(在控制器中)

但是,这是一种糟糕的做法,因为我无法在测试
PostHelper
时对其进行模拟。相反,我会将其传递给控制器的构造函数:

class HomeController extends BaseController
{
    private $PostHelper;

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

    public function index()
    {
        return $this->PostHelper->all();
    } 
}
在构造函数中,如果没有创建Facade,我可以使用
$this->PostHelper=new$helper()
。无论哪种方式,在使用DI时,我都不会使用外观的静态感觉

那么,使用门面有什么意义呢?

引用以下内容:

Facades为应用程序的IoC容器中可用的类提供“静态”接口。Laravel飞船有很多正面,你可能在不知不觉中使用过它们!Laravel“facades”充当IoC容器中底层类的“静态代理”,提供简洁、表达性语法的好处,同时保持比传统静态方法更高的可测试性和灵活性

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

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


,但我仍然会练习正常的依赖项注入。

因此在实际应用程序中,Facade并不有用,因为您应该始终注入依赖项。如果您想这样看,当然可以。我不赞成清教徒的“PHP应用程序是垃圾,除非它们完全是这样编写的”心态,因为开发者之间的观点总是不同的。我鼓励在您的域代码中使用DI,但更喜欢在控制器中使用facades,因为它易于开发,并且控制器是特定于框架的(通常不必如此)。如果您在控制器中使用(自定义)facades,您如何为它们编写单元测试?模仿它们容易吗?我没有费心测试控制器代码。我的控制器通常只是将请求数据传送到域层中的服务,这些服务是自己测试的。我不能告诉你模仿外表是容易还是不容易(不过,文件让人觉得这没什么大不了的)。
class HomeController extends BaseController
{
    private $PostHelper;

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

    public function index()
    {
        return $this->PostHelper->all();
    } 
}