В проектах, где требуется разделить права пользователей по ролям, можно использовать шаблон проектирования фабрика (fabric). Данная статья поможет разобраться каким именно образом.
Допустим есть простой URI роутер:
Нажмите, чтобы отобразить текст
$path=dirname(__FILE__);
require_once($path . '/lib/router/routeurl.php');
require_once($path . '/lib/PageError.php');
$routeurl = new routeURL(); //Создаем объект роутера
$routeurl->enableFabric(); //Указываем использовать фабричный паттерн
try {
$routeurl->launch();
} catch ( badClassNameException $e ) {
PageError::show('400', $e->getMessage());
} catch ( classFileNotFoundException $e ) {
PageError::show('401', $e->getMessage());
} catch ( classNameNotFoundException $e ) {
PageError::show('402', $e->getMessage());
} catch ( classMethodNotFoundException $e ) {
PageError::show('403', $e->getMessage());
} |
$path=dirname(__FILE__);
require_once($path . '/lib/router/routeurl.php');
require_once($path . '/lib/PageError.php');
$routeurl = new routeURL(); //Создаем объект роутера
$routeurl->enableFabric(); //Указываем использовать фабричный паттерн
try {
$routeurl->launch();
} catch ( badClassNameException $e ) {
PageError::show('400', $e->getMessage());
} catch ( classFileNotFoundException $e ) {
PageError::show('401', $e->getMessage());
} catch ( classNameNotFoundException $e ) {
PageError::show('402', $e->getMessage());
} catch ( classMethodNotFoundException $e ) {
PageError::show('403', $e->getMessage());
}
В index файле инициализируем следующим образом:
class News extends Core
{
public function show()
{
//Какой-то код, для определенной группы пользователей, назовем ее Foo.
}
}
class Allnews extends News
{
public function show()
{
//А этот код, для другой группы пользователей - Bar.
}
public function add()
{
//Какой-то еще метод, для группы Bar.
}
}
class Fabric
{
public static function getInstance()
{
if($_SESSION['allowadvanced']===true)
return new Allnews;
else
return new News;
}
} |
class News extends Core
{
public function show()
{
//Какой-то код, для определенной группы пользователей, назовем ее Foo.
}
}
class Allnews extends News
{
public function show()
{
//А этот код, для другой группы пользователей - Bar.
}
public function add()
{
//Какой-то еще метод, для группы Bar.
}
}
class Fabric
{
public static function getInstance()
{
if($_SESSION['allowadvanced']===true)
return new Allnews;
else
return new News;
}
}
Рассмотрим сначала поведение роутера при отключенном шаблоне фабрика. Если посетитель набирает в адресной строке браузера, например, example.com/news/show, то в директории с контроллерами ищется файл news.php, в котором находится одноименный класс. Создает его объект и вызывает метод show.
Ситуация резко меняется при включении фабрики. Роутер как и прежде ищет файл news.php, но вместо того, чтобы создать объект, вызывает статический метод класса fabric, который возвращает нужный объект. Пример контроллера:
class News extends Core
{
public function show()
{
//Какой-то код, для определенной группы пользователей, назовем ее Foo.
}
}
class Allnews extends News
{
public function show()
{
//А этот код, для другой группы пользователей - Bar.
}
public function add()
{
//Какой-то еще метод, для группы Bar.
}
}
class Fabric
{
public static function getInstance()
{
if($_SESSION['allowadvanced']===true)
return new Allnews;
else
return new News;
}
} |
class News extends Core
{
public function show()
{
//Какой-то код, для определенной группы пользователей, назовем ее Foo.
}
}
class Allnews extends News
{
public function show()
{
//А этот код, для другой группы пользователей - Bar.
}
public function add()
{
//Какой-то еще метод, для группы Bar.
}
}
class Fabric
{
public static function getInstance()
{
if($_SESSION['allowadvanced']===true)
return new Allnews;
else
return new News;
}
}
Таким образом, пользователь, у которого недостаточно прав не только не получит доступ к определенным методам. Более того — даже не узнает об их существовании!
root4root aka admin
Добавить комментарий
X