在Plesk中,我想经常使用PHP 7.2运行一个PHP脚本。它必须作为PHP脚本而不是控制台命令(有关更多详细信息,请参见“我的环境”。 )。我目前基于Symfony 4.2的实现工作正常,但已标记为已弃用。
如here所述,ContainerAwareCommand
在Symfony 4.2中标记为deprecated
。不幸的是,引用的article中有关将来如何解决此问题的信息不包含有关此信息。
我的共享虚拟主机(Plesk)在PHP 7.0上运行,但允许脚本在PHP 7.2上运行。仅当它直接运行PHP脚本而不作为控制台命令运行 not 时,以后才有可能。我需要PHP 7.2。
我知道Symfony中的injection types。根据我目前的知识,只能通过使用getContainer
方法或手动提供所有服务(例如通过构造函数)来解决此问题,这会导致代码混乱。
<?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();
<?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');
// ...
}
}
答案 0 :(得分:4)
就我而言,复制ContainerAwareCommand类似乎是最好的方法,只要没有另外说明(感谢“ Cerad”)。这使我可以保留当前功能并摆脱不推荐使用的警告。对我来说,它也是临时解决方案(直到Hoster升级到PHP 7.2),因此对Symfony的未来重大升级没有影响。
尽管如此,我还是建议以下答案,并将在以后实施。
根据symfony网站Deprecated 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();
// ...
}
}