template pattern vs strategy pattern

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Full Stack .NET Developer

Dit ga je doen Als developer nieuwe gave features ontwikkelen; Werken met technieken als C#, Angular 12 en Javascript,; Maken van technische keuzes en beslissingen over de architectuur; Junior collega's coachen; Initiatief nemen voor nieuwe technische mogelijkheden; Je bent een belangrijke schakel - en vindt het leuk - om te schakelen met de business. Hier ga je werken In een team van 7 professionals ben je als Full Stack .NET Developer verantwoordelijk voor het ontwikkelen van applicaties voor het grootste inhouse product: een applicatie voor alles omtrent hypotheken. De programmeertaal die je hierbij beheerst is C#. Wil je van meerwaarde

Bekijk vacature »

SQL database developer

Functie omschrijving Voor een softwarebedrijf gespecialiseerd in het ontwikkelen van logistieke software in omgeving Tilburg zijn wij op zoek naar een ervaren SQL database developer. Je gaat werken aan uitdagende, complexe projecten. Iedere klant/project betekent maatwerk in de database. Jouw werkzaamheden zullen er als volgt uit zien: Je bent verantwoordelijk voor de gehele ontwikkelstraat. Van architectuur tot ontwikkeling Je gaat je bezig houden met het ontwerpen en ontwikkelen van MS SQL server databases. Je gebruikt hiervoor T-SQL als programmeer laag. Je begeleidt als lead developer de projecten bij klanten van A – Z. Je sluit aan bij meetings met klanten,

Bekijk vacature »

Software Ontwikkelaar PHP

Functie omschrijving Full Stack Software Ontwikkelaar gezocht! Voor een bedrijf in de regio van Ermelo zijn wij op zoek naar een Software Ontwikkelaar die gaat bijdragen aan het door ontwikkelen, onderhouden en optimaliseren van SaaS applicatie van dit bedrijf. Hierbij ga jij voor- en samenwerken met de klanten van de organisatie, het is hierbij dus van groot belang dat je communicatief vaardig bent en dat je beschikt over beheersing van zowel de Nederlandse als Engelse taal. Bedrijfsprofiel Waar ga je werken? Altijd al in een echt familiebedrijf willen werken? Dan is dit je kans! Het bedrijf waar je komt te

Bekijk vacature »

Functioneel Applicatiebeheerder

Wij van CNB zijn op zoek naar een leergierige Functioneel Applicatiebeheerder CNB is de grootste dienstverlener in de markt van bloembollen en vaste planten. In deze markt verricht CNB de volgende diensten: bemiddeling, veilen en het koelen en prepareren van bloembollen. Vanuit ons hoofdkantoor in Lisse werken bijna 100 collega’s dag in dag uit aan de bemiddeling van bloembollen. In Bovenkarspel vindt het koelen en prepareren van de bloembollen plaats. Wij zijn op zoek naar een enthousiaste Functioneel Applicatiebeheerder die naast een applicatie, ook sfeer kan bouwen! Jij: Vindt het leuk om binnen een klein IT-team aan de slag te

Bekijk vacature »

Medior/Senior Front-end Developers gezocht (Utrech

Functie Het team bestaat uit 10+ gespecialiseerde (veel senior) front-end ontwikkelaars en ontwerpers die werken aan projecten voor klanten van verschillende groottes (kan twee jaar bezig zijn met 1 klant). Je helpt klanten met ingewikkelde front-end vraagstukken, hierbij kun je denken aan: UX/UI design, CI/CD, architectuur en integratie met back-end systemen. De werkzaamheden verricht je op locatie bij de klant, dit is vaak in de Randstad. De organisatiestructuur is plat en er heerst een informele sfeer, zo kun je met vragen dus terecht bij de directie. Er wordt veel nadruk gelegd op het bevorderen van persoonlijke ontwikkeling door middel van

Bekijk vacature »

.NET Developer

Dit ga je doen Binnen het team bouw je aan een applicatie met andere .Net Developers, testers een Product Owner en een Business Analyst. Met het team wordt de backlog besproken. In overleg claim jij jouw deel en zorgt ervoor dat onderhoud en innovatie wordt gerealiseerd. Het project dat momenteel draait is het opgraden van de omgeving. Doorontwikkelen van de huidige applicatie; Overleggen met teamleden om de backlog te verdelen; Onderhouden van de huidige omgeving; Sparren met de business en het ophalen van nieuwe requirements. Hier ga je werken De organisatie is een van de grootste landelijke aanbieder van diverse

Bekijk vacature »

Senior Fullstack Developer (GOLang, TypeScript)

Bedrijfsomschrijving Our client is one of the large worldwide accounting firms. Functieomschrijving We are looking for a senior (all-round) developer (Project On Demand / Tax Technology) Uses as much as possible technology in support of the development process: Git, Jenkins, Docker, npm, skaffold, helm, etc. We are looking for a real hands-on developer; ie not a team lead or other managerial-style role; Acts with integrity both internally and externally and takes personal responsibility in this respect; Curious about the developments within their field and driven to make a difference with the team; Able to empathize with colleagues and stakeholders and

Bekijk vacature »

Frontend Developer - Leeuwarden

Frontend Developer – Leeuwarden Als Frontend Developer bouw jij mee aan het onderwijs van de toekomst! In een scrum team werken met jonge en enthousiaste collega’s, moderne technieken, ruimte voor eigen ontwikkeling en op een proactieve wijze kunnen meewerken aan innovatie binnen het onderwijs. Magister is het state-of-the-art softwarepakket dat scholen in het voortgezet onderwijs op alle fronten ontzorgt. Van leerlingenadministratie tot het ondersteunen van individuele leerlijnen, van toegang tot digitaal lesmateriaal tot het plannen van het lesrooster. In de Magister app bedient Magister ruim 2,5 miljoen gebruikers waarvan, dagelijks meer dan 600.000 unieke. Hiermee is Magister de absolute marktleider

Bekijk vacature »

(Junior) PHP Ontwikkelaar bij een retail bedrijf i

Bedrijfsomschrijving Ben jij een ervaren PHP ontwikkelaar met een passie voor retail en ICT? Wil jij werken in een team dat zich bezighoudt met het ontwikkelen van uitdagende applicaties voor een groot retailbedrijf in Delft? Dan zijn zij op zoek naar jou! Functieomschrijving Als PHP Ontwikkelaar werk je in een team aan de ontwikkeling van applicaties die door de gehele organisatie worden gebruikt. Je bent verantwoordelijk voor het ontwikkelen, testen en implementeren van deze applicaties. Je werkt hierbij nauw samen met andere ontwikkelaars, projectmanagers en stakeholders binnen de organisatie. Je taken bestaan onder andere uit: Ontwikkelen van nieuwe functionaliteiten en

Bekijk vacature »

Fasttrack learning & development voor Java dev

Wat je gaat doen: Wij zoeken enthousiaste en ambitieuze junior en medior ontwikkelaars die toe zijn aan de volgende stap in hun carrière. Wij helpen je op je pad naar senior ontwikkelaar door ons fasttrack learning en development programma. Na een kort en intensief programma ga jij aan de slag bij klanten van DPA. Daarnaast krijg je veel ruimte om je te ontwikkelen als persoon en als specialist. De eerste maand gaan we aan de slag om je certificeringen te behalen waaronder OCP (Oracle Certified Professional). Daarnaast nemen we een deepdive in Spring Boot. Ook laten we je kennismaken met

Bekijk vacature »

Senior developer (PHP en VB.NET)

Functie De development afdeling bestaat uit 2 teams. Het productteam (10 developers) is verantwoordelijk voor verschillende applicaties met als doel om zoveel mogelijk te automatiseren en uit te werken tot standaard software. Met diverse Solutions Architecten en ervaren developers denken ze voortdurend mee met hun klanten en bouwen ze de basis van het uiteindelijke maatwerk dat wordt geleverd. Hiernaast hebben ze een maatwerk/projectteam. Dit team bestaat momenteel uit 8 developers (junior tot senior) en is verantwoordelijk voor het maatwerk in hun klantprojecten. Momenteel zijn ze op zoek naar een senior developer die aan de slag gaat in het productteam. Hierin

Bekijk vacature »

Traineeship Full Stack .NET Developer

Dit ga je doen Start op 7 augustus 2023 bij de Experis Academy en ontwikkel jezelf tot een gewilde Full Stack .NET Developer. Maar hoe ziet het traineeship eruit en wat kun je verwachten? Periode 1 De eerste 3 maanden volg je fulltime, vanuit huis, een op maat gemaakte training in teamverband. Je leert belangrijke theorie en krijgt kennis van de benodigde vaardigheden en competenties die nodig zijn om de IT-arbeidsmarkt te betreden. Zowel zelfstandig als in teamverband voer je praktijkopdrachten op het gebied van front- en backend development uit. Wat er per week op het programma staat kun je

Bekijk vacature »

Dynamische Oracle/APEX Ontwikkelaar in de logistie

Bedrijfsomschrijving De organisatie in de regio Rotterdam is gespecialiseerd in het ontwikkelen van moderne webbased software voor de ERP branche. In totaal is er 20FTE aan specialisten actief binnen de organisatie. De ICT afdeling bestaat momenteel uit 15FTE. Ze groeien ontzettend hard en daarom zoeken zij een Oracle/APEX Developer die het reeds sterke team nog sterker komt maken. Hier werken ze op projectbasis voor verschillende grote organisaties in de logistieke sector. Het is een informele organisatie waarbinnen een fijne werksfeer heerst. Zoals aangegeven willen ze het team nog sterker maken en daarvoor zoeken ze bij voorkeur medior of senior Oracle/APEX

Bekijk vacature »

Senior PHP developer

Functie Jouw werkzaamheden zullen grotendeels bestaan uit het in teamverband ontwerpen, vernieuwen en door ontwikkelen van het systeem. Het is echt back-end werk (bijvoorbeeld het doorontwikkelen van een API) en dit moet je dan ook liggen. Ze zijn niet persee gebonden aan talen of tools maar gebruiken graag de technieken die het beste aansluiten op de gegeven oplossing. Voor nieuwe (versies van) componenten maken ze veelal gebruik van Go(lang). Bij aanpassingen aan bestaande onderdelen gebeurt dit in PHP en C++. Het team is heel divers, er hangt een relaxte sfeer en ze organiseren regelmatig leuke music nights, game nights e.d.

Bekijk vacature »

Traineeship Full Stack Java developer

Dit ga je doen Start jij op 7 augustus bij de Experis Academy dan kickstart jij jouw IT-carrière! We leiden je op tot een gewilde Full Stack Java Developer met alle kennis en vaardigheden die nodig zijn om de arbeidsmarkt te betreden. Wat kun je verwachten, hoe zit een dag in het leven van een Trainee eruit? Periode 1 Als Full Stack Java Developer Trainee volg je vanuit huis een op maat gemaakte onlinetraining die in het Engels wordt gegeven. De tijd die je kwijt bent aan het volgen van de training kun je vergelijken met een fulltime werkweek. In

Bekijk vacature »

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

24/02/2014 08:21:39
Quote Anchor link
Hallo,

Gisteren wees Wouter mij hier op het Strategy pattern. Ik gebruik dit zelf nooit, dus ik ben er wat over gaan lezen. Zelf blijk ik vaak het template pattern te gebruiken. Nu vraag ik me af wanneer je wat gebruikt. Ik vind ze heel erg op elkaar lijken namelijk. Ik heb op Google gezocht, en blijkbaar hebben veel mensen dezelfde vraag gesteld, maar er komen zeer veel verschillende antwoorden op.

Ik heb zelf een abstracte autoloader class waarvan de loadClass method abstract is. De child class extend de abstracte class en moet deze loadClass method dan zelf invullen. Is dat correct? Of moet je hier ook een strategy pattern gebruiken?
Gewijzigd op 24/02/2014 08:22:43 door Ozzie PHP
 
PHP hulp

PHP hulp

27/11/2024 19:01:42
 
Ward van der Put
Moderator

Ward van der Put

24/02/2014 09:21:56
Quote Anchor link
Met het strategy pattern kun je "at runtime" verschillende algoritmen inzetten. Met het template method pattern definieer je één algoritme waarvan onderdelen worden gedelegeerd aan subklassen.

>> Ik heb zelf een abstracte autoloader class waarvan de loadClass method abstract is. De child class extend de abstracte class en moet deze loadClass method dan zelf invullen.

Laten we aannemen dat je hier goede redenen hebt om een abstracte klasse te gebruiken in plaats van een interface... Bepaalde delen van het autoloader-algoritme staan dan al in de abstracte klasse en je gebruikt afgeleide klassen om andere delen van het algoritme in te laten vullen. Dat klinkt als een template method pattern.

Als je namespaces en de autoloader-functionaliteit van PHP 5.3+ gebruikt, is er geen reden om "at runtime" met een strategy pattern compleet andere autoloading-algoritmen te laden.
Gewijzigd op 24/02/2014 09:23:51 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

24/02/2014 09:29:04
Quote Anchor link
Ah oké, dankjewel Ward. Dan heb ik dat met die autoloader in ieder geval goed gedaan.

Ik vind het lastig om te bepalen wanneer ik wat moet gebruiken. Stel je hebt verschillende typen voertuigen, dan zou ik zelf gelijk denken aan een abstracte Vehicle class, en een child "car" en "bike" class. Echter, Wouter wees me er gisteren op dat het dan beter is om het Strategy pattern te gebruiken.

Wouter zei ook dat het beter is om 1 User class te hebben, waarin je verschillende rollen aan een User toekent, terwijl ik toch ook vaak heb gezien dat er gebruik wordt gemaakt van een "default" user class, die dan ge-extend wordt door child classes.

Zelf zou ik bijv. eerder denken aan een "class Admin extends User", maar Wouter zegt dat dit niet klopt, omdat we allemaal Users zijn, en dat er dus geen verschillende typen users zijn. Hij zou dus zoiets doen: $admin = new User(); $admin->setRole('admin'). Hoe kijk jij daar tegenaan?
Gewijzigd op 24/02/2014 09:31:00 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

24/02/2014 09:58:27
Quote Anchor link
Er is hier geen beste oplossing. Bij softwarearchitectuur moet je in de eerste plaats uitgaan van wat je wilt kunnen bouwen. Daarom is er nogal een verschil tussen een generalistisch framework waarmee je alles kunt bouwen of een meer specialistsch platform dat is bedoeld voor afgebakende toepassingen.

Bij webapplicaties is de front-end vaak een geheel andere applicatie dan de back-end. Een admin bestaat niet in een front-end, alleen in de back-end. Het zijn twee compleet verschillende typen users voor twee gescheiden applicaties. Ik zou dus niet eens zeggen dat een admin een user met een speciale rol is; het is geheel andere user.

Je moet ergens beginnen. En je kunt het niet té abstract modelleren, anders krijg je zo'n taxonomie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
class Animal
  class Chordate extends Animal
    class Tetrapode extends Chordate
      class Mammaliaform extends Tetrapode
        class Mammal extends Mammaliaform
          class Human extends Mammal
            class User extends Human
Gewijzigd op 24/02/2014 09:59:43 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

24/02/2014 10:05:24
Quote Anchor link
Haha, interessant Ward. Dat zijn dus ook dingen waar ik over loop na te denken.

>> Ik zou dus niet eens zeggen dat een admin een user met een speciale rol is; het is geheel andere user.

Maar valt een admin in jouw optiek dan wel onder de categorie users? Ik zie zelf een user als een gebruiker van het systeem. Een admin zie ik dan als een ander type user, namelijk een user die toegang heeft tot de back-end en daar bepaalde dingen mag doen. Maar ik zie het wel als een user. Dus ik zou dan dit doen:

class Admin extends User

Is dat hetzelfde als wat jij bedoelt?

>> Je moet ergens beginnen. En je kunt het niet té abstract modelleren, anders krijg je zo'n taxonomie:

Hehe :)
 
Wouter J

Wouter J

24/02/2014 10:05:53
Quote Anchor link
Ik denk zeker wel dat je bijv. in deze site niet met aparte klassen kunt werken voor verschillende rechten. De een heeft namelijk rechten van een normaal lid, de ander mag nieuwsberichten modereren, weer een ander tutorials en scripts, sommige het forum, andere mogen het forum én de tutorials modereren, andere weer alleen de boekensectie. Als laatst heb je nog beheerders die dit allemaal mogen + nog andere beheer functies en dan heb je nog super beheerders die praktisch alles kunnen.
Wil je voor elke mogelijke combinatie een nieuwe user-child klasse maken?
 
Ward van der Put
Moderator

Ward van der Put

24/02/2014 10:16:07
Quote Anchor link
Eens, Wouter, maar daarom ook zou ik een forum anders bouwen dan bijvoorbeeld een webwinkel. Wil je daarentegen een framework bouwen dat beide én meer kan, dan los je dat anders op.

Mijn punt, ook in eerdere topics van afgelopen week, is dat je niet steeds moet proberen met één model alles te doen.
 
Ozzie PHP

Ozzie PHP

24/02/2014 10:17:06
Quote Anchor link
Nee, dat lijkt me te ver gaan, maar ik kan me wel een hiërarchie als deze voorstellen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
- user        (geregistreerd bezoeker/lid van de website, zoals ikzelf)
- admin       (iemand die (bepaalde) zaken mag beheren en toegang heeft tot de back-end, zoals jij)
- super-admin (iemand die alles mag, zoals Bas)

Voor de admins kun je dan voor bepaalde onderdelen rechten toekennen.

Wat vind je van deze gedachte?
 
Ward van der Put
Moderator

Ward van der Put

24/02/2014 10:23:31
Quote Anchor link
Dan zou ik dat liever uitsplitsen in gebruikers + groepen + rechten:

- gebruikers: wie?
- rechten: wat?
- groepen: wie mag wat?

In een datamodel is 'groepen' dan een koppeltabel.
 
Wouter J

Wouter J

24/02/2014 10:23:54
Quote Anchor link
Nu ga je 2 dingen combineren, daar ben ik geen fan van. Want hoe ga je nu kijken of iemand iets mag? Eerst instance checken en daarna nog roles? Waarom die niet meteen overal met roles of instances werken?
 
Ozzie PHP

Ozzie PHP

24/02/2014 10:30:29
Quote Anchor link
>> Dan zou ik dat liever uitsplitsen in gebruikers + groepen + rechten:

Kun je een klein voorbeeldje geven van welke classes je dan zou krijgen? Kun je een concrete invulling aan jouw voorbeeld geven zodat ik beter begrijp wat je bedoelt?

>> Eerst instance checken en daarna nog roles?

Dat is wel waar het op neer komt. Stel, jij mag bijv. een bericht van iemand anders editen. Maar een "normale" gebruiker mag dat niet. Op het moment dat een normale gebruiker is ingelogd, wil ik dus niet eens checken of hij een beheer-functie mag uitvoeren, want dat mag hij sowieso niet omdat hij een gebruiker is en geen admin.

Even een stomme analogie... maar bij iemand die geen rijbewijs heeft, ga je ook niet controleren of hij met een aanhanger mag rijden. Hij heeft geen rijbewijs, dus hij mag sowieso niet rijden.
 
Ward van der Put
Moderator

Ward van der Put

24/02/2014 10:42:51
Quote Anchor link
Bij het inloggen controleer je het "wie" en injecteer je de groep-ID in de user. Bij het starten van een taak controleer je het "wat": welke rechten zijn voor deze taak vereist en heeft de groep-ID die rechten. Een applicatie of module daarbinnen kent geen gebruikers of groepen, alleen rechten.

De analogie van het rijbewijs gaat niet helemaal op, want je mag pas instappen in de auto-applicatie als je autorijden-rechten hebt die zijn toegekend aan de rijbewijsbezitters-groep.
 
Ozzie PHP

Ozzie PHP

24/02/2014 10:50:38
Quote Anchor link
Ward, hoe jij het nu uitlegt lijkt het alsof je gebruik maakt van 1 user (de "wie"). Eerder zei je dat er onderscheid is tussen een user en admin. Ik volg je dus nog niet helemaal. Kun je een stukje pseudo-code geven wellicht?

>> De analogie van het rijbewijs gaat niet helemaal op, want je mag pas instappen in de auto-applicatie als je autorijden-rechten hebt die zijn toegekend aan de rijbewijsbezitters-groep.

Oké, laten we dan zeggen dat de politie aan een jongen van 10 gaat vragen of hij mag rijden met een caravan. Anders gesteld, je gaat aan iemand (een user) iets vragen, waarvoor hij in basis geen bevoegdheid heeft. Ik heb geen vliegbewijs. Het zou dan heel raar zijn als iemand aan mij gaat vragen of ik een vluchtschema in elkaar wil zetten.
 
Wouter J

Wouter J

24/02/2014 11:04:06
Quote Anchor link
Ward zegt al 10x dat het afhangt van de situatie :)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$securityContext
= new SecurityContext(); // de registry voor de security, houdt de current user vast
$authenticator = new RequestAuthentication($request, $securityContext);
$authorizator = new AccessDecissionManager($securityContext);
$authorizator->addVoter(new FormPostVoter()); // voters bepalen of een role iets mag of niet

$user = new AnonymousUser();
$authenticator->authenticate($user);
// $user in context wordt nu als het goed is een AuthenticatedUser, of anders
// nog steeds een AnonymousUser (als hij niet is ingelogd)

// ergens in je code

if ($authorizator->isGranted('EDIT_OWN', $formPost) {
    $formPost->setContent($newContent);

    $formPost->save();
}

?>
 
Ozzie PHP

Ozzie PHP

24/02/2014 11:07:57
Quote Anchor link
>> Ward zegt al 10x dat het afhangt van de situatie :)

Dat wil niet zeggen dat ik begrijp wat hij bedoelt ;)

Jouw voorbeeld kan ik ook niet echt volgen. Aardig ingewikkeld.
 
Ward van der Put
Moderator

Ward van der Put

24/02/2014 11:26:55
Quote Anchor link
In mijn voorbeeld is "admin" geen user maar een groep. Zo kun je, conform jouw eigen opzet, dus ook een extra groep "super-admin" hebben.

- Applicatie "auto" vereist het recht "autorijden".
- Het recht "autorijden" is toegekend aan de groep "rijbewijs B".

Op het moment dat de jongen van 10 instapt in de auto-applicatie, controleer je niet of hij mag autorijden. Je controleert alleen of hij tot een groep behoort die het voor die applicatie vereiste recht "autorijden" heeft. Al in een eerder stadium, bij het inloggen, had de user daarvoor in de groep "rijbewijs B" moeten worden geplaatst — wat niet is gebeurd bij deze jongen van 10, want die is geen lid van deze groep.

Maar je kunt het dus inderdaad op tig manieren oplossen. Bijvoorbeeld door lidmaatschap van de groep "admin" via de configuratie verplicht te stellen voor alle applicaties in de HTTP-route /admin/.
 
Ozzie PHP

Ozzie PHP

24/02/2014 11:37:48
Quote Anchor link
Ah, kijk... nu snap ik wat je bedoelt. Je bedoelt dus dat admin geen user is, maar een groep, en binnen die groep heb je dan weer rechten om bijv. een bericht te editen, verwijderen enz. Correct tot nu toe?

En iemand met de groep "admin" wordt dus in de back-end toegelaten, en binnen de back-end wordt dan weer gekeken of hij de juiste rol heeft. Klopt het nog wat ik tot nu toe zeg?

En stel nu dat je een groep "admin" hebt en een groep "super-admin" (waarbij deze laatste alles mag) en je wilt ergens controleren of een user een bericht mag aanpassen. Krijg je dan zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($user->getGroup() == 'super_admin' || ($user->getGroup() == 'admin' && $user->hasRight('edit'))) {
  // bericht aanpassen
}
?>

Of kan zo'n controle ook efficiënter?
Gewijzigd op 24/02/2014 11:37:59 door Ozzie PHP
 
Wouter J

Wouter J

24/02/2014 11:58:51
Quote Anchor link
Zo'n controller zou ik dus laten uitvoeren in een andere klasse (in mijn voorbeeld de AccessDecisionManager). Deze heeft een heleboel voters die kijken of het user object mag wat je wil dat het mag. Die voeren dus de check uit, het enige wat jij dan nog hoeft te doen is de AccessDecisionManager aanroepen om de check uit te voeren.
Hierdoor kun je je voters ook heel snel aanpassen om van de ene methode (rechten door extenden) naar de andere (rechten door roles/groups) te gaan.
 
Ozzie PHP

Ozzie PHP

24/02/2014 12:05:07
Quote Anchor link
Hmmm.. ik snap niet echt hoe dat werkt... gaat ff boven m'n pet geloof ik :-/

Maar als ik je enigszins begrijp, wordt er op het punt waar je (in dit voorbeeld) het bericht kunt editen slechts 1 controle uitgevoerd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($authorizator->isGranted('EDIT_OWN')) {
  // bericht aanpassen
}
?>

En die authorizator class, die kijkt dan weer of de user tot de super-admin groep behoort, of indien dit niet het geval is, hij de juiste rechten, in dit geval 'EDIT_OWN', heeft. Zoiets bedoel je?
 
Wouter J

Wouter J

24/02/2014 13:42:02
Quote Anchor link
>> En die authorizator class, die kijkt dan weer of de user tot de super-admin groep behoort, of indien dit niet het geval is, hij de juiste rechten, in dit geval 'EDIT_OWN', heeft. Zoiets bedoel je?

Niet helemaal. Wat de authorizator#isGranted doet is dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
public function isGranted($token, $object = null) {
    foreach ($this->securityVoters as $voter) {
        if (!$voter->accepts($token, $object)) {
            continue;
        }


        if (false === $voter->vote($token, $this->currentUser, $object)) {
            return false;
        }
    }


    return true;
}

?>


Een voorbeeld van een Voter:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
interface Voter
{
    /**
     * Checks if it can handle the requested token.
     *
     * @param string      $token  The requested token
     * @param null|object $object The current object
     *
     * @return boolean
     */

    public function accepts($token, $object = null);

    /**
     * Checks if it grants access.
     *
     * @param string      $token  The requested token
     * @param User        $user   The current user
     * @param null|object $object The current object
     *
     * @return boolean
     */

    public function vote($token, User $user, $object = null);
}


class ForumPostVoter implements Voter
{
    /**
     * {@inheritDoc}
     */

    public function accepts($token, $object = null)
    {

        return $object instanceof Post;
    }


    /**
     * {@inheritDoc}
     */

    public function vote($token, User $user, $object = null)
    {

        switch ($token) {
            case
'DELETE':
                // als de user de DELETE_POSTS role heeft mag hij forum posts verwijderen
                return $user->getRoles()->has('DELETE_POSTS');
            case
'EDIT':
                // als de post minder dan 7 dagen oud is en de user is gelijk aan de schrijver
                // óf de user heeft de EDIT_POSTS role mag de user de post bewerken

                return ($object->publishTime() > strtotime('7 days ago')
                           &&
$object->getAuthor() === $user)
                       ||
$user->getRoles()->has('EDIT_POSTS');
            case
'CREATE':
                // als de user is ingelogd mag hij berichten bewerken
                return $user->getRoles()->has('CREATE_POSTS');
        }
    }
}

?>


In gebruik:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

if ($authorizator->isGranted('DELETE', $forumPost)) {
    // ja, hij mag de forum post verwijderen!
    $forumPost->delete();
}
else {
    // nee, hij mag het niet
    throw new InvalidActionException('Je hebt niet genoeg rechten om een bericht te verwijderen');
}

?>
 
Ozzie PHP

Ozzie PHP

24/02/2014 18:02:38
Quote Anchor link
Pfff, pretty ingewikkeld :)
Maar ik snap (enigszins) het principe... met de nadruk op enigszins :)
Waar staat voter eigenlijk voor? Het heeft toch niks met stemmen te maken?
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.