我正在为 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 开发中存在一些很大的缺点:
- 这些接口(interface)通常没有定义(PSR-3
LoggerInterface
接口(interface)除外),因此您仍然必须依赖接口(interface)的特定实例(在本例中为 Laravel 的)。 - 如果您决定创建自己的通用接口(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% 确定。
最后一点,一般建议是,如果您的构造函数方法签名由于大量依赖而变得太大:
- 是时候检查一下您的代码是否过度依赖外部依赖项了。也许您的类的某些功能可以提取到它自己的类中,从而分割两者之间的依赖关系。
- 您应该考虑使用 setter 方法而不是构造函数注入(inject) - 因此您不会接受 Request 对象,而是拥有
$class->setRequest()
方法。这样做的缺点是你需要告诉 Laravel 的 IoC 容器如何实例化你的对象(即必须调用这些 setter)。这没什么大不了的,但值得注意。
相关链接:
- Laravel 5 IoC article
- Laravel 5 Controller injection advice
关于laravel - Laravel 5 包中依赖注入(inject)的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28834398/