использовать другую сущность для входа в Symfony

1

Я делаю приложение symfony. Я пытаюсь реализовать пользовательскую систему.

3 человек могут войти: студент, учитель и секретарь

Изображение 174551

Если я смоделирую так, как я могу сделать класс входа?

В моем студенческом образовании у меня есть:

/**
 * @var \essaiBundle\Entity\User
 *
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="NONE")
 * @ORM\OneToOne(targetEntity="essaiBundle\Entity\User")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id", referencedColumnName="id")
 * })
 */
private $id;

Эта ссылка на идентификатор пользователя.

Как я могу получить роль для входа пользователя в систему?

Мой файл безопасности:

security:
    providers:
        our_db_provider:
            entity: { class: essaiBundle\Entity\User, property: username}

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
    firewalls:
        login_firewall:
            pattern:   ^/login$
            anonymous: ~
        default:
            anonymous: ~
            http_basic: ~
            form_login:
                login_path: /login
                check_path: /login_check
                csrf_provider: security.csrf.token_manager
                default_target_path: admin
            provider: our_db_provider


    encoders:
        essaiBundle\Entity\User:
            algorithm: bcrypt
            cost: 12

благодаря

  • 1
    В чем разница между Student , Teacher и Secretary ? Разве ролевого механизма недостаточно в этом случае? Также посмотрите на наследование Доктрины , если вам нужно разделить свои сущности.
  • 0
    Мне нужны 3 объекта из-за другой части приложения. Учитель не имеет того же атрибута, что ученик и т. Д. А также отношения с другими сущностями различны.
Показать ещё 2 комментария
Теги:
database
doctrine2

1 ответ

2

Проблема заключается в архитектуре приложения. Я думаю, вы начали разрабатывать приложение со стороны базы данных. Вам нужно изменить подход к дизайну приложения. Доктрина может справиться с базой, вам больше не нужно беспокоиться о базе.

Это ваша новая диаграмма классов

Вам не нужны отношения "один-к-одному" (например, с пользователем и учеником). Студент, Учитель, Секретарь распространяется от Пользователя. Это позволяет упростить работу с протоколированием, потому что вам нужно настроить только класс User

Пользовательский объект:

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"user" = "User", "student" = "Student", "teacher" = "Teacher", "secretary" = "Secretary"})
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * Name
     *
     * @var string
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }
}

Студенческая организация:

use Doctrine\ORM\Mapping as ORM;

/**
 * Student
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Student extends User
{
    private $teachers; // extra field for student
}

Класс учителя:

use Doctrine\ORM\Mapping as ORM;

/**
 * Teacher
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Teacher extends User
{
    private $students; // extra field for teacher
}

Секретарь:

use Doctrine\ORM\Mapping as ORM;

/**
 * Secretary
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Secretary extends User
{
    private $sercretaryBar; // extra field for secretary
}

Вот ссылка на Doctrine doc, который поможет вам.

DB:

Когда вы меняете свои сущности, вы можете проверить, какие изменения необходимо применять в БД:

app/console doctrine:schema:update --dump-sql

принудительное изменение в БД:

app/console doctrine:schema:update --force

Я предлагаю использовать миграцию (doctrine/doctrine-migrations-bundle на packagist.org), если вы пока не используете.

  • 0
    Ты совершенно прав. Я сделал модель базы данных раньше. Я думаю, что ваше решение должно быть хорошим решением, но класс входа должен также расширить пользовательский класс? Как я могу получить доступ к логину, который расширяет пользовательский класс непосредственно из файла security.yml?
  • 0
    Вам не нужен класс входа в систему. Вместо этого вы используете класс User для всех процедур входа в систему. Пожалуйста, обратитесь к Symfony Doc
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню