(Sonata) Невозможно создать отношение OneToOne без привязки к нему администратора

#php #symfony #sonata

#php #symfony #соната

Вопрос:

Я хотел бы создать свое приложение вокруг Sonata, но я сталкиваюсь с некоторыми проблемами…

Я расширил BaseUser, чтобы создать своего собственного пользователя, и я сделал то же самое для администратора пользователя. Я создал другой объект, к которому пользователь имеет отношение 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();
}
  

Вот мой пользовательский класс :

 /**
 * @ORMEntity
 * @ORMTable(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORMOneToOne(targetEntity="PersonDetails")
     * @ORMJoinColumn(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 (я полагаю).

Как я могу этого добиться? И, если это может быть легко достигнуто, почему это не появилось в документации ? Я думаю, что этот случай на самом деле не редкость..

Спасибо за вашу помощь

Ответ №1:

Sonata попытается проанализировать переданную строку add("test") , чтобы мы могли получить доступ к нашей сущности, не управляемой никаким администрированием Sonata, простым add("details.test") способом.

Нам не нужна никакая дополнительная настройка для работы отношения. Просто не забудьте конфигурацию Doctrine для каскадного сохранения и удаления :

В классе User :

 public class User extends BaseUser{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORMOneToOne(targetEntity="PersonDetails", cascade={"persist", "remove"})
     * @ORMJoinColumn(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();
}