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

Sia*_*osh 1 dependency-injection laravel laravel-5 laravel-facade

我正在为Laravel 5开发一个包,我决定在使用Laravel的Core类时从我的包中依赖注入中获益,但是在阅读了更多内容之后并且也提出了这个问题 Laravel 5包中的依赖注入的最佳方法

现在我提出这样的想法:如果我们使用Facades这么多并且调用静态方法,比如FaceadeName:nameOfMethodContainer实际上为我们创建了一个对象并调用它的方法,那么在某种程度上使用依赖注入laravel用于类也可以通过Facade获得几乎没用.

例如,有这个类:

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');           
 }
}
Run Code Online (Sandbox Code Playgroud)

这样做:

 App::bind('lang', function($app)
 {
    return new \Lang();
  });    
Run Code Online (Sandbox Code Playgroud)

然后在功能中:

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

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

这不是一个好主意,改变myFunction

 public function myFunction(\Lang $lang){
     $this->text = $lang::get('package::all.text1');           
 }
Run Code Online (Sandbox Code Playgroud)

同样,它可能看起来像方法注入,但它没有带来太多的优势.因此,这将是最好不要使用dependency injection用于Facades在Laravel.如果我是对的,请告诉我,如果我错了,请用正确的答案与我争辩.

Wad*_*der 5

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

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

对于依赖注入,您不应该尝试注入外墙,而应该是外观已经引用的类.例如,作为绑定到容器的\LangFacade引用Illuminate\Translation\Translatortranslator

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

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');
    }
}
Run Code Online (Sandbox Code Playgroud)