Расширение пользовательского пакета Sonata и добавление новых полей

Я расширяю пакет User Sonata и создаю дополнительные поля в новом пользовательском объекте. Эти поля будут обновляться только внутри области администрирования Sonata, поэтому они не должны быть доступны в форме профиля редактирования. У меня возникли проблемы с обновлением этих полей через Sonata User Manager и попробовал несколько разных способов расширения / реализации этого класса в Application \ Sonata \ UserBundle. Кто-нибудь сталкивался с этим раньше и может дать мне учебник или пошаговый процесс самого чистого способа расширить новый пользовательский объект?

1. Создайте новый пакет

Что-то вроде AcmeUserBundle. Создайте его и зарегистрируйте, как обычно.

2. Создайте новый объект пользователя

Затем создайте объект User и Group который расширяет Sonata\UserBundle\Entity\BaseUser и Sonata\UserBundle\Entity\BaseGroup . Вы также должны добавить конфигурацию для первичного ключа, например:

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

3. Настройте объект

затем перейдите в свой файл app/config/config.yml и настройте эти новые объекты:

 sonata_user: class: user: Acme\UserBundle\Entity\User group: Acme\UserBundle\Entity\Group 

4. Переопределите класс UserAdmin.

Затем вам нужно создать новый класс UserAdmin. Для этого просто создайте новый класс UserAdmin внутри вашего пакета, Sonata\UserBundle\Admin\Model\UserAdmin и переопределите такие методы:

 namespace Acme\UserBundle\Admin; use Sonata\UserBundle\Admin\Model\UserAdmin as SonataUserAdmin; class UserAdmin extends SonataUserAdmin { /** * {@inheritdoc} */ protected function configureFormFields(FormMapper $formMapper) { parent::configureFormFields($formMapper); $formMapper ->with('new_section') ->add(...) // ... ->end() ; } } 

5. Замените старый класс UserAdmin

Затем вам нужно убедиться, что Sonata использует новый класс UserAdmin. Вам просто нужно установить параметр sonata.user.admin.user.class в ваш новый класс и ваш готовый!

 # app/config/config.yml parameters: sonata.user.admin.user.class: Acme\UserBundle\Admin\UserAdmin 

Я узнал, что проблема была вопросом доктрины. В моем расширенном пакете использовались исходные сопоставления полей xml. Я удалил эти файлы и вернулся к аннотации. Оттуда все было блестяще. Надеюсь, это поможет кому-то другому, кто испытывает ту же проблему.

Это легко, но документация SonataUserBundle довольно короткая. В принципе, после настройки двух пучков, как описано здесь и здесь :

Вам нужно создать класс для расширения класса Sonata\UserBundle\Entity\BaseUser в SonataUserBundle . Обратите внимание: если вы переопределите конструктор, вы все равно должны вызвать конструктор родительского объекта.

 namespace Your\Bundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\EntityManager; use Sonata\UserBundle\Entity\BaseUser as BaseUser; /** * @ORM\Entity * @ORM\Table(name="user",indexes={@ORM\Index(name="username_idx", columns={"username"})}) */ class User extends BaseUser { public function __construct() { parent::__construct(); // your code here } /** * @ORM\Column(type="string") */ protected $firstName = ""; public function getFirstName() { return $this->firstName; } public function setFirstName($firstName) { $this->firstName = $firstName; } } 

Если вам это нужно, вы также можете переопределить объект Sonata\UserBundle\Entity\BaseGroup аналогичным образом.

Затем отредактируйте свой config.yml чтобы он соответствовал вашим пространствам имен, например

 # FOS User Bundle Configuration fos_user: user_class: Your\Bundle\Entity\User # To also override the Group object # group: # group_class: Your\Bundle\Entity\Group # Sonata User Bundle configuration sonata_user: class: user: Your\Bundle\Entity\User # To also override the Group object # group: Your\Bundle\Entity\Group 

Очистите кеш. Ваши объекты будут использоваться вместо встроенных.