Sorry voor de misschien wat algemene topictitel. Ik heb net een nieuw rechtensysteem geimplementeerd op mijn site, maar ik sta een beetje voor een dilemma.
Als voorbeeld een poll. In mijn rechtensysteem is een recht "vote" waarmee ik kan bepalen of je op polls mag stemmen. Nu dacht ik in mijn poll class gewoon te zetten:
Het probleem is alleen, dat ik natuurlijk ook moet checken of iemand all gestemd heeft, maar waar leg ik nu de verantwoordelijkheid om dat ook te controleren?
Optie 1:
Afvangen binnen de hasRight() functie.
Heeft als nadeel dat je veel uitzonderingen in je hasRight functie krijgt, en dat die functie dus in sommige gevallen erg groot en/of onleesbaar kan worden.
Optie 2: Aparte functies voor elke action.
Heeft als nadeel dat het rechtensysteem wat minder flexibel word, omdat je voor elk mogelijk recht een aparte functie moet maken.
Optie 3: Buiten de classes laten.
Heeft als nadeel dat je veel dezelfde checks krijgt en een wijziging op meerder plaatsen moet aanpassen
Alledrie de opties gaan natuurlijk werken, maar wat is de meest nette/onderhoudbare optie? Of zou je het misschien helemaal anders doen? Ik ben benieuwd naar jullie input
Als voorbeeld een poll. In mijn rechtensysteem is een recht "vote" waarmee ik kan bepalen of je op polls mag stemmen. Nu dacht ik in mijn poll class gewoon te zetten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
| class poll{ public function hasRight($action){ //Hier word binnen het rechtensysteem gecheckt of je mag stemmen } } $poll = new poll(1); if(!$poll->hasRight('vote')){ error('U mag niet stemmen.'); } |
Het probleem is alleen, dat ik natuurlijk ook moet checken of iemand all gestemd heeft, maar waar leg ik nu de verantwoordelijkheid om dat ook te controleren?
Optie 1:
Afvangen binnen de hasRight() functie.
Heeft als nadeel dat je veel uitzonderingen in je hasRight functie krijgt, en dat die functie dus in sommige gevallen erg groot en/of onleesbaar kan worden.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class poll{ public function hasRight($action){ if($action == 'vote'){ if($this->hasVoted()){ return false; } //Hier word binnen het rechtensysteem gecheckt of je mag stemmen } public function hasVoted(){ //Hier word gecontroleerd of de persoon al gestemd heeft } } $poll = new poll(1); if(!$poll->hasRight('vote')){ error('U mag niet stemmen.'); } |
Optie 2: Aparte functies voor elke action.
Heeft als nadeel dat het rechtensysteem wat minder flexibel word, omdat je voor elk mogelijk recht een aparte functie moet maken.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| class poll{ public function canVote(){ if($this->hasVoted()){ return false; } //Hier word binnen het rechtensysteem gecheckt of je mag stemmen } public function canEdit(){ //Hier word binnen het rechtensysteem gecontroleerd of je polls mag wijzigen } public function canDelete(){ //Hier word binnen het rechtensysteem gecontroleerd of je polls mag verwijderen } public function hasVoted(){ //Hier word gecontroleerd of de persoon al gestemd heeft } } $poll = new poll(1); if(!$poll->canVote()){ error('U mag niet stemmen.'); } |
Optie 3: Buiten de classes laten.
Heeft als nadeel dat je veel dezelfde checks krijgt en een wijziging op meerder plaatsen moet aanpassen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class poll{ public function hasRight($action){ //Hier word binnen het rechtensysteem gecheckt of je mag stemmen } public function hasVoted(){ //Hier word gecontroleerd of de persoon al gestemd heeft } } $poll = new poll(1); if(!$poll->hasRight('vote') || $poll->hasVoted()){ error('U mag niet stemmen.'); } |
Alledrie de opties gaan natuurlijk werken, maar wat is de meest nette/onderhoudbare optie? Of zou je het misschien helemaal anders doen? Ik ben benieuwd naar jullie input
What do you mean I have no life? I am a gamer, I got millions!