template pattern vs strategy pattern

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Cloud Developer

Cloud Developers opgelet! Bij Luminis zijn ze opzoek naar jou. Lees de vacature en solliciteer direct. Luminis is een software- en technologiebedrijf met meerdere vestigingen. Vanuit deze vestigingen werken 200 professionals aan technisch hoogwaardige oplossingen voor klanten zoals KLM, Nike en Bol.com. Ook ontwikkelt Luminis eigen oplossingen op het gebied van cloud, Internet of Things, data intelligence, e-sports en e-learning. Luminis onderscheidt zich door aantoonbaar voorop te lopen in technologie en innovatie. Luminis heeft drie kernpunten die verankerd zitten in alles wat we doen: het omarmen van nieuwe technologie, meesterschap en kennis delen. Functiebeschrijving First things first! Het is belangrijk

Bekijk vacature »

Senior PHP developer/ Software Architect

Functie Momenteel zijn ze op zoek naar een ervaren PHP developer die zichzelf graag bezighoudt met zaken als architectuur en de algehele verbetering van structuren en standaarden. Het is eigenlijk meer operationeel als uitvoerend omdat je bezig gaat met zaken als het verder uitrollen en verbeteren van testautomatisering, codereviews, tickets en de doorloop hiervan en architectuurkeuzes. Mocht je hiernaast ook wat DevOps kennis meenemen is dit mooi meegenomen! Vanwege het kleine team maar de wereldwijde impact die zij leveren is er veel focus op kwaliteit. In deze functie werk je aan één van hun belangrijkste applicaties. Hierin werk je nauw

Bekijk vacature »

Full stack .NET developer Microsoft 365

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Trainee pega developer

Wil jij een mooie stap maken in jouw carrière? Mooi! Bij De Mandemakers Groep haal je binnen 6 maanden je CSA- en CSSA-certificaten, waarna jij aan de slag kan als Pega-developer in ons IT-team. Achter de schermen zorg jij ervoor dat collega’s efficiënt werken en klanten iedere dag beter geholpen worden. Wil jij daaraan bijdragen? En jouw ICT-skills ontwikkelen? Lees dan snel verder en solliciteer vandaag nog als trainee Pega-developer. Wat ga je doen? Als trainee Pega developer leiden wij je op tot gecertificeerd software developer voor het low-code platform PegaSystems. In de training ben je verantwoordelijk voor een te

Bekijk vacature »

Front-end developer

Functie Jij komt te werken in een team van 5 developers. het product is continue in beweging. Nieuwe en bestaande klanten vragen om vaak nieuwe features. Hierin ben jij zeer belangrijk om te zorgen dat de functionaliteiten goed opgezet worden op technisch vlak. Designs krijg je aangeleverd van een externe partij zodat jij je primair kan focussen op de techniek! Je hebt daarbij alle vrijheid om je eigen creativiteit toe te passen en mee te denken over de gebruikte technieken. Het gezamenlijke doel is een product dat functioneel zeer gebruiksvriendelijk is en het bedrijfsproces van de gebruikers versneld en kwalitatief

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 »

Randstad B.V.- Freelance Senior Fullstack Develope

Startdatum: 01.05.2023 Richttarief: € 75,00 - €85,00 Duur van de opdracht: 1 jaar Uren per week: 40 Werkmodel: Hybride, dinsdag en donderdag aanwezig op kantoor in Diemen en meer wanneer dit nodig is. Functieomschrijving: De ideale kandidaat gaat onderdeel uitmaken van een junior team binnen het foundation domein. Vanuit het foundation domein werkt dit team samen met andere foundation teams en teams uit het online domein (professionals B2B en B2C) voor het bouwen en integreren van HRM functionaliteiten (verlof en benefits) in de persoonlijke portal van Interim Professionals. Er is meer backend werk dan frontend, maar kandidaat moet beiden leuk

Bekijk vacature »

Java developer

Als Java Developer bij Sogeti ben je onderdeel van onze toonaangevende community die bestaat uit ruim 100 gepassioneerde professionals. In teamverband lever je mooie prestaties. Daarmee draag je aan bij de meerwaarde die wij leveren aan onze klanten. Geen werkdag is hetzelfde, je bent voortdurend bezig met het oplossen van allerlei complexe vraagstukken binnen bedrijfskritische systemen. Een voorbeeld hiervan is een cliënt-volgsysteem bij Reclassering Nederland. Andere klanten waar wij onder andere voor werken: KPN, Philips, Nationale-Nederlanden, Kamer van Koophandel, ABN AMRO, Bovemij, Arval en de Politie. Werken bij Sogeti Nieuwe ontwikkelingen volgen we op de voet en delen we binnen de

Bekijk vacature »

C# developer

Functie Als ervaren Software Engineer wordt jij verantwoordelijk voor het bedenken en ontwikkelen van technische (maatwerk) oplossingen voor onze klanten en dit samen met de klant af te stemmen. Jij wordt o.a. verantwoordelijk voor de doorontwikkeling het software pakket welke voor ons enorm belangrijk is. Dit pakket zorgt er namelijk voor dat wij complete productielijnen kunnen aansturen en monitoren. Daarnaast heb jij actief contact met onze hoofdvestiging om het software achter een van onze systemen te verbeteren en te herschrijven. Momenteel zijn onze C# applicaties geschreven met o.a. Winforms. Echter hebben wij de actieve ambitie om dit te gaan herschrijven

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 »

3D BIM Add-on Developer

As a 3D BIM add- on developer at KUBUS, you will develop add-ons (called BCF- Managers) to the leading building information modeling (BIM) programs Revit, Navisworks, Archicad, AutoCAD and Tekla Structures. BCF Managers enable data transfer between BIM software and BIMcollab. You will work on both the front- and the back-end. As a software company, KUBUS is in a unique position. We build our own products that are used by tens of thousands of users worldwide. Our company is just the right size: big enough to make a real impact in the market, but small enough that as an individual

Bekijk vacature »

Senior .NET Ontwikkelaar

In het kort Als Senior .NET ontwikkelaar ga je binnen onze business unit Transport en Logistiek aan de slag met complexe maatwerk software voor bedrijf kritische systemen binnen de technische automatisering. Denk bijvoorbeeld een IoT-oplossing voor de logistieke sector waarbij we van ruim 200.000 machines de telemetrie en events verwerken. We zijn actief in de distributielogistiek, havenlogistiek (denk aan ECT) en productielogistiek. Naast C# en .NET Core maken we ook gebruik van Azure technologie. En als trotse Microsoft Gold Partner leren we graag van en met jou. Wil jij jezelf blijven ontwikkelen binnen de technische automatisering met .NET, dan gaan

Bekijk vacature »

Mendix Ontwikkelaar - Vernieuwen van het applicati

Bedrijfsomschrijving De ontwikkelingen in de transportsector gaan razendsnel. Bij ons kun je een belangrijke rol spelen in deze sector. We streven ernaar om onze klanten te ontzorgen op het gebied van continuïteit en veiligheid met innovatieve producten en diensten. We willen dat onze klanten de veiligste vervoerders van Europa worden. Ons team werkt hard om deze ambitieuze doelstellingen te bereiken en we bieden een motiverende werkomgeving aan. We zijn op zoek naar zelfstarters met een focus op resultaat en beslissingsbevoegdheid. Functieomschrijving Als Mendix ontwikkelaar bij deze organisatie heb je een gevarieerde baan. Het applicatielandschap wordt vernieuwd en de “schade en

Bekijk vacature »

.NET developer

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Java developer

Als Java Developer bij Sogeti ben je onderdeel van onze toonaangevende community die bestaat uit ruim 100 gepassioneerde Java professionals. In teamverband lever je mooie prestaties. Daarmee draag je aan bij de meerwaarde die wij leveren aan onze top-opdrachtgevers. Geen werkdag is hetzelfde! Je bent voortdurend bezig met het oplossen van allerlei complexe vraagstukken binnen bedrijfs kritische systemen voor onze klanten in regio Noordoost zoals DUO, ING, CJIB en Tendernet. Natuurlijk krijg jij de mogelijkheid je verder te certificeren in dit vakgebied. We organiseren regelmatig technische Meetups en doen veel aan kennisdeling. Sogetisten hebben plezier in hun werk en staan

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

29/12/2024 13:27:22
 
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.