gpt4 book ai didi

交响乐 4.2+ : Replacement for ContainerAwareCommand's getContainer->get()

转载 作者:行者123 更新时间:2023-12-05 09:13:35 25 4
gpt4 key购买 nike

我的目标

在 Plesk 中,我想使用 PHP 7.2 频繁运行 PHP 脚本。它必须是 PHP 脚本而不是控制台命令(有关详细信息,请参阅“我的环境”)。我当前基于 Symfony 4.2 的实现工作正常,但它被标记为已弃用

如前所述here , ContainerAwareCommand 在 Symfony 4.2 中被标记为 deprecated。不幸的是,引用的 article关于将来如何解决此问题的信息不包含有关它的信息。

我的环境

我的共享虚拟主机 (Plesk) 使用 PHP 7.0 运行,但允许脚本使用 PHP 7.2 运行。只有当它直接运行 PHP 脚本并且作为控制台命令时才有可能稍后。我需要 PHP 7.2。

我知道 injection types在 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');

// ...
}
}

最佳答案

现在回答

就我而言,复制 ContainerAwareCommand 类似乎是最好的方法,只要没有另外说明(感谢“Cerad”)。这使我能够保留当前功能并摆脱不推荐使用的警告。对我来说,它也是临时解决方案(直到 Hoster 升级到 PHP 7.2),因此对 Symfony future 的主要升级没有影响。

尽管如此,我还是推荐下面的答案,并将在未来实现。


推荐答案

根据 symfony 网站上的这篇博文 Deprecated ContainerAwareCommand

The alternative is to extend commands from the Command class and use proper service injection in the command constructor

所以正确的做法是:

<?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();

// ...
}
}

关于交响乐 4.2+ : Replacement for ContainerAwareCommand's getContainer->get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55953286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com