如何在控制器中的命令文件中获取Symfony对象

时间:2016-10-01 11:24:28

标签: php symfony oop

在我的应用程序中,我想执行一些维护任务。

因此我使用cronjob运行整体维护功能。

protected function execute(InputInterface $input, OutputInterface $output)
{
   Maintenance::checkDowngradeAccounts();
}

在一个单独的命令文件中,我运行所有不同的功能。请参阅此处完整的命令文件:

namespace Mtr\MyBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

class Maintenance extends ContainerAwareCommand
{
    public function checkDowngradeAccounts() {
        // get downgrade accounts
        $downgrade = $this->getDoctrine()
            ->getRepository('MyBundle:Account')
            ->findAllWithDowngrade();

    }
}

在普通控制器的此文件链接中只知道Symfony $此对象。如何包含或获取此容器对象?

1 个答案:

答案 0 :(得分:1)

$这不适用于静态上下文,与类依赖项(通过构造函数传递)相同。你应该将调用链重构为维护实例而不是静态调用

它是裸PHP,没有涉及symfony

<强> UPD。

您的示例仍然显示您静态调用此函数。你应该使用object的实例来调用它,即$maintenance->checkDowngradeAccounts()

要创建适当的维护变量,您应手动将其实例化,或通过DI将其作为依赖项传递。

我在这里看到的最简单方法就是

class Maintenance
{
    private $doctrine;

    public function __construct(EntityManagerInterface $doctrine)
    {
        $this->doctrine = $doctrine;
    }

    public function checkDowngradeAccounts() {
        // get downgrade accounts
        $downgrade = $this->doctrine
            ->getRepository('MyBundle:Account')
            ->findAllWithDowngrade();
    }
}

命令代码(ContainerAwareCommand已经可以访问容器,因此我们可以使用它配置Maintenance实例。

protected function execute(InputInterface $input, OutputInterface $output)
{
   $maintenance = new Maintenance($this->getContainer()->get('doctrine.orm.entity_manager');
   $maintenance->checkDowngradeAccounts();
}

要使这一点完美,您可以Maintenance成为一项服务。进一步阅读 http://symfony.com/doc/current/service_container.html