我正在为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
。
如果我是对的,请告诉我,如果我错了,请用正确的答案与我争辩。
答案 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');
}
}