热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Laravel5软件包中依赖注入的最佳方法》经验,为你挑选了1个好方法。

我正在为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建议2方法,Basic UsageAutomatic Resolution根据我的链接采取第一种方法我需要添加的理解

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

到应用程序的寄存器部分然后在函数中我会有这样的事情:

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

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



1> alexrussell..:

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

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

    通常不定义这些接口(PSR-3 LoggerInterface接口除外),因此您仍然必须依赖接口的特定实例(在本例中为Laravel).

    如果您决定创建自己的通用接口(或者FIG最终会创建其中的一些),那么Laravel为翻译提供的类(例如)无论如何都不会实现它,因此您需要将现有的类子类化为仅看起来它实现了你自己的界面.但是,嘿,这是目前的最佳实践,所以我想如果你想使用当前的最佳实践,代码到接口,并且暂时不担心你编写的接口是特定于Laravel的.

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

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

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

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

    现在是时候看看你的代码是否过分依赖外部依赖.也许你的类的一些功能可以被提取到它自己的类,它分裂两者之间的依赖关系.

    您应该考虑使用setter方法而不是构造函数注入 - 所以不是接受Request对象,而是使用$class->setRequest()方法.这样做的缺点是你需要告诉Laravel的IoC容器如何实例化你的对象(即必须调用这些setter).这不是什么大不了的事情,而是值得注意的事情.

相关链接:

Laravel 5的IoC文章

Laravel 5的控制器注射建议


推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 标题: ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
author-avatar
Devil灬旋律
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有