Я расширяю пакет User Sonata и создаю дополнительные поля в новом пользовательском объекте. Эти поля будут обновляться только внутри области администрирования Sonata, поэтому они не должны быть доступны в форме профиля редактирования. У меня возникли проблемы с обновлением этих полей через Sonata User Manager и попробовал несколько разных способов расширения / реализации этого класса в Application \ Sonata \ UserBundle. Кто-нибудь сталкивался с этим раньше и может дать мне учебник или пошаговый процесс самого чистого способа расширить новый пользовательский объект?
Что-то вроде AcmeUserBundle. Создайте его и зарегистрируйте, как обычно.
Затем создайте объект 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; }
затем перейдите в свой файл app/config/config.yml
и настройте эти новые объекты:
sonata_user: class: user: Acme\UserBundle\Entity\User group: Acme\UserBundle\Entity\Group
Затем вам нужно создать новый класс 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() ; } }
Затем вам нужно убедиться, что 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
Очистите кеш. Ваши объекты будут использоваться вместо встроенных.