如何在Symfony 2中管理大型初始应用程序数据

时间:2013-07-17 13:37:12

标签: php symfony doctrine-orm fixtures

我正在开发一个需要大量初始数据的Symfony 2应用程序。容易上千行。有哪些管理此数据集的好方法?

我一直在尝试使用Docrine Migrations,但这有点痛苦。数据加载一次,您无法重新加载。如果数据中存在错误,则需要进行另一次迁移以查找并更正它,等等。

我也一直在阅读Doctrine Fixtures。这看起来更像我需要的东西,但它要求我编写PHP代码,将我的所有数据创建为实体。有数千个条目,这将是一个巨大的痛苦。

有更好的选择吗?

1 个答案:

答案 0 :(得分:2)

如果数据存储在文件中,您可以使用Doctrine Data Fixtures从该文件导入数据。

您只需编写fixture类来解析数据文件,在新实体上设置数据,并持久保存实体。

例如,如果数据存储在Yaml文件中,则可以使用以下内容:

// src/Acme/DemoBundle/DataFixtures/ORM/LoadIntialData.php
namespace Acme\DemoBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\DemoBundle\Entity\MyEntity;
use Symfony\Component\Yaml\Yaml;

class LoadIntialData implements FixtureInterface {

    public function load(ObjectManager $manager)
    {
        $filename =
            __DIR__ .
            DIRECTORY_SEPARATOR . '..' .
            DIRECTORY_SEPARATOR . '..' .
            DIRECTORY_SEPARATOR . 'Resources/data/data.yml';

        $yml = Yaml::parse(file_get_contents($filename));
        foreach ($yml as $data) {
            $entity = new MyEntity();

            $entity->setFoo($data['foo']);
            $entity->setBar($data['bar']);

            $manager->persist($entity);
        }

        $manager->flush();
    }

}