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

时间:2015-03-05 14:36:48

标签: laravel dependency-injection laravel-5 laravel-facade

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

现在我提出这样的想法:如果我们使用Facades这么多并调用静态方法如FaceadeName:nameOfMethod,Container实际上为我们创建了一个对象并调用它的方法,所以在某种程度上使用对于通过Facades也可用的类的laravel依赖注入几乎是无用的。

例如有这个类:

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中使用dependency injection作为Facades。 如果我是对的,请告诉我,如果我错了,请用正确的答案与我争辩。

1 个答案:

答案 0 :(得分:5)

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

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

对于依赖注入,你不应该尝试注入外墙,而应该是外墙已经引用的类。例如,\Lang外观引用Illuminate\Translation\Translator作为translator

绑定到容器

在课程中,您可以执行以下操作

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');
    }
}