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

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

Ответ 1

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

Ответ 2

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

Ответ 3

Это легко, но 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

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