Расширение 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

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

Другие вопросы по тегам