gpt4 book ai didi

dependency-injection - Laravel 4 : Facade vs DI (when to use)

转载 作者:行者123 更新时间:2023-12-03 14:32:07 25 4
gpt4 key购买 nike

我的理解是外观被用作依赖注入(inject)的替代方案。如果我弄错了,请纠正。尚不清楚何时应该使用其中一种。

每种方法的优点/缺点是什么?我应该如何确定何时使用其中一种?

最后,为什么不同时使用两者?我可以创建一个引用接口(interface)的外观。 Sentry 2 似乎是这样写的。有最佳实践吗?

最佳答案

外墙

Facades不是依赖注入(inject)的替代品。

Laravel Facade 是 Service Locator Pattern 的一个实现,它创建了一种简洁美观的访问对象的方式:

MyClass::doSomething();

这是静态方法的 PHP 语法,但 Laravel 改变了游戏规则,使它们在幕后成为非静态的,为您提供了一种美丽、愉快和可测试的编写应用程序的方式。

依赖注入(inject)

基本上,依赖注入(inject)是一种将参数传递给构造函数和方法同时自动实例化它们的方法。
class MyClass {

private $property;

public function __construct(MyOtherClass $property)
{
/// Here you can use the magic of Dependency Injection

$this->property = $property

/// $property already is an object of MyOtherClass
}

}

更好的构造方法是在依赖注入(inject)的构造函数上使用接口(interface):
class MyClass {

private $property;

public function __construct(MyInterface $property)
{
/// Here you can use the magic of Dependency Injection

$this->property = $property

/// $property will receive an object of a concrete class that implements MyInterface
/// This class should be defined in Laravel elsewhere, but this is a way of also make
/// your application easy to maintain, because you can swap implementations of your interfaces
/// easily
}

}

但请注意,在 Laravel 中,您可以以相同的方式注入(inject)类和接口(interface)。要注入(inject)接口(interface),你只需要告诉它一个将是这样的:
App::bind('MyInterface', 'MyOtherClass');

这将告诉 Laravel,每次你的方法之一需要一个 MyInterface 实例时,它应该给它一个 MyOtherClass。

这里发生的是这个构造函数有一个“依赖”: MyOtherClass ,它将由 Laravel 使用 IoC container 自动注入(inject).因此,当您创建 MyClass 的实例时, Laravel 会自动创建 MyOtherClass 的实例并将其放入变量 $class .

依赖注入(inject)只是开发人员创建的一个奇怪的行话,用于执行诸如“自动生成参数”之类的简单事情。

何时使用一个或另一个?

正如你所看到的,它们是完全不同的东西,所以你永远不需要在它们之间做出决定,但你必须决定在你的应用程序的不同部分中将一个或另一个放在哪里。

使用外墙 以简化您编写代码的方式。例如:为您的应用程序模块创建包是一种很好的做法,因此,为这些包创建外观也是一种使它们看起来像 Laravel 公共(public)类并使用静态语法访问它们的方法。

使用依赖注入(inject) 每次您的类(class)需要使用来自另一个类(class)的数据或处理时。它将使您的代码可测试,因为您将能够将这些依赖项的模拟“注入(inject)”到您的类中,并且您还将执行 single responsibility原理(看看 SOLID principles )。

关于dependency-injection - Laravel 4 : Facade vs DI (when to use),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19193532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com