Артур,
Но вопрос в том, насколько это правильно, с точки зрения паттерна фабричного метода.
Чет вы сильно путаете теплое с мягким... Внутренняя реализация классов созданных фабрикой НИКАК не влияет на "фабричность". Паттерн относится
только к методу создания готовых объектов по определенным условиям. Какие это объекты вообще не суть важно. По сути они могут быть абсолютно разные, просто по логике чаще всего это однотипные объекты, отличающиеся в настройках или внутренней реализации (например все они реализуют один интерфейс, но внутри работают по разному).
Что касается вашего кода - как я уже сказал, для вашего случая(проверки доступа для текущей роли) достаточно задать метод проверки доступа. Как то так:
//$role = $_SESSION['role'];
$role = 'moderator';
class Role{
public function checkPermission($action)
{
if(isset ($this->$action))
{
return $this->$action;
}
return false;
}
}
class admin extends Role{
protected $addItem = true;
protected $editItem = true;
protected $deleteItem = true;
}
class moderator extends Role{
protected $addItem = true;
protected $editItem = true;
protected $deleteItem = false;
}
class publicator extends Role{
protected $addItem = true;
protected $editItem = false;
protected $deleteItem = false;
}
class Factory{
public static function createUsers($role) : Role{
if(class_exists($role))
return new $role;
else
echo ("Роль".$role."отсутствует");
}
}
$login = Factory::createUsers($role);
var_dump($login);
// try to use in code:
if ($login->checkPermission('editItem')){
echo 'lets edit!';
};