我目前正在尝试通过在终端中执行命令来执行CRON作业。但它会引发以下错误。
PHP Fatal error: Call to a member function has() on a non-object in /MyProject/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 161
这是我在Command文件中的代码。
namespace MyProject\UtilityBundle\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class projectOngoingCommand extends Command
{
protected function configure()
{
$this
->setName('projectOngoingEstimation:submit')
->setDescription('Submit Ongoing Project Estimation')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
;
$projectController= new \MyProject\ProjectBundle\Controller\DefaultController();
$msg = $projectController->updateMonthlyOngoingAllocation();
$output->writeln($msg);
}
}
这是我在默认控制器中的代码。
// cron job code
public function updateMonthlyOngoingAllocation() {
$em = $this->getDoctrine()->getEntityManager();
$project = $this->getDoctrine()->getRepository('MyProjectEntityBundle:Project')
->getAllOngoingProjectList();
return "hello";
}
使用命令
成功调用此方法 sudo php app/console projectOngoingEstimation:submit
但它会在第一行引发错误。即。
$em = $this->getDoctrine()->getEntityManager();
当我尝试从控制器中的另一个Action方法调用该函数时,它工作正常。
答案 0 :(得分:2)
我不认为你在这里使用正确的策略。您尝试在命令中调用Controller,并根据您所拥有的错误消息,这似乎不是一个好主意。
您应该创建一个服务并在Controller和Command中调用此服务。
class ProjectManager
{
private $em;
public function __construct(EntityManager $em) {
$this->em = $em;
}
public function updateMonthlyOngoingAllocation() {
$project = $this->em->getRepository('MyProjectEntityBundle:Project')
->getAllOngoingProjectList();
return "hello";
}
}
然后在config.yml
中services:
project_manager:
class: MyBundle\Manager\ProjectManager
arguments: ["@doctrine.orm.entity_manager"]
现在您可以拨打此服务:
$this->get('project_manager')->updateMonthlyOngoingAllocation()
ContainerAwareCommand
Command
而不是$this->getContainer()->get('project_manager')->updateMonthlyOngoingAllocation()
)
答案 1 :(得分:0)
你刚刚做了以下事情。无需注入任何东西,因为控制台可以识别容器。
public function updateMonthlyOngoingAllocation() {
$project = $this->getContainer()
->get('doctrine')
->getRepository('MyProjectEntityBundle:Project')
->getAllOngoingProjectList();
return "hello";
}