Laravel 5软件包中依赖注入的最佳方法

时间:2015-03-03 14:32:41

标签: laravel dependency-injection laravel-5

我正在为Laravel 5开发一个软件包,现在我需要从依赖注入中受益,以获得更具可伸缩性和可靠性的应用程序,我不知道哪种方法最好采取,为什么,这是一个我的代码片段,我需要注入Lang类依赖项

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

在此链接http://laravel.com/docs/4.2/ioc根据我对该链接的理解,建议采用Basic UsageAutomatic Resolution两种方法 采取我需要添加的第一种方法

 App::bind('lang', function($app)
{
    return new \Lang();
 });    

到应用程序的寄存器部分,然后在函数I中有一些东西 像这样:

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

另一种方法是修改constructor之类的

  public function __construct(Lang $lang)
  {         
      $this->lang = $lang;
  }

然后从类中实例化对象,如

  $myController = App::make('MyController');

考虑到这个classController并且会在routes文件中调用,或者如果我的理解来自这个链接不对。还请告诉我为什么你建议采用这些方法。

1 个答案:

答案 0 :(得分:7)

应该注意的是,使用本地IoC分辨率($app->make()样式)并不比直接使用外墙(Lang::get()样式)好多了 - 你仍然非常依赖Laravel的特定类而没有真正使您的代码明确声明它需要这些确切的类。因此,如果您希望代码尽可能便携,那么一般建议是尽可能地为代码添加代码。

当然,目前在PHP开发方面有一些很大的缺点:

  1. 通常不会定义这些接口(PSR-3 LoggerInterface接口除外),因此您仍然需要依赖接口的特定实例(在本例中为Laravel的接口)。
  2. 如果您决定创建自己的通用接口(或者FIG最终会创建其中的一些),那么Laravel为翻译提供的类(例如)无论如何都不会实现它,因此您需要对现有的类进行子类化只是为了让它看起来像是实现了你自己的界面。但是,嘿,这是目前的最佳实践,所以我想如果你想使用当前的最佳实践,代码到接口,并且暂时不担心你编写的接口是Laravel特定的。< / LI>

    但无论如何,这是我对你的具体问题的看法。首先,我应该说我还没有实际使用过Laravel 5(只是4s),但我一直都在关注它的发展。

    如果我编写的类将使用给定的依赖项,或者作为类如何工作的核心部分,我将使用构造函数依赖注入。这里的示例是控制器中的Request或一些Repository类,或控制台命令类中的业务逻辑类。

    如果我需要我只需要一个特定的目的(可能从控制器重定向并需要生成URI)我将从IoC容器($this->app->make())解析本地版本,然后使用它。如果我使用Laravel 5并且该方法被Laravel直接调用(例如控制器的动作方法),我可能使用方法注入,我不是百分百肯定。

    作为最后一点,一般的建议是,如果构造函数方法签名由于很多依赖性而变得太大:

    1. 现在是时候看一下你的代码是否过分依赖外部依赖。也许你的类的一些功能可以被提取到它自己的类中,它将两者之间的依赖关系分开。
    2. 您应该考虑使用setter方法而不是构造函数注入 - 所以不是接受Request对象,而是使用$class->setRequest()方法。这样做的缺点是你需要告诉Laravel的IoC容器如何实例化你的对象(即必须调用这些setter)。这不是什么大不了的事情,而是值得注意的事情。
    3. 相关链接: