symfony 工厂传递自定义参数以供持久使用 - ZenstruckFoundryBundle

问题描述 投票:0回答:1

编辑

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

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

我有一个生成大学的工厂,然后将其插入数据库中,然后我需要使用课程工厂来分配我想要在 afterPersist 中执行的课程。

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

/**
     * @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 中得到一个空数组(this->courses 是空的):

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

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

php symfony symfony4
1个回答
0
投票

编辑2

别忘了:

  • 删除
    $this->afterPersist
  • 的代码
  • Course
    类文件中使用
    University
    实体类命名空间
  • 更新您传递给的内容
    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
分配给大学里的
$this
setCourses
方法

    /**
     * @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;
    }

原版安塞瓦尔

基于

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

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

更多关于传递持久性/级联操作

© www.soinside.com 2019 - 2024. All rights reserved.