我正在使用symfony 2命令类构建批处理文件。我有一个函数,它处理来自bundle中控制器的DB
class SubmitDisclosureController extends FOSRestController implements MEAuthController
{
...
public function discDetails($discId) {
$emr = $this->getDoctrine()->getEntityManager();
我是通过命令src/AppBundle/Command/BatchJobCommand.php
来调用它,如下所示
class BatchJobCommand extends Command
{
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln([
'User Creator',
'============',
'',
]);
// retrieve the argument value using getArgument()
$output->writeln('First batch job')
$disc = new SubmitDisclosureController();
$disc->discDetails('42094');
`
如果我尝试执行它,它会给出PHP Fatal error: Call to a member function has() on null in C:\xampp\htdocs\GR\
vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.
php on line 288
是不是可以通过从命令类调用控制器的函数来重用代码?
答案 0 :(得分:3)
$disc = new SubmitDisclosureController();
$disc->setContainer($this->getContainer());
$disc->discDetails('42094');
会让您通过错误消息。但是,正如@MateiMihai所说,更好的设计是将光盘功能转移到它自己的服务中,然后在你的控制器,命令和测试类之间共享。 http://symfony.com/doc/current/service_container.html `
答案 1 :(得分:1)
什么说Matei正是您所需要的:创建服务并在每个班级上使用它:
class DisclosureService { ... public function discDetails($discId) {...} }
在services.yml配置文件中,您必须添加它。
disclosure:
class: Your\Namespace\DisclosureService
arguments: ["@doctrine", ...]
在你的命令和&控制器,您可以通过以下方式调用服务:
$this->get('disclosure')->discDetails('')
详细信息可在官方文档中找到:http://symfony.com/doc/current/service_container.html