2011-12-30 27 views
17

Tôi có thể tiêm dịch vụ vào Symfony2/Doctrine2 Data Fixtures như thế nào? Tôi muốn tạo người dùng giả và cần dịch vụ security.encoder_factory để mã hóa mật khẩu của tôi.Làm thế nào để tiêm dịch vụ vào Symfony 2 Data Fixtures?

Tôi đã cố gắng xác định Fixture dữ liệu của tôi như là một dịch vụ

myapp.loadDataFixture: 
    class: myapp\SomeBundle\DataFixtures\ORM\LoadDataFixtures 
    arguments: 
     - '@security.encoder_factory' 

Sau đó, trong dữ liệu của tôi Fixture

class LoadDataFixtures implements FixtureInterface { 

    protected $passwordEncoder; 

    public function __construct($encoderFactory) { 
     $this->passwordEncoder = $encoderFactory->getEncoder(new User()); 
    } 

    public function load($em) { 

Nhưng có cái gì đó như

Cảnh báo: Thiếu đối số 1 cho . .. \ DataFixtures \ ORM \ LoadDataFixtures :: __ construct(), được gọi là ...

Trả lời

37

Phần Using the Container in the Fixtures mô tả chính xác những gì bạn cần.

Tất cả những gì bạn cần làm là triển khai ContainerAwareInterface trong lịch thi đấu của mình. Điều này sẽ khiến Symfony tiêm container thông qua Setter-Injection. Một thực thể ví dụ sẽ trông như thế này:

class LoadDataFixtures implements FixtureInterface, ContainerAwareInterface { 

    /** 
    * @var ContainerInterface 
    */ 
    private $container; 

    public function setContainer(ContainerInterface $container = null) 
    { 
     $this->container = $container; 
    } 

    public function load($em) { 

Bạn không cần phải đăng ký các vật cố như một dịch vụ. Đảm bảo nhập các lớp đã sử dụng qua use.

+2

Điều này không giống như một sự thận trọng của SOLID đối với câu hỏi – murtho

Các vấn đề liên quan