(奏鸣曲)如果没有 Admin 链接就不可能创建 OneToOne 关系

(Sonata) Impossible to create a OneToOne relation without having an Admin linked to it

我想围绕 Sonata 创建我的应用程序,但我遇到了一些问题...

我扩展了 BaseUser 来创建我自己的用户,我也为 UserAdmin 做了同样的事情。 我创建了另一个实体,用户在该实体上具有 OneToOne 关系,但我不希望该实体可由具有链接到该实体的管理员的用户管理。

我希望用户填写这些实体的唯一方法是通过 UserAdmin,我试过这样的方法:

protected function configureFormFields(FormMapper $formMapper){
    parent::configureFormFields($formMapper);
    $formMapper
        ->tab('Client details')
            ->with('Client Identity', array('class' => 'col-md-6'))
                ->add("test", EntityType::class, array(
                   "class" => "AppBundle:PersonDetails",
                   "property_path" => "details.test"
                ))
            ->end()
        ->end();
}

这是我的用户 class :

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="PersonDetails")
     * @ORM\JoinColumn(name="details_id", referencedColumnName="id")
     */
    private $details;

    public function __construct()
    {
        parent::__construct();
        $this->details = new PersonDetails();
    }

    /**
     * @return PersonDetails
     */
    public function getDetails()
    {
        return $this->details;
    }

    /**
     * @param PersonDetails $details
     */
    public function setDetails($details)
    {
        $this->details = $details;
    }
}

我得到的唯一东西是 select,它要我选择现有的 PersonDetails(我想)。

我怎样才能做到这一点?而且,如果它很容易实现,为什么它没有出现在文档中?我觉得这种情况并不少见..

感谢您的帮助

Sonata 将尝试解析传递给 add("test") 的字符串,因此我们可以通过一个简单的 add("details.test") 访问我们的实体 不受任何 Sonata 管理 驱动.

我们不需要任何额外的配置来使关系正常工作。 只是不要忘记 Cascade Persist 和 Deletion 的 Doctrine 配置:

在 class 用户中:

public class User extends BaseUser{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToOne(targetEntity="PersonDetails", cascade={"persist", "remove"})
     * @ORM\JoinColumn(name="details_id", referencedColumnName="id")
     */
    private $details;

    // The rest of the class
}

在 UserAdmin class 中:

protected function configureFormFields(FormMapper $formMapper)
{
    parent::configureFormFields($formMapper);

    $formMapper
        ->tab('Client details')
            ->with('Client Identity', array('class' => 'col-md-6'))
                ->add("details.test")
            ->end()
        ->end();
}