Symfony2依赖注入"正确的方式"

时间:2016-11-02 08:47:00

标签: symfony dependency-injection

这是一个相当开放的问题,我寻找的意见比什么都重要......

来自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做事的方式我还没有发现。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我对Laravel不熟悉,但在阅读doc后,我认为LaravelSymfony中的DI 非常相似

来自doc:

  

如果类不依赖于任何接口,则无需将类绑定到容器中。不需要指示容器如何构建这些对象,因为它可以使用反射自动解析这些对象。

在这种情况下,Symfony具有类似的功能,从2.8版开始,auto wiring

在其他情况下(意味着该类具有构造函数依赖性),您需要指示您的框架如何解决这些依赖关系。唯一不同的是,你必须以不同的方式做到这一点。

Symfony中,最常见的方式就是使用yml文件:

services:
    mailer:
        class:     Mailer
        arguments: ['%mailer.transport%']

但您也可以在xmlphp中执行此操作(请查看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)的选项只是一个品味问题。