Laravel Facades 是 WET 代码吗?

Is Laravel Facades are WET code?

根据文档:

Facades have many benefits. They provide a terse, memorable syntax that allows you to use Laravel's features without remembering long class names that must be injected or configured manually. Furthermore, because of their unique usage of PHP's dynamic methods, they are easy to test.

并根据这个link

Disclaimer: I don't necessarily agree that facades are bad or an anti-pattern

问题。 Facades 是 WET 代码吗?

Facade与干湿无关。外观只是服务容器之上的一个额外层。 Facade 只做一件事,那就是,它提供了一个 class 的给定名称,它是另一个 class 的别名,通过它你可以解析主 class 并且它允许你做它很容易,使用 static 方法调用样式,即使它不是静态的。让我们看一个例子:

$request = app('request');

$inputs = $request->all();

上面的代码解析了来自容器的请求 class 并且它可以从容器中解析它,因为在容器中,键 request 已经 bound/mapped 到 class 将由框架解决。解析机制存储在容器内,因此可以解析 class。请注意,没有涉及立面,那么立面有什么作用?

好吧,如果你使用 facade 做同样的事情,那么你可以使用这样的东西来做:

$inputs = Request::all();

在这种情况下,class 的外观将被调用并解析底层 class。主要有两个步骤:

1。获取别名,在本例中为 request

2。使用别名解析 class,即:app('request')

所以,它为你做的是,实际上外观本身为你调用 app('request') 但它做的唯一额外的事情是,它首先找到 alias 名称所以它可以使用容器中的那个名称来调用它。立面提供了通往 class(或建筑物)的便捷入口。希望我回答了你的问题。有关更多信息,请阅读 documentation.

中的立面