Laravel 5 包中的依赖注入使用或不使用

Dependency Injection in Laravel 5 Package To Use or Not To Use

我正在为 Laravel 5 开发一个包,我决定在使用 Laravel 的核心 classes 时从我的包中的依赖注入中获益,但在阅读更多内容之后问了这个问题 Best approach for Dependency Injection in Laravel 5 package

现在我想出了一个想法,如果我们经常使用 Facades 并调用像 FaceadeName:nameOfMethod 这样的静态方法,Container 实际上会为我们创建一个对象并调用它的方法,所以对某些人来说对 laravel 使用依赖注入扩展 classes 也可以通过 Facades 获得几乎没用。

例如有这个class:

class MyController extends \App\Http\Controllers\Controller
{        
  public $text;
  public $lang;

 public function __construct()
 {         
   // Some codes here                            
}

public function myFunction(){
   $this->text = \Lang::get('package::all.text1');           
 }
}

这样做:

 App::bind('lang', function($app)
 {
    return new \Lang();
  });    

然后在函数中:

public function myFunction()
{
    $lang = \App::make('lang');       
    $this->text = $lang::get('package::all.text1');           
}

几乎没用,因为我们将一些东西绑定到已经绑定在那里的容器

myFunction 更改为

不是一个好主意
 public function myFunction(\Lang $lang){
     $this->text = $lang::get('package::all.text1');           
 }

同样,它可能看起来像方法注入,但并没有带来太多优势。因此在Laravel中Facades最好不要使用dependency injection。 请让我知道我是否正确,如果我错了,请用正确的答案论证我的观点。

Facades 提供了一种通过 class 访问容器的方法,因此当您访问 \Lang::function() 时,您实际上是在调用 app('translator')->function()。因此,在上面的示例中,当您将 Lang 外观绑定到容器中时,您已经绑定了两次,这不是您想要的。

Laravel 的所有功能都已绑定到容器中,可以通过调用 app('object') 进行访问。您可以在此处查看所有绑定 http://laravel.com/docs/5.0/facades

对于依赖项注入,您不应该尝试注入外观,而是外观已经引用的 classes。因此,例如,\Lang 门面引用 Illuminate\Translation\Translator,它作为 translator

绑定到容器

在您的 classes 中,您可以执行以下操作

use App\Http\Controllers\Controller;
use Illuminate\Translation\Translator;

class MyController extends Controller
{
    protected $translator;

    // Dependency injection example
    public function __construct(Translator $translator)
    {
        $this->translator = $translator;
    }

    public function index()
    {
        $text = $this->translator->get('package::all.text1');
    }

    // Method injection example
    public function myFunction(Translator $translator)
    {
        $text = $translator->get('package::all.text1');
    }
}