(Sonata)无法在没有管理员链接的情况下创建OneToOne关系

时间:2016-10-19 12:17:47

标签: php symfony sonata

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

我扩展了BaseUser以创建自己的用户,我为UserAdmin做了同样的事情。 我创建了一个其他实体,用户在该实体上有一个关系OneToOne但我不希望用户可以通过链接到该实体的Admin来管理该实体。

我希望用户填写这些实体的唯一方法是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();
}

这是我的用户类:

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

我唯一能找到的是一个选择,希望我选择现有的PersonDetails(我想)。

我怎样才能做到这一点?并且,如果它可以轻松实现,为什么它不会出现在文档中?我认为这种情况并不罕见..

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

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

在班级用户中:

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类中:

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();
}