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');
}
}
我正在为 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');
}
}