Symfony 4.2+: замена для getContainer-> get () для ContainerAwareCommand - PullRequest
0 голосов
/ 02 мая 2019

Моя цель

В Plesk я хочу часто запускать PHP-скрипт с использованием PHP 7.2. Это должен быть PHP-скрипт, а не консольная команда ( для получения более подробной информации см. «Моя среда» ). Моя текущая реализация на базе Symfony 4.2 работает нормально, но помечена как устарела .

Как указано здесь , ContainerAwareCommand помечен deprecated в Symfony 4.2. К сожалению, ссылка на статью о том, как решить эту проблему в будущем, не содержит информации о ней.

Мое окружение

Мой общий веб-хостинг (Plesk) работает с PHP 7.0, но позволяет запускать сценарии с PHP 7.2. Позже это возможно, только если он напрямую запускает скрипт PHP и не как консольную команду. Мне требуется PHP 7.2.

Я знаю типы инъекций в Symfony. Исходя из моих текущих знаний, эту проблему можно решить только с помощью подхода getContainer или предоставлением всех служб вручную, например, через конструктор, что приведет к путанице в коде.

Текущее решение

Файл: cron1.php

<?php

// namespaces, Dotenv and gathering $env and $debug
// ... 

$kernel = new Kernel($env, $debug);

$app = new Application($kernel);
$app->add(new FillCronjobQueueCommand());
$app->setDefaultCommand('fill_cronjob_queue');
$app->run();

Файл: FillCronjobQueueCommand.php

<?php 

// ...

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class FillCronjobQueueCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this->setName('fill_cronjob_queue');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // using "$this->getContainer()" is deprecated since Symfony 4.2 
        $manager = $this->getContainer()->get('doctrine')->getManager();

        $cron_queue_repo = $manager->getRepository(CronjobQueue::class);

        $cronjobs = $manager->getRepository(Cronjob::class)->findAll();

        $logger = $this->getContainer()->get('logger');

        // ...
    }
}

1 Ответ

4 голосов
/ 02 мая 2019

Ответ на данный момент

В моем случае кажется, что копирование класса ContainerAwareCommand - лучший способ, если не указано иное (спасибо "Cerad").Это позволяет мне сохранить текущую функциональность и избавиться от устаревших предупреждений.Для меня это также временное решение (до тех пор, пока Hoster не обновится до PHP 7.2), и, следовательно, оно не повлияет на будущие крупные обновления Symfony.

Тем не менее, я рекомендую ответ ниже и буду внедрять его в будущем.


Рекомендуемый ответ

Согласно этому сообщению в блоге на веб-сайте Symfony Устаревшая ContainerAwareCommand

Альтернативой является расширение команд из класса Command.и используйте правильное внедрение службы в конструкторе команд

Итак, правильный путь:

<?php 

// ...

use Symfony\Component\Console\Command\Command
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Doctrine\ORM\EntityManagerInterface;
use PSR\Log\LoggerInterface;

class FillCronjobQueueCommand extends Command
{
    public function __construct(EntityManagerInterface $manager, LoggerInterface $logger)
    {
        $this->manager = $manager;
        $this->logger = $logger;
    }

    protected function configure()
    {
        $this->setName('fill_cronjob_queue');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $cron_queue_repo = $this->manager->getRepository(CronjobQueue::class);

        $cronjobs = $this->manager->getRepository(Cronjob::class)->findAll();

        // ...
    }
}
...