symfony SonataAdminBundle继承问题

fhity93d  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(132)

我遇到了一个关于SonataAdminBundle继承的问题
我有两个相互关联的实体:AbstractPersonVehicle以及继承AbstractPerson的2个实体:人员&社会

<?php

namespace Foo\Bundle\BarBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * AbstractPerson
 *
 * @ORM\Entity
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"person" = "Person", "society" = "Society"})
 */
abstract class AbstractPerson
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;

    /**
     * @ORM\OneToMany(targetEntity="Vehicle", mappedBy="owner")
     * @ORM\JoinColumn(nullable=false)
     */
    protected $vehicles;
}

/**
 * Person
 *
 * @ORM\Entity
 */
class Person extends AbstractPerson
{
}

/**
 * Society
 *
 * @ORM\Entity
 */
class Society extends AbstractContact
{
}

还有我的Vehicle实体:

<?php

namespace Foo\Bundle\BarBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Vehicle
 *
 * @ORM\Entity
 * @ORM\Table(name="vehicle")
 */
class Vehicle
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

        /**
         * @ORM\ManyToOne(targetEntity="AbstractPerson" ,inversedBy="vehicles")
         * @ORM\JoinColumn(name="person_id", referencedColumnName="id")
         */
        protected $owner;
}

SonataAdminBundle允许我们在admin中使用 setSubClasses 方法集处理实体之间的继承。yml:

services:
    sonata.admin.abstract_contact:
        class: Foo\Bundle\BarBundle\Admin\AbstractPersonAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: "Vehicle Manager", label: "AbstractPerson", label_catalogue: "messages" }
    arguments:
        - ~
        - Foo\Bundle\BarBundle\Entity\AbstractPerson
        - ~
    calls:
        - [setSubClasses, [{society: Foo\Bundle\BarBundle\Entity\Society, person: Foo\Bundle\BarBundle\Entity\Person}]] # Here the method that handles inheritance

现在我可以创建 PersonSociety,但问题是在 Vehicle 表单中。从这个表单我可以创建一个人,但是Sonata想要示例化一个AbstractPerson(一个抽象类)

Cannot initialize abstract class: Foo\Bundle\BarBundle\Entity\AbstractPerson

如果有人能帮助我示例化一个人或一个社会,而不是一个抽象的人,我会很高兴!
对不起,我的英语不好。
谢谢!

9rbhqvlz

9rbhqvlz1#

tl;dr:

1个管理员用于人员
1个社会管理员
1个管理员(可选)用于个人+社会

说来话长:

你逻辑上唯一的缺陷就是“奏鸣曲。admin.abstract_contact”.从体系结构的Angular 来看,Person和Society是两个完全不同的实体,您在这里使用的单表继承只是为了帮助您的实现看起来更整洁
为了解决这个问题,您需要两个独立的管理员,每个实体一个。
如果你想要一个加入的管理员同时管理两个实体,你需要创建一个第三个管理员服务,它有两个字段,都是“sonata_admin_type”,其中包括两个管理员。

q5lcpyga

q5lcpyga2#

现在他们那边的问题解决了。
参见#2917

相关问题