Внедрение зависимостей Symfony для классов ввода и вывода - PullRequest
0 голосов
/ 23 ноября 2018

Для проекта, над которым я работаю, использующего Symfony, для которого я довольно новичок, я пытаюсь создать объект класса, который использует Dependency Injection, но также нуждается в некоторых пользовательских параметрах.

Допустим, у меня есть команда:

<?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 и $ouput в классе Command в конструктор класса Server.

И еще большесложно, я также хочу, чтобы переменные $input и $output были доступны в классе MessageManager.

Возможно ли это, и если да, то как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

РЕДАКТИРОВАТЬ: SymfonyStyle фактически использует только Input, но не позволяет получить к нему доступ.Для чего вам нужно Input?Вы должны использовать только переменные, которые он предоставляет за пределами Command.


Итак, в основном вам нужны Input и Output в качестве службы ?

Класс, объединяющий их, называется SymfonyStyle, и он был представлен в Symfony 2.8 с хорошим постом в блоге .

Существует множество способов получить ввод / вывод в 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
    }
}
0 голосов
/ 23 ноября 2018

Данные в конкретном экземпляре InputInterface создаются только при выполнении команды, то же самое для Output.Следовательно, это будут параметры, которые передаются в функцию из метода execute() или другого метода, который в конечном итоге вызывается.Точно так же они являются параметрами, которые могут быть переданы методу Server класса (и, вероятно, оттуда, методу MessageManager).

Они содержат данные, но не являются службой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...