Разделение нескольких switch

player

Новичок
Разделение нескольких switch

Добрый день!

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

Нужно в зависимости от статуса юзверя выполнить те или иные функции посредством свича. Проблема возникает когда часть функционала должна быть доступна больше чем одной группе: скажем

PHP:
if(is_admin()) {

  switch($_GET['action']) {
    case "showData":
     break;

   default:
  }

 } elseif (is_user()) {

  switch($_GET['action']) {
    case "show1":
     break;

    case "show2":
     break;

   default:
  }

} else {

  switch($_GET['action']) {
    case "show3":
     break;

    case "show4":
     break;

   default:
  }

}
Как элегантнее всего сделать так, чтобы например show2 был доступен и user и всем кроме admin - скажем незарегистрированным пользователям

Кажется свич здесь както неповоротлив, потомучто если проверять каждый case, то на странице ничего не происходит, страница пуста

Поделитесь опытом;)
 

findnext

Новичок
player
варианты разные могут быть, например:
1. Свич
2. кэйсы
3. В каждом кэйсе проверяешь статус юзверя и выполняешь действия в соответствии со статусом юзверя. Чтобы кода меньше было то нужно написать вфункцию в аргумент которой передашь статус юзверя...

-~{}~ 18.12.08 01:11:

т.е
switch{

case1
do_something('admin')
do_something('registered')
do_something('all_others') и т.д
case2
case3
case4
}
 

player

Новичок
т.е
switch{

case1
do_something('admin')
do_something('registered')
do_something('all_others') и т.д
case2
case3
case4
}
Я этот вариант тоже обдумывал, но проблема в том - как я уже написал - что например если case2 должен выполняться только для админа, то для других юзеров вообще ничего не выполняется.
Например если проверять как в моем примере, то там можно встроить еще default, а case2 там будет только в свиче у админа.

варианты разные могут быть, например:
Кто знает ещё варианты?
 

Духовность™

Продвинутый новичок
создать нормальную систему прав:

1 таблица - users - пользователи
2 таблица - groups - группы пользователей. группам назначаются права (а не пользователям!)
3 таблица - users_vs_groups - таблица связи пользователей и групп
4 таблица - actions - действия (то, что у тебя "show3", "show4")
5 таблица - actions_vs_groups - таблица связи действий и групп ( права на действия для каждой группы):
id_action | id_group | access

в итоге не нужно будет городить кучу ветвлений. одним-двумя запросами ты получаешь в массив все права для группы, к которой принадлежит текущий пользователь. что-то типа

// действие => разрешение
array('show3'=>1, 'show4'=>0)

и, ИМХО, никогда не надо делать такого явного разделения на админов и пользователей. систему надо проектировать с учетом на то, что групп пользователей может быть сколь угодно много и с разными правами. т.е. отличие админа от пользователя - в расширенных правах, хранящихся как 0 и 1 в БД, а не в коде приложения.
 

player

Новичок
Спасибо, хорошии совет. Надо какнибудь интегрировать в систему, как время будет.

Пишите еще;)
 

x-yuri

Новичок
Я этот вариант тоже обдумывал, но проблема в том - как я уже написал - что например если case2 должен выполняться только для админа, то для других юзеров вообще ничего не выполняется.
не понимаю, почему предложенный вариант не подходит, но я бы немного подругому сделал
PHP:
if( in_array($_GET['action'], array('action1', 'action2', ...)) )
    $_GET['action']();
а дальше создаешь функции, которые выполняют действия, с названиями action1, action2
Лучше даже скорее всего
PHP:
if( in_array($_GET['action'], array('action1', 'action2', ...)) ) {
    $f = 'action_'.$_GET['action'];
    $f();
}
а в функциях в зависимости от статуса пользователя выполняешь действие нужным образом
 

Духовность™

Продвинутый новичок
у тебя проблема в архитектуре, коли ты такие вопросы задаешь. либо вставляй костыли, если проект уже лень переделывать, либо садись и пиши заново. так, что бы подобных вопросов не возникало, ибо никто не ответит как лучше организовать логику ТВОЕЙ системы.
 

prolis

Новичок
из документации:
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
если break убрать, то дальше опять кейсы те же самые можно юзать
 

player

Новичок
triumvirat
у тебя проблема в архитектуре, коли ты такие вопросы задаешь.
Да я понял что проблема в аритектуре. Но хочу узнать, вдруг есть еще хорошие варианты - потомучто проблема уже разок возникала, и в следующии раз я уже буду знать чего придерживаться.

Из предложенных вариантов тоже все хороши, всем спасибо. Просто было бы интересно узнать еще, как кто делает

-~{}~ 18.12.08 17:42:

if( in_array($_GET['action'], array('action1', 'action2', ...)) ) {
$f = 'action_'.$_GET['action'];
$f();
}
Кстати хорошая функция для моего случая:) Спасибо
 
Сверху