symfony工厂传递自定义参数,以便在persistent-ZenstruckFoundryBundle之后使用



编辑

忘记包括我正在使用的包裹:https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html

我正试图弄清楚如何将额外的数据传递给工厂,以便在一些自定义代码中使用。

我有一个生成大学的工厂,在它被插入数据库后,我需要使用课程工厂来分配我想在Persist之后完成的课程。

我尝试添加我自己的方法来设置对象上的课程数组:

/**
* @param array $courses
* @return $this
*/
public function setCourses(array $courses) : self
{
$this->courses = $courses;
return $this;
}

然后这样称呼它:

foreach($this->universities as $university){
UniversityFactory::new()->setCourses($university['courses'])->create([
'name'=>$university['name'],
'slug'=>$university['slug']
]);
}

然而,我在afterPersists中得到了一个空数组(这个->课程是空的(:

return $this->afterPersist(function(University $university){

foreach($this->courses as $type => $courseName){
CourseFactory::new()->create([
'name'=>$courseName,
'type'=>$type,
'uni'=>$university
]);
}
});

课程数组确实被分配了,但当运行create((时,它会被清空。

编辑2

别忘了:

  • 删除$this->afterPersist的代码
  • University类文件中使用Course实体类命名空间
  • 更新传递给setCourses的内容:
foreach($this->universities as $university){
UniversityFactory::new()->setCourses(
array_map(function ($type,$courseName){
return (new Course())->setType($type)->setName($courseName);
}, array_keys($university['courses']), array_values($university['courses']))
)->create([
'name'=>$university['name'],
'slug'=>$university['slug']
]);
}

编辑1

实际上,您可以使用它们的uni关系来处理持久化课程,而无需使用afterPersist挂钩。你可以按下面的方式设置cascade={"persist"},并将每门课程的uni分配给大学setCourses方法中的$this

/**
* @param Course[] $courses
* @return $this
*/
public function setCourses(array $courses) : self
{
$this->courses = [];
foreach($courses as $course){
if (!$this->courses->contains($course)) {
$this->courses[] = $course;
$course->setUni($this);
}
}
return $this;
}

原始Ansewar

基于$courses属性已设置但未持久化的事实你很可能忘记在条令关系注释中添加cascade={"persist"}

/**
* @ORMOneToMany(... cascade={"persist"})
*/
private Collection|array $courses;

有关传递持久性/级联操作的更多信息

最新更新