输入和输出类的Symfony依赖注入

时间:2018-11-22 21:59:31

标签: symfony

对于我正在使用一个非常新的Symfony进行的项目,我正在尝试创建一个使用依赖注入但还需要一些自定义参数的类的对象。

现在让我说一个命令:

<?php

class ServerCommand extends Command {
    public function __construct(Server $server) {
        $this->server = $server;
    }

    protected function execute(InputInterface $input, OutputInterface $output) {
        ...
    }
}

和服务器类:

<?php
class Server {
    public function __construct(MessageManager $messageManager, InputInterface $input, OutputInterface $output) {
        ...
    }
}

现在,将Server类注入到Command类中,并且将MessageManager类注入到Server类中。

我遇到的问题是将$input类中的$ouputCommand变量放入Server类的构造函数中。

要使其更加困难,我还希望在$input类中访问$outputMessageManager变量。

这有可能吗?如果可以,我该如何实现呢?

2 个答案:

答案 0 :(得分:2)

编辑:SymfonyStyle实际上仅使用Input,但不允许访问它。您到底需要Input做什么?您只应使用Command外部提供的变量。


因此,您基本上需要 InputOutput作为服务吗?

将它们组合在一起的类称为SymfonyStyle,它是在Symfony 2.8中与nice blog post一起引入的。

有很多方法可以将输入/输出输出到SymfonyStyle,但是我将向您展示最简单的方法。我在Symplify包和Rector包中使用了3年以上,它非常可靠。

<?php declare(strict_types=1);

namespace App\Console;

use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Style\SymfonyStyle;

final class SymfonyStyleFactory
{
    public function create(): SymfonyStyle
    {
        $input = new ArgvInput();
        $output = new ConsoleOutput();

        return new SymfonyStyle($input, $output);
    }
}

然后将该工厂注册为服务:

# app/config/services.yaml
services:
    App\Console\SymfonyStyleFactory: ~

    Symfony\Component\Console\Style\SymfonyStyle:
        factory: ['@App\Console\SymfonyStyleFactory', 'create']

然后只需在您需要使用的任何服务中使用SymfonyStyle,就可以使用它:

<?php declare(strict_types=1); 

class MessageManager
{
    /**
     * @var SymfonyStyle
     */
    private $symfonyStyle;

    public function __construct(SymfonyStyle $symfonyStyle)
    {
        $this->symfonStyle = $symfonyStyle;
    }

    public function run()
    {
        // some code
        $this->symfonyStyle->writeln('It works!');
        // some code
    }
}

答案 1 :(得分:0)

仅在运行命令时才创建InputInterface具体实例中的数据,对于Output则相同。因此,这些将是从execute()方法或最终调用的另一个方法传递到函数中的参数。同样,它们是可以提供给Server类方法的参数(并且可能从那里提供给MessageManager方法的参数)。

它们保存数据,但它们不是服务。