laravel - Laravel 5 包中依赖注入(inject)的最佳方法

标签 laravel dependency-injection laravel-5

我正在为 Laravel 5 开发一个包,现在我需要受益于依赖注入(inject)来拥有一个更具可扩展性和可靠性的应用程序,我不知道哪种方法是最好的以及为什么,这是一个我的代码和我需要注入(inject) 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根据我对链接的理解,建议使用 2 种方法:基本用法自动解析 采用我需要添加的第一种方法

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

到应用程序的注册部分,然后在函数中我会得到一些东西 像这样:

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

另一种方法是修改构造函数,例如

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

然后从类实例化对象

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

考虑到这个class是一个Controller并且它将在routes文件中调用,哪种方式是更好的方式,或者如果我对链接的理解不正确,请纠正我。另请告诉我为什么您建议使用这些方法。

最佳答案

需要注意的是,使用本地 IoC 解析($app->make() stylee)并不比直接使用外观(Lang::get() stylee)好多少 - 你仍然非常依赖 Laravel 的特定类,而没有真正编写代码明确指出它需要这些确切的类。因此,如果您希望代码尽可能可移植,一般建议是尽可能多地编写接口(interface)代码。

当然,目前 PHP 开发中存在一些很大的缺点:

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

但无论如何,这是我对你的具体问题的看法。首先我应该说,我还没有真正使用过 Laravel 5(只是 4s),但我通常关注它的开发。

如果我正在编码的类将大量使用给定的依赖项,或者作为该类工作方式的核心部分,我将使用构造函数依赖项注入(inject)。这里的示例是 Controller 中的 Request 或某些 Repository 类,或者控制台命令类中的业务逻辑类。

如果我只需要用于特定目的(可能从 Controller 重定向并需要生成 URI),我将从 IoC 容器 ( $this->app->make() ) 解析本地版本,然后使用它。如果我使用 Laravel 5 并且该方法由 Laravel 直接调用(例如 Controller 的操作方法),我可能会为此使用方法注入(inject),但我不能 100% 确定。

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

  1. 是时候检查一下您的代码是否过度依赖外部依赖项了。也许您的类的某些功能可以提取到它自己的类中,从而分割两者之间的依赖关系。
  2. 您应该考虑使用 setter 方法而不是构造函数注入(inject) - 因此您不会接受 Request 对象,而是拥有 $class->setRequest()方法。这样做的缺点是你需要告诉 Laravel 的 IoC 容器如何实例化你的对象(即必须调用这些 setter)。这没什么大不了的,但值得注意。

相关链接:

关于laravel - Laravel 5 包中依赖注入(inject)的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28834398/

相关文章:

laravel - laravel 中的 show 方法返回 index 方法

Laravel 从请求实例获取路由参数

php - Laravel : Check with Observer if Column was Changed on Update

php - 如何在 Laravel 5 中返回自定义查询结果

php - Laravel Eloquent 过滤关系按最后一个数据透视记录

Laravel 5.4 迁移

gwt - 在 GWT 事件中使用 GIN

ios - 如何修改依赖注入(inject)模式中的对象

Spring 3 DI 使用通用 DAO 接口(interface)

php - Laravel 5 - 找不到 Application::shutdown() 函数,是否有其他解决方案?