I try to write fixtures in multiple files, I've never created fixtures by setting object, so I try to follow SF doc (https://symfony.com/bundles/DoctrineFixturesBundle/current/index.html#loading-the-fixture-files-in-order)
I have this error: Reference to "lang49" does not exist
lang49 being first object set
LangFixture:
use App\Entity\Lang;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class LangFixture extends Fixture
{
public const ENGLISH_LANG_REFERENCE = 'lang39';
public const FRENCH_LANG_REFERENCE = 'lang49';
public const SPANISH_LANG_REFERENCE = 'lang41';
public const TURKISH_LANG_REFERENCE = 'lang163';
public function load(ObjectManager $manager): void
{
...
$lang39 = new Lang();
$lang39->setLang("en");
$lang39->setName("English");
$lang39->setEnglishName("English");
$lang39->setEnabled(true);
$manager->persist($lang39);
$this->addReference(self::ENGLISH_LANG_REFERENCE, $lang39);
...
$lang41 = new Lang();
$lang41->setLang("es");
$lang41->setName("Español");
$lang41->setEnglishName("Spanish; Castilian");
$lang41->setEnabled(true);
$manager->persist($lang41);
$this->addReference(self::SPANISH_LANG_REFERENCE, $lang41);
...
$lang49 = new Lang();
$lang49->setLang("fr");
$lang49->setName("Français");
$lang49->setEnglishName("French");
$lang49->setEnabled(true);
$manager->persist($lang49);
$this->addReference(self::FRENCH_LANG_REFERENCE, $lang49);
...
$lang163 = new Lang();
$lang163->setLang("tr");
$lang163->setName("Türkçe");
$lang163->setEnglishName("Turkish");
$lang163->setEnabled(false);
$manager->persist($lang163);
$this->addReference(self::TURKISH_LANG_REFERENCE, $lang163);
...
$manager->flush();
}
}
UserFixture:
use App\Entity\User;
use App\DataFixtures\LangFixture;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
class UserFixture extends Fixture
{
public const ADMIN_USER_REFERENCE = 'admin';
public const VISITOR_USER_REFERENCE = 'visitor';
public function load(ObjectManager $manager): void
{
$admin = new User();
$admin->setLang($this->getReference(LangFixture::FRENCH_LANG_REFERENCE));
$admin->addLang($this->getReference(LangFixture::FRENCH_LANG_REFERENCE));
$admin->addLang($this->getReference(LangFixture::ENGLISH_LANG_REFERENCE));
$admin->addLang($this->getReference(LangFixture::SPANISH_LANG_REFERENCE));
$admin->setEmail('[email protected]');
$admin->setRoles(["ROLE_SUPER_ADMIN"]);
...
$admin->setLangContributor(true);
$admin->addContributorLang($this->getReference(LangFixture::TURKISH_LANG_REFERENCE));
$admin->setIsVerified(true);
$manager->persist($admin);
$this->addReference(self::ADMIN_USER_REFERENCE, $admin);
$visitor = new User();
$visitor->setLang($this->getReference(LangFixture::FRENCH_LANG_REFERENCE));
$visitor->addLang($this->getReference(LangFixture::FRENCH_LANG_REFERENCE));
$visitor->setEmail('[email protected]');
$visitor->setRoles(["ROLE_SUPER_VISITOR"]);
...
$admin->setLangContributor(false);
$visitor->setIsVerified(true);
$manager->persist($visitor);
$this->addReference(self::VISITOR_USER_REFERENCE, $visitor);
$manager->flush();
}
public function getDependencies()
{
return [
LangFixture::class,
];
}
}
Then UserFixture addReferences will be use into MessageFixture...
What's wrong? Thanx
UPDATED, now it's ok thanx to exepti0n
CodePudding user response:
You're using class constants for your languages references, but your are not using them for setting the reference.
$this->addReference('ENGLISH_LANG_REFERENCE', $lang39);
// Results in a reference called "ENGLISH_LANG_REFERENCE"
$this->addReference(self::ENGLISH_LANG_REFERENCE, $lang39);
// Results in a reference called "lang39" since that is the value of your constant
Since you are using dependent fixtures your UserFixture
should implement DependentFixtureInterface
.
// Old
class UserFixture extends Fixture {
// New
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
class UserFixture extends Fixture implements DependentFixtureInterface {