gpt4 book ai didi

php - Symfony 控制台 ContainerAwareCommand $this->getContainer() 产生 fatal error

转载 作者:行者123 更新时间:2023-12-04 15:52:53 27 4
gpt4 key购买 nike

长话短说

我正在创建控制台垃圾收集器,它应该能够从容器中获取服务。这是基本的,几乎直接来自手册:

<?php
namespace SomeBundle\Console\Command;

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

class GarbageCollector extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('garbage:collect')
->setDescription('Collect garbage')
->addArgument(
'task',
InputArgument::REQUIRED,
'What task to execute?'
)
;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$task = $input->getArgument('task');

//...

$_container = $this->getContainer();
}
}

然后我尝试通过 application.php 从控制台调用它:

#!/usr/bin/env php
<?php
// application.php

require_once __DIR__.'/../vendor/autoload.php';

use SomeBundle\Console\Command\GarbageCollector;
use Symfony\Bundle\FrameworkBundle\Console\Application;

$application = new Application();
$application->add(new GarbageCollector);
$application->run();

这会产生 fatal error :

Argument 1 passed to Symfony\Bundle\FrameworkBundle\Console\Application::__construct() must implement interface Symfony\Component\HttpKernel\Kernel Interface, none given

手册说我唯一需要做的就是用 ContainerAwareCommand 扩展我的类,但缺少一些东西。我写了一些垃圾代码来将 Kernel 传递给 Application():

#!/usr/bin/env php
<?php
// application.php

require_once __DIR__.'/../vendor/autoload.php';
require_once __DIR__.'/AppKernel.php';

use SomeBundle\Console\Command\GarbageCollector;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Input\ArgvInput;

$input = new ArgvInput();
$env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev');
$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod';

$kernel = new AppKernel($env, $debug);
$application = new Application($kernel);
$application->add(new GarbageCollector);
$application->run();

它有效,但感觉很恶心。

要使控制台应用程序的 ContainerAwareCommand 实现,我需要什么?提前致谢。

最佳答案

Symfony2 通过其控制台运行器提供调用自定义命令的能力,它将处理服务容器的注入(inject)。您需要做的就是在已注册的包中创建您的命令,它会自动对您可用。您正在框架之外初始化您的命令,这就是为什么容器对您不可用,除非您手动注入(inject)它。

你可以在这里引用食谱:

http://symfony.com/doc/current/cookbook/console/console_command.html

您可以通过运行获取所有可用命令的列表:

php app/console 

附带说明一下,您为什么要在 PHP 中/为 PHP 创建垃圾收集器?只是好奇,因为据我了解,脚本执行结束后内存会为您释放。

关于php - Symfony 控制台 ContainerAwareCommand $this->getContainer() 产生 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27047519/

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