这是一个相当开放的问题,我寻找的意见比什么都重要......
来自Laravel,依赖注入(DI)是幸福的,如果你想从一个类访问一个方法,你可以通过方法或构造函数中的类型提示注入它,你可以立即访问它;从表面来看,symfony2看起来并不简单。
我们通过设置服务yml来预先定义你的参数,从而获得服务容器,setter注入,构造函数注入,但这只是 dirty 。
所以" Laravel Way"依赖注入就像这样完成
class Listener
{
protected $mailer;
public function __construct(Mailer $mailer)
{
$this->mailer = $mailer;
}
public function userWasAdded(User $user)
{
// Do some stuff...
$this->mailer->send('emails.welcome', ['user' => $user], function($message)
{
$message->to($user->email, $user->name)->subject('Welcome!');
});
}
}
我怎么能在Symfony2中复制Laravel的依赖注入形式,这似乎是一种更清洁的做事方式,或者也许有一种Symfony2做事的方式我还没有发现。任何帮助表示赞赏。
答案 0 :(得分:1)
我对Laravel
不熟悉,但在阅读doc后,我认为Laravel
和Symfony
中的DI 非常相似
来自doc:
如果类不依赖于任何接口,则无需将类绑定到容器中。不需要指示容器如何构建这些对象,因为它可以使用反射自动解析这些对象。
在这种情况下,Symfony
具有类似的功能,从2.8版开始,auto wiring
在其他情况下(意味着该类具有构造函数依赖性),您需要指示您的框架如何解决这些依赖关系。唯一不同的是,你必须以不同的方式做到这一点。
在Symfony
中,最常见的方式就是使用yml
文件:
services:
mailer:
class: Mailer
arguments: ['%mailer.transport%']
但您也可以在xml
或php
中执行此操作(请查看doc)
$container->setParameter('mailer.transport', 'sendmail');
$container
->register('mailer', 'Mailer')
->addArgument('%mailer.transport%');
但在Laravel
中它是相同的:你需要指导框架如何实例化对象
$this->app->bind('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
选择设置容器(yml,xml,php)的选项只是一个品味问题。