在我的应用程序中,我想执行一些维护任务。
因此我使用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 $此对象。如何包含或获取此容器对象?
答案 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