gpt4 book ai didi

模型/ Controller 之外的 Symfony2 getdoctrine

转载 作者:行者123 更新时间:2023-12-04 23:02:26 25 4
gpt4 key购买 nike

我正在尝试在 Controller 之外使用 getDoctrine()。
我创建了这个服务:

配置/服务.yml

services:
update_command:
class: project\projBundle\Command\Update
arguments: ['@doctrine.orm.entity_manager']

并在我的 app/config/config.yml
imports:
- { resource: "@projectprojBundle/Resources/config/services.yml" }

所以和我想使用的类:
namespace project\projBundle\Command;
use Doctrine\ORM\EntityManager;

class Update {
protected $em;
public function __construct(EntityManager $em) {
$this->em = $em;
}

但每次我想这样做时:( 我这样做对吗? )
$up = new Update();

我收到这个错误:
Catchable Fatal Error: Argument 1 passed to ...\Update::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in .../Update.php line 7  

最佳答案

简单的解决方案

如果您正在实现 Symfony 命令(可以在 cron 选项卡中执行),您可以从该命令访问服务容器。

<?php
namespace MyProject\MyBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Doctrine\ORM\EntityManager;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class UpdateCommand extends ContainerAwareCommand
{
protected $em;

protected function configure()
{
$this->setName('myproject:mybundle:update') ;
}

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

这样,您就可以从命令中获取实体管理器,而无需将此类声明为服务。因此,您可以删除您在 services.yml 中添加的配置。文件。

另一种解决方案(清洁剂)

该解决方案允许更好地分离关注点,因此可以轻松地进行单元测试并在 Symfony 应用程序的其他部分(不仅作为命令)重用。

将“更新”命令的所有逻辑部分移动到您将声明为服务的专用类:
<?php
namespace MyProject\MyBundle\Service;

use Doctrine\ORM\EntityManager;

class MyUpdater
{
protected $em;

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

public function runUpdate()
{
// All your logic code here
}
}

在您的 services.yml 中将其声明为服务文件:
services:
myproject.mybundle.myupdater:
class: MyProject\MyBundle\Service\MyUpdater
arguments: ['@doctrine.orm.entity_manager']

只需从您的命令中调用您的服务:
<?php
namespace MyProject\MyBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class UpdateCommand extends ContainerAwareCommand
{
protected function configure()
{
$this->setName('myproject:mybundle:update') ;
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$myUpdater = $this->getContainer()->get('myproject.mybundle.myupdater');
$myUpdater->runUpdate();
}
}

关于模型/ Controller 之外的 Symfony2 getdoctrine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19855251/

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