Hierarchia klas Użytkownika/Moda/Admina

0

Usiłuję zrobić poprawną hierarchię klas dla użytkowników o różnych rolach w systemie. Poniższy kod ma sens, czy błądzę w ciemnościach?

 abstract class BaseUser {}
class RegularUser extends BaseUser {}
class ModUser extends RegularUser {}
class AdminUser extends Mod {}  

plus klasa factory "Users" zwracająca obiekty odpowiedniej klasy po zalogowaniu

 $user = Users::getInstance(); 
1

Polecanym wzorcem projektowym jest wzorzec roli:
http://en.wikipedia.org/wiki/Role_Class_Model

Więc użytkownik posiadał by rolę i definiujesz role: BaseRole, ModeratorRole(:BaseRole), AdminRole(:ModeratorRole lub :BaseRole)
i każdy użytkownik ma jakąś rolę przypisaną - łatwiej jest wtedy modyfikować role.

0

Aha... czyli coś takiego?

class User 
{
	private $rola;
	public function __construct() {}
	public function login($input) 
	{
		// 1. autentykacja + pobranie danych z db
		// ...
		// 2. przypisanie konkretnej roli na podstawie danych z db
		$rola = new AdminRole();
	}	
}

class BaseRole {}
class UserRole extends BaseRole {}
class AdminRole extends UserRole {} 
0

Kurcze, ja jednak czegoś nie rozumiem w takim podejściu jak powyżej. Co jeżeli jakaś metoda "roli" Usera z powyższego przykładu potrzebuje korzystać z pól obiektu User? Przekazywać je jako parametry tej metody? Średni pomysł chyba...

0

Przekazywać jako parametry? Przykład?

0

Załóżmy, że rola Admina posiada metodę SomethingAdminish($uid), która ma za zadanie (między innymi) zapisać wykonaną akcję do bazy, łącznie z ID użytkownika (admina).

class User 
{
        public $rola;
        public $uid;        
        public function login($input) 
        {                
                $rola = new AdminRole();
        }        
} 
class AdminRole 
{ 
       // metoda coś tam wykonuje + zapisuje do bazy wykonaną akcję oraz ID Usera
       public function SomethingAdminish($admin_id)
       {
              // log admin action
       }
}
$user = new User();
$user->login();

// przekazywanie ID admina do roli AdminRole... 
$user->rola->SomethingAdminish($user->uid);
0

No i gdzie problem?

0

A no myślałem że tutaj:

 // przekazywanie ID admina do roli AdminRole... 
$user->rola->SomethingAdminish($user->uid);

bo przekazuje do metody właściwość obiektu, który ją (nie bezpośrednio) wywołał. Niby nic, ale w skrajnym wypadku jeżeli potrzebowałbym dużo (wszystkie?) właściwości tego obiektu musiałbym zrobić tak:

 $user->rola->SomethingAdminish($user);

?

No i druga sprawa - teoretycznie jeżeli zrobię coś takiego:

 $user->rola->SomethingAdminish(111);

to wywołam metodę poprawnie ale do bazy zapisze informację: Admin o ID=111 wykonał akcję. Przy czym '111' mogę zastąpić jakimkolwiek inną liczbą... i log diabli wezmą.

0

poczytaj o acl'u napisz klase obslugujaca uzytkownika(User) i klase do obslugi uwierzytelnienia(Auth) polacz to w calosc.Jak wroce do domu to najwyzej ci posle jak ja to robie.
Jesli chodzi o role to dziedziczenie w tym przypadku narobi wiecej klopotow niz pozytku wedlug mnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1