Пример Role Demo использует ORM Doctrine для управления базами данных. Мы уже научились пользоваться Doctrine в Управление базой данной с помощью ORM Doctrine.
Для хранения информации о ролях и привилегиях мы создадим сущности Role
и Permission
. Сущности Role
соответствует таблица БД role
, а сущности Permission
– таблица permission
. Это типичные классы
сущностей Doctrine.
Создайте файл Role.php внутри каталога Entity под корневой директорией модуля User. Поместите в этот файл следующий код:
<?php
namespace User\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Этот класс представляет роль.
* @ORM\Entity()
* @ORM\Table(name="role")
*/
class Role
{
/**
* @ORM\Id
* @ORM\Column(name="id")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(name="name")
*/
protected $name;
/**
* @ORM\Column(name="description")
*/
protected $description;
/**
* @ORM\Column(name="date_created")
*/
protected $dateCreated;
/**
* @ORM\ManyToMany(targetEntity="User\Entity\Role")
* @ORM\JoinTable(name="role_hierarchy",
* joinColumns={@ORM\JoinColumn(name="child_role_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="parent_role_id", referencedColumnName="id")}
* )
*/
private $parentRoles;
/**
* @ORM\ManyToMany(targetEntity="User\Entity\Role")
* @ORM\JoinTable(name="role_hierarchy",
* joinColumns={@ORM\JoinColumn(name="parent_role_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="child_role_id", referencedColumnName="id")}
* )
*/
protected $childRoles;
/**
* @ORM\ManyToMany(targetEntity="User\Entity\Permission")
* @ORM\JoinTable(name="role_permission",
* joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")}
* )
*/
private $permissions;
/**
* Конструктор.
*/
public function __construct()
{
$this->parentRoles = new ArrayCollection();
$this->childRoles = new ArrayCollection();
$this->permissions = new ArrayCollection();
}
/**
* Возвращает ID роли.
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Задает ID роли.
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getDescription()
{
return $this->description;
}
public function setDescription($description)
{
$this->description = $description;
}
public function getDateCreated()
{
return $this->dateCreated;
}
public function setDateCreated($dateCreated)
{
$this->dateCreated = $dateCreated;
}
public function getParentRoles()
{
return $this->parentRoles;
}
public function getChildRoles()
{
return $this->childRoles;
}
public function getPermissions()
{
return $this->permissions;
}
public function addParent(Role $role)
{
if ($this->getId() == $role->getId()) {
return false;
}
if (!$this->hasParent($role)) {
$this->parentRoles[] = $role;
return true;
}
return false;
}
public function clearParentRoles()
{
$this->parentRoles = new ArrayCollection();
}
public function hasParent(Role $role)
{
if ($this->getParentRoles()->contains($role)) {
return true;
}
return false;
}
}
Как вы могли определить по приведенному выше коду, сущность Role – это типичная сущность Doctrine с аннотированными свойствами и методами getter и setter для извлечения/задания этих свойств.
Далее, создайте файл Permission.php внутри каталога Entity под корневой директорией модуля User. Поместите в этот файл следующий код:
<?php
namespace User\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Этот класс представляет привилегию.
* @ORM\Entity()
* @ORM\Table(name="permission")
*/
class Permission
{
/**
* @ORM\Id
* @ORM\Column(name="id")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(name="name")
*/
protected $name;
/**
* @ORM\Column(name="description")
*/
protected $description;
/**
* @ORM\Column(name="date_created")
*/
protected $dateCreated;
/**
* @ORM\ManyToMany(targetEntity="User\Entity\Role")
* @ORM\JoinTable(name="role_permission",
* joinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $roles;
/**
* Конструктор.
*/
public function __construct()
{
$this->roles = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
public function getDescription()
{
return $this->description;
}
public function setDescription($description)
{
$this->description = $description;
}
public function getDateCreated()
{
return $this->dateCreated;
}
public function setDateCreated($dateCreated)
{
$this->dateCreated = $dateCreated;
}
public function getRoles()
{
return $this->roles;
}
}
Наконец, мы немного расширим уже созданную в примере User Demo сущность User
и добавим свойство и методы,
связанные с ролями:
<?php
namespace User\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Этот класс представляет зарегистрированного пользователя.
* @ORM\Entity()
* @ORM\Table(name="user")
*/
class User
{
// Константы статуса пользователя.
const STATUS_ACTIVE = 1; // Активный пользователь.
const STATUS_RETIRED = 2; // Неактивный пользователь.
/**
* @ORM\Id
* @ORM\Column(name="id")
* @ORM\GeneratedValue
*/
protected $id;
/**
* @ORM\Column(name="email")
*/
protected $email;
/**
* @ORM\Column(name="full_name")
*/
protected $fullName;
/**
* @ORM\Column(name="password")
*/
protected $password;
/**
* @ORM\Column(name="status")
*/
protected $status;
/**
* @ORM\Column(name="date_created")
*/
protected $dateCreated;
/**
* @ORM\Column(name="pwd_reset_token")
*/
protected $passwordResetToken;
/**
* @ORM\Column(name="pwd_reset_token_creation_date")
*/
protected $passwordResetTokenCreationDate;
/**
* @ORM\ManyToMany(targetEntity="User\Entity\Role")
* @ORM\JoinTable(name="user_role",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $roles;
/**
* Конструктор.
*/
public function __construct()
{
$this->roles = new ArrayCollection();
}
/**
* Возвращает ID пользователя.
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Задает ID пользователя.
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* Возвращает адрес эл. почты.
* @return string
*/
public function getEmail()
{
return $this->email;
}
/**
* Задает адрес эл. почты.
* @param string $email
*/
public function setEmail($email)
{
$this->email = $email;
}
/**
* Возвращает полное имя.
* @return string
*/
public function getFullName()
{
return $this->fullName;
}
/**
* Задает полное имя.
* @param string $fullName
*/
public function setFullName($fullName)
{
$this->fullName = $fullName;
}
/**
* Возвращает статус.
* @return int
*/
public function getStatus()
{
return $this->status;
}
/**
* Возвращает возможные статусы в виде массива.
* @return array
*/
public static function getStatusList()
{
return [
self::STATUS_ACTIVE => 'Active',
self::STATUS_RETIRED => 'Retired'
];
}
/**
* Возвращает статус пользователя в виде строки.
* @return string
*/
public function getStatusAsString()
{
$list = self::getStatusList();
if (isset($list[$this->status]))
return $list[$this->status];
return 'Unknown';
}
/**
* Задает статус.
* @param int $status
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* Возвращает пароль.
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* Задает пароль.
* @param string $password
*/
public function setPassword($password)
{
$this->password = $password;
}
/**
* Возвращает дату создания пользователя.
* @return string
*/
public function getDateCreated()
{
return $this->dateCreated;
}
/**
* Задает дату, когда был создан этот пользователь.
* @param string $dateCreated
*/
public function setDateCreated($dateCreated)
{
$this->dateCreated = $dateCreated;
}
/**
* Возвращает токен сброса пароля.
* @return string
*/
public function getResetPasswordToken()
{
return $this->passwordResetToken;
}
/**
* Задает токен сброса пароля.
* @param string $token
*/
public function setPasswordResetToken($token)
{
$this->passwordResetToken = $token;
}
/**
* Возвращает дату создания токена сброса пароля.
* @return string
*/
public function getPasswordResetTokenCreationDate()
{
return $this->passwordResetTokenCreationDate;
}
/**
* Задает дату создания токена сброса пароля.
* @param string $date
*/
public function setPasswordResetTokenCreationDate($date)
{
$this->passwordResetTokenCreationDate = $date;
}
/**
* Возвращает массив ролей, присвоенных этому пользователю.
* @return array
*/
public function getRoles()
{
return $this->roles;
}
/**
* Возвращает строку имен присвоенных ролей.
*/
public function getRolesAsString()
{
$roleList = '';
$count = count($this->roles);
$i = 0;
foreach ($this->roles as $role) {
$roleList .= $role->getName();
if ($i<$count-1)
$roleList .= ', ';
$i++;
}
return $roleList;
}
/**
* Присваивает пользователю роль.
*/
public function addRole($role)
{
$this->roles->add($role);
}
}