如何将服务注入Symfony2/Doctrine2 Data Fixtures?我想创建虚拟用户并需要security.encoder_factory
服务来编码我的密码。
我尝试将我的数据夹具定义为服务
myapp.loadDataFixture:
class: myapp\SomeBundle\DataFixtures\ORM\LoadDataFixtures
arguments:
- '@security.encoder_factory'
然后在我的数据夹具
中class LoadDataFixtures implements FixtureInterface {
protected $passwordEncoder;
public function __construct($encoderFactory) {
$this->passwordEncoder = $encoderFactory->getEncoder(new User());
}
public function load($em) {
但是有点像
警告:缺少参数1 ... \ DataFixtures \ ORM \ LoadDataFixtures :: __ construct(),在...中调用
答案 0 :(得分:38)
Using the Container in the Fixtures部分准确描述了您的需求。
您需要做的就是在灯具中实现ContainerAwareInterface
。这将导致Symfony通过Setter-Injection注入容器。示例实体如下所示:
class LoadDataFixtures implements FixtureInterface, ContainerAwareInterface {
/**
* @var ContainerInterface
*/
private $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
public function load($em) {
您不需要将灯具注册为服务。确保通过use
导入已使用的类。
答案 1 :(得分:0)
对于DoctrineFixturesBundle v。3,您无需注入容器即可注入简单的服务。您可以改用普通的依赖注入:
// src/DataFixtures/AppFixtures.php
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
// ...
private $encoder;
public function __construct(UserPasswordEncoderInterface $encoder)
{
$this->encoder = $encoder;
}
但是,如果确实需要该容器,则可以通过$ this-> container属性访问它。
文档here。