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