Почему плохо делать $ output свойством класса команд Symfony

Я напишу несколько команд, чтобы проверить, все ли в порядке с моим приложением.

Поскольку эти команды будут выполняться cronjob, я хотел бы отформатировать вывод для использования в файле журнала.

Чтобы отображать сообщения об ошибках из любой точки команды (без передачи $ output при каждом вызове метода), я делаю это свойство класса, и это очень удобно, но это кажется плохим, я знаю, что это плохо, но я не знаю почему. Вот пример:

<?php
namespace CheckingBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

/**
* Class CheckingCommand
*
*/
class CheckingCommand extends Command
{
/**
* @var OutputInterface $output
*/
private $output;

protected function configure()
{
$this->setName('check:all');
}

protected function initialize(InputInterface $input, OutputInterface $output)
{
$this->output = $output;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$this->checkSqlConnection();
}

protected function checkSqlConnection()
{
$myConnexion = null; //Try to connect to database
if (null === $myConnexion) {
$this->sendError('Cannot connect to MySQL database');
}
}

/**
* @param string $errorMessage
*/
protected function sendError($errorMessage)
{
$this->output->write(sprintf('%s <error>%s</error>', date('Y-m-d H:i:s'), $errorMessage));
}
}

Может кто-нибудь объяснить мне, почему это плохо (если это так)? Не было бы лучше передать это везде как:

 $this->checkSqlConnection($output);

а также

 protected function checkSqlConnection(Output $output)
{
$myConnexion = null; //Try to connect to database
if (null === $myConnexion) {
$output->write('Cannot connect to MySQL database');
}
}

Должен ли я использовать исключения в моей команде с try / catch и использовать мой метод sendError в catch? Это может быть хорошим способом обработки ошибок, но что, если я хочу отображать информацию других пользователей внутри метода?

2

Решение

Есть две вещи, которые я хотел бы отметить,
1) checkSqlConnection не должно быть в классе команд, оно должно быть в отдельном классе (возможно, сервисе), и вам нужно представить этот класс как сервис и использовать его из класса команд, ваша бизнес-логика не должна быть в классе команд

2) как вы упомянули, это плохой код для передачи $input а также $output случаи, это не хорошо, потому что ваш класс обслуживания будет тесно связан с классами ввода / вывода

Решение ? используйте Monolog вместо outputInterface,
Начиная с Symfony 2.4, компонент консоли интегрирован с Monolog и имеет обработчик консоли, который прослушивает события консоли и записывает сообщения журнала в вывод консоли в зависимости от уровня журнала и многословия консоли.

Прочитайте больше

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector