Я делаю приложение symfony. Я пытаюсь реализовать пользовательскую систему.
3 человек могут войти: студент, учитель и секретарь
Если я смоделирую так, как я могу сделать класс входа?
В моем студенческом образовании у меня есть:
/**
* @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
благодаря
Проблема заключается в архитектуре приложения. Я думаю, вы начали разрабатывать приложение со стороны базы данных. Вам нужно изменить подход к дизайну приложения. Доктрина может справиться с базой, вам больше не нужно беспокоиться о базе.
Это ваша новая диаграмма классов
Вам не нужны отношения "один-к-одному" (например, с пользователем и учеником). Студент, Учитель, Секретарь распространяется от Пользователя. Это позволяет упростить работу с протоколированием, потому что вам нужно настроить только класс 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), если вы пока не используете.
Student
,Teacher
иSecretary
? Разве ролевого механизма недостаточно в этом случае? Также посмотрите на наследование Доктрины , если вам нужно разделить свои сущности.