我正在使用 DoctrineFixtures 包在开发过程中创建示例实体。在我的 ORM 装置 load() 方法中,我将数据定义为关联数组并在循环中创建实体对象。
<?php
// ...
public function load($manager) {
$roleDefs = array(
'role-1' => array(
'role' => 'administrator'
),
'role-2' => array(
'role' => 'user'
),
);
foreach($roleDefs as $key => $roleDef) {
$role = new Role();
$role->setRole($roleDef['role']);
$manager->persist($role);
$this->addReference($key, $role);
}
$manager->flush();
}
我总是使用相同的数组模式。每个数组元素都使用实体的属性名称(以下划线表示法)作为索引。如果实体结构变得更复杂,就会有很多$entity->setMyProperty($def['my_property']);
lines.
我认为将属性名称映射到 setter 方法的问题是 Symfony 和 Doctrine 中的一个非常常见的问题,因为这种类型的映射在很多情况下都可以找到(例如,将表单映射到实体)。
现在我想知道是否有一个内置方法可以用于映射。最好有一个像这样的解决方案
foreach($defs as $key => $def) {
$entity = $magicMapper->getEntity('MyBundle:MyEntity', $def);
// ...
}
有人知道如何实现这一点吗?
多谢,
哈克牛排
我有时在创建装置时使用循环。我不确定这个解决方案是否符合您的要求,但我发现构建固定装置并随着时间的推移快速添加新属性(如果您需要)的最灵活的方法是执行以下操作...假设创建了一堆博客文章:
// an array of blog post fixture values
$posts = array(
array(
'title' => 'Foo',
'text' => 'lorem'
'date' => new \DateTime('2011-12-01'),
),
array(
'title' => 'Bar',
'text' => 'lorem'
'date' => new \DateTime('2011-12-02'),
),
// more data...
);
// loop over the posts
foreach ($posts as $post) {
// new entity
$post = new Post();
// now loop over the properties of each post array...
foreach ($post as $property => $value) {
// create a setter
$method = sprintf('set%s', ucwords($property)); // or you can cheat and omit ucwords() because PHP method calls are case insensitive
// use the method as a variable variable to set your value
$post->$method($value);
}
// persist the entity
$em->persist($post);
}
这样,您只需将新值添加到数组即可添加更多属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)