Symfony 3中为Doctrine Fixtures配置多独立文件方案
刚好我之前在团队开发中遇到过一模一样的需求,下面几个方案亲测好用,你可以根据自己的习惯选:
方案1:用环境变量动态加载专属Fixture
这个方案的核心是通过本地环境变量区分加载的Fixture,完全不影响仓库代码:
- 第一步:在
src/DataFixtures下新建Personal子目录,每个人在这里创建自己的专属Fixture类,比如你的RicardFixtures.php,同事的ColleagueFixtures.php。 - 第二步:修改主Fixture类(比如
AppFixtures.php),读取环境变量来动态加载对应类:use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; use Symfony\Component\Dotenv\Dotenv; class AppFixtures extends Fixture { public function load(ObjectManager $manager) { // 先加载公共的基础Fixture(如果有的话) // $this->loadPublicData($manager); // 读取本地环境变量 (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); $personalFixtureClass = $_ENV['PERSONAL_FIXTURE_CLASS']; // 加载专属Fixture if (class_exists($personalFixtureClass)) { $fixture = new $personalFixtureClass(); $fixture->load($manager); } } } - 第三步:每个人在自己本地的
.env.local文件里配置这个变量(.env.local默认是Git忽略的,不会提交到仓库):# 你的.env.local PERSONAL_FIXTURE_CLASS=App\DataFixtures\Personal\RicardFixtures # 同事的.env.local PERSONAL_FIXTURE_CLASS=App\DataFixtures\Personal\ColleagueFixtures
方案2:Git忽略的本地Fixture目录
如果不想改代码逻辑,这个更简单粗暴:
- 第一步:在
src/DataFixtures下创建Local目录,然后把这个目录添加到项目的.gitignore文件里:/src/DataFixtures/Local/ - 第二步:每个人在
Local目录里创建自己的Fixture类,比如MyLocalTestData.php。 - 第三步:修改主Fixture类,自动加载
Local目录下的所有Fixture:
这样每个人的本地测试数据都存在自己的use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; use Symfony\Component\Finder\Finder; class AppFixtures extends Fixture { public function load(ObjectManager $manager) { // 加载公共Fixture // ... // 加载本地专属Fixture $finder = new Finder(); $finder->files()->in(__DIR__ . '/Local')->name('*.php'); foreach ($finder as $file) { $className = 'App\\DataFixtures\\Local\\' . $file->getBasename('.php'); if (class_exists($className)) { $fixture = new $className(); $fixture->load($manager); } } } }Local目录,Git不会追踪,完全独立,也不会互相覆盖。
方案3:利用Fixture分组功能
Doctrine Fixtures Bundle原生支持分组加载,适合不想折腾配置的情况:
- 第一步:给公共Fixture打
public分组标签,每个人的专属Fixture打自己的名字标签:
同事的Fixture类同理,返回// 你的专属Fixture use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; use Doctrine\Bundle\FixturesBundle\FixtureGroupInterface; class RicardFixtures extends Fixture implements FixtureGroupInterface { public static function getGroups(): array { return ['ricard']; } public function load(ObjectManager $manager) { // 你的测试数据逻辑 } }['colleague']分组。 - 第二步:运行Fixture加载命令时,每个人指定自己的分组+公共分组:
这种方式不需要改太多代码,只是每个人记住自己的分组命令就行,灵活性很强。# 你运行的命令 php bin/console doctrine:fixtures:load --group=public,ricard # 同事运行的命令 php bin/console doctrine:fixtures:load --group=public,colleague
内容的提问来源于stack exchange,提问作者Ricard Espinàs Llovet
相关产品推荐
相关产品推荐

