Расширение Sonata User Bundle и добавление новых полей
Я расширяю Sonata User Bundle и создаю несколько дополнительных полей в новой пользовательской сущности. Эти поля будут обновляться только в административной области Sonata под пользователями, поэтому они не должны быть доступны в форме редактирования профиля. У меня возникли проблемы с обновлением этих полей через диспетчер пользователей Sonata, и я пробовал несколько разных способов расширить / реализовать этот класс в Application\Sonata\UserBundle. Кто-нибудь сталкивался с этим раньше и может дать мне учебное пособие или пошаговый процесс о самом чистом способе расширения новой сущности пользователя?
3 ответа
Я узнал, что проблема была проблемой доктрины. Мой расширенный пакет использовал оригинальные отображения полей xml. Я удалил эти файлы и вернулся к аннотациям. Все сработало блестяще оттуда. Я надеюсь, что это помогает кому-то еще, кто испытывает ту же проблему.
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
Это легко, но 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
Очистить кеш. Ваши сущности будут использоваться вместо встроенных.