Отображение той же страницы по-разному для пользователей с разными ролями

Мне нужны были предложения от кого-то с опытом работы на php.

Я делаю сайт в php, который будет иметь 4 вида пользователей:  1. гость (незарегистрированный),  2. зарегистрировано,  3. зарегистрировано в специальных привилегиях,  4. админы

Таким образом, одна и та же страница будет видна по-разному для всех четырех.

Сейчас я делаю это, используя условия if. На каждой странице я проверяю role пользователя, а затем использую множество операторов if для отображения страницы соответственно.

Он делает код очень большим и неопрятным, и я должен проверять условия снова и снова на всех страницах.

  • Есть ли лучший способ сделать это?

  • Как это делается на больших профессиональных веб-сайтах?

  • Расширенный вопрос: Каков наиболее оптимальный способ сделать то же самое с использованием инфраструктуры MVC, например, kohana 3.1? Имеет ли это какое-либо отношение к acl?

Ответ 1

Это действительно зависит от того, что вам нужно.

Например, если страница имеет большую часть, которая полностью изменяется, то я бы предложил создать разные шаблоны и включить их в зависимости от их "разрешений"

 $permission = $_SESSION['type_user'];
 include '/path/to/file/with/permission/'.$permission.'/tpl.html';

и что-то на странице, похожее на

<?php
//inside include.php you have the line similar to
//$permission = isset($_SESSION['type_user']) && $_SESSION['type_user']!=''?$_SESSION['type_user']:'common';
require_once '/mast/config/include.php';
include '/path/to/file/with/permission/common/header.html';
include '/path/to/file/with/permission/'.$permission.'/tpl_1.html';
include '/path/to/file/with/permission/common/tpl_2.html';
include '/path/to/file/with/permission/'.$permission.'/tpl_3.html';
include '/path/to/file/with/permission/common/footer.html';
?>

если script заполнен небольшими частями, такими как "показать этот текст" или "показать эту кнопку", вы можете создать функцию, которая будет проверять разрешения для вас

<?php
function can_user($action, $what){
   switch($action){
      case 'write':
          return $your_current_if_on_what;
          break;
      case 'read':
      default:
          return $your_current_if_on_what;
          break;
   }
}
?>

and the template will look like:

[my html]
<?=can_user('read','button')?'My Button':''?>
[my html]

Как правило, если фрагмент кода используется более чем в 2 раза, его нужно поместить в функцию/файл отдельно, поэтому, если у вас много "IFS", вам нужно создать функцию