2012-08-05 3 views
19

Với Smyfony2 và Doctrin2, đồ đạc dữ liệu có thể được tạo ra bằng cách sử dụng ví dụ sau: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.htmlMôi trường đồ đạc dữ liệu cụ thể với Symfony + Học thuyết

Những gì tôi muốn là để có thể sử dụng khái niệm này để thử nghiệm để thiết lập/teardown có thể tạo môi trường dữ liệu thử nghiệm thuần túy để thử nghiệm chức năng. Làm thế nào tôi có thể đi về việc có một tập hợp cụ thể của đồ đạc thử nghiệm chỉ chạy trong các bài kiểm tra chức năng và làm thế nào để tôi tách các đồ đạc từ đồ đạc tiêu chuẩn của tôi để lệnh giao diện điều khiển bỏ qua chúng?

Dường như cách để thực hiện việc này là sao chép chức năng của lệnh điều khiển học thuyết: đồ đạc và lưu trữ các đồ đạc thử nghiệm ở nơi khác. Có ai có một giải pháp tốt hơn?

Trả lời

35

Một giải pháp thay thế cho các đồ đạc bị vỡ theo thư mục là sử dụng lớp lịch thi đấu tùy chỉnh. lớp học cố định của bạn sau đó sẽ mở rộng lớp này và chỉ định các môi trường nó thực sự sẽ được nạp trong

<?php 

use Doctrine\Common\DataFixtures\FixtureInterface; 
use Doctrine\Common\Persistence\ObjectManager; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use Symfony\Component\HttpKernel\KernelInterface; 

/** 
* Provides support for environment specific fixtures. 
* 
* This container aware, abstract data fixture is used to only allow loading in 
* specific environments. The environments the data fixture will be loaded in is 
* determined by the list of environment names returned by `getEnvironments()`. 
* 
* > The fixture will still be shown as having been loaded by the Doctrine 
* > command, `doctrine:fixtures:load`, despite not having been actually 
* > loaded. 
* 
* @author Kevin Herrera <[email protected]> 
*/ 
abstract class AbstractDataFixture implements ContainerAwareInterface, FixtureInterface 
{ 
    /** 
    * The dependency injection container. 
    * 
    * @var ContainerInterface 
    */ 
    protected $container; 

    /** 
    * {@inheritDoc} 
    */ 
    public function load(ObjectManager $manager) 
    { 
     /** @var KernelInterface $kernel */ 
     $kernel = $this->container->get('kernel'); 

     if (in_array($kernel->getEnvironment(), $this->getEnvironments())) { 
      $this->doLoad($manager); 
     } 
    } 

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

    /** 
    * Performs the actual fixtures loading. 
    * 
    * @see \Doctrine\Common\DataFixtures\FixtureInterface::load() 
    * 
    * @param ObjectManager $manager The object manager. 
    */ 
    abstract protected function doLoad(ObjectManager $manager); 

    /** 
    * Returns the environments the fixtures may be loaded in. 
    * 
    * @return array The name of the environments. 
    */ 
    abstract protected function getEnvironments(); 
} 

đồ đạc của bạn sẽ kết thúc lên trông như thế này:.

<?php 

namespace Vendor\Bundle\ExampleBundle\DataFixtures\ORM; 

use AbstractDataFixture; 
use Doctrine\Common\Persistence\ObjectManager; 

/** 
* Loads data only on "prod". 
*/ 
class ExampleData extends AbstractDataFixture 
{ 
    /** 
    * @override 
    */ 
    protected function doLoad(ObjectManager $manager) 
    { 
     // ... snip ... 
    } 

    /** 
    * @override 
    */ 
    protected function getEnvironments() 
    { 
     return array('prod'); 
    } 
} 

Tôi tin rằng điều này sẽ làm việc với cả hai ORM một thiết bị dữ liệu ODM.

+5

đây là thiên tài! – ferdynator

+2

Làm cách nào để xác định môi trường từ bảng điều khiển? Sử dụng 'php app/console fixture: load --env = prod'? – xDaizu

+0

Trả lời tự: Yesh, 'php app/console fixture: load --env = prod' hoạt động với giải pháp được cung cấp :) – xDaizu

17

Cách dễ nhất là đặt đồ đạc của bạn vào các thư mục khác nhau và sau đó tải chúng bằng lệnh php app/console doctrine:fixtures:load --fixtures=../src/Acme/TestBundle/DataFixtures/ORM/test. Các tùy chọn đồ đạc phải trỏ đến đường dẫn tương đối từ nơi bạn thư mục ứng dụng!

Sau đó, bạn có thể chia dữ liệu của mình thành thử nghiệm ban đầu, thử nghiệm, v.v. hoặc tạo các thiết bị phát triển, thử nghiệm, dàn dựng, đồ họa, giống như bạn muốn.

Nếu bạn muốn kết hợp chúng, tôi không biết giải pháp nào tốt hơn những gì tôi đã làm: Tôi tạo một thư mục "mẫu" nơi tất cả các đồ đạc nằm trong. Trong thư mục dev của tôi, tôi tạo một lớp mở rộng lớp cố định thích hợp từ mẫu và điều chỉnh những gì cần thiết để điều chỉnh (như ghi đè phương pháp getOrder). Nó không hoàn hảo và tôi đoán người ta có thể nghĩ về việc mở rộng các đồ đạc: tải lệnh để có nhiều đường dẫn, nhưng nó làm việc cho tôi.

+0

Điều đó nghe có vẻ như là một khởi đầu tốt. Cảm ơn! –