Расширение сущности пользователя

Я пытаюсь расширить User Entity пользовательского пакета сонаты, но это всегда терпит неудачу (по крайней мере, когда я хочу использовать ist с пакетом администратора сонаты). Если я использую Application/Sonata/UserBundle/Entity/User Entity, он работает, и я могу редактировать его на панели инструментов.

Моя сущность выглядит так:

<?php

namespace MyNamespace\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\EntityManager;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;

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

В моем config.yml я определил следующие параметры:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class:     MyNamespace\MyBundle\Entity\User
    group:
        group_class:   Application\Sonata\UserBundle\Entity\Group
        group_manager: sonata.user.orm.group_manager
    service:
    user_manager: sonata.user.orm.user_manager 

А также:

sonata_user:
security_acl: true
manager_type: orm
class:
   user: MyNamespace\MyBundle\Entity\User

Логин работает правильно, но потом я получаю сообщение об ошибке

«Во время рендеринга шаблона возникло исключение («Невозможно сгенерировать URL-адрес для именованного маршрута «admin_sonata_user_user_create», поскольку такой маршрут не существует») в SonataAdminBundle:Block:block_admin_list.html.twig в строке 39».

Мой файл routing.yml выглядит так:

admin:
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
    prefix: /

_sonata_admin:
    host:       www.mydomain.com
    resource: .
    type: sonata_admin
    prefix: /
    schemes:    [https]

Даже если я буду следовать этому руководству (Extending Sonata User Bundle и добавление новых полей) шаг за шагом я получаю ту же ошибку.


person dominikweber    schedule 21.01.2015    source источник
comment
Можно выполнить: php app/console router:debug | grep admin_sonata_user_user_create   -  person Pawel    schedule 21.01.2015
comment
Да, результата нет, потому что маршрут отсутствует полностью. Если я вернусь к пользовательскому объекту sonata-user-bundle по умолчанию, маршрут снова заработает и появится в выводе router:debug.   -  person dominikweber    schedule 21.01.2015
comment
Почему бы вам не расширить SonataUser вместо FOSUserBundle Entity? Я просто предполагаю, что соната расширяет FOS User ? Вы не можете пропустить объект SonataUser, если используете этот пакет.   -  person Pawel    schedule 21.01.2015
comment
Это то, что я пытаюсь сделать, я думал, что это будет правильный способ, если я использую Sonata\UserBundle\Entity\BaseUser как BaseUser;   -  person dominikweber    schedule 21.01.2015
comment
Я давно не пользуюсь этой связкой, но помню, что это было сложно :-| Я не хочу показывать тебе плохой путь.   -  person Pawel    schedule 21.01.2015


Ответы (1)


Application/Sonata/UserBundle/Entity/User является расширенным Sonata/UserBundle/Entity/User, так почему бы просто не внести изменения вместо другого класса?

Это уже расширенный пакет, так что вы можете внести все изменения там. Я поместил туда свои дополнительные поля.

Мой файл Application/Sonata/UserBundle/Entity/User.php выглядит так:

namespace Application\Sonata\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Sonata\UserBundle\Entity\BaseUser as BaseUser;

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

    /**
     * @var string
     */
    private $company;

Если вы действительно хотите использовать другой класс, вам нужно позаботиться о маршрутизации.

Проверьте \vendor\sonata-project\user-bundle\Resources\config\admin_orm.xml - это место, где оригинальный класс добавляется как услуга.

Вы можете увидеть там параметр %sonata.user.admin.user.entity% — вы можете изменить его в конфигурации, если хотите перейти на другой класс. Я думаю, что это лучше, чем менять fos_user.user_class.

Вы также можете переместить весь файл в свой Application/Sonata/UserBudle, но тогда вам нужно будет загрузить его внутрь DependencyInjection/ApplicationSonataUserExtension.php

Кстати, это действительно сложно в Sonata, которую пользователь связывает, как написал Павел, и требует много отладки, чтобы заставить ее работать.

person Krewetka    schedule 23.01.2015
comment
Большое спасибо за вашу помощь, это, наконец, сработало для меня. Кроме того, мне пришлось удалить папку Resources/config/doctrine, чтобы иметь возможность использовать аннотации и doctrine:generate:entities (stackoverflow.com/questions/14042010/) - person dominikweber; 25.01.2015
comment
Да ты прав. Я забыл написать об удалении папки - извините за это. Рад, что вам удалось заставить его работать на вас :) - person Krewetka; 26.01.2015