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.如果我是对的,请告诉我,如果我错了,请用正确的答案与我争辩.
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)
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |