Я напишу несколько команд, чтобы проверить, все ли в порядке с моим приложением.
Поскольку эти команды будут выполняться 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? Это может быть хорошим способом обработки ошибок, но что, если я хочу отображать информацию других пользователей внутри метода?
Есть две вещи, которые я хотел бы отметить,
1) checkSqlConnection
не должно быть в классе команд, оно должно быть в отдельном классе (возможно, сервисе), и вам нужно представить этот класс как сервис и использовать его из класса команд, ваша бизнес-логика не должна быть в классе команд
2) как вы упомянули, это плохой код для передачи $input
а также $output
случаи, это не хорошо, потому что ваш класс обслуживания будет тесно связан с классами ввода / вывода
Решение ? используйте Monolog вместо outputInterface
,
Начиная с Symfony 2.4, компонент консоли интегрирован с Monolog и имеет обработчик консоли, который прослушивает события консоли и записывает сообщения журнала в вывод консоли в зависимости от уровня журнала и многословия консоли.
Других решений пока нет …