template pattern vs strategy pattern

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Developer

Functie omschrijving Gaat jouw hart sneller kloppen van software developen in C#.NET? Voor een softwarebedrijf in regio Den Bosch zijn wij op zoek naar een C# programmeur. Lees snel verder! Wat ga je doen? Je gaat werken met C# en ASP.NET MVC Framework om onder meer webapplicaties, webshops en websites te ontwikkelen. Je optimaliseert de bestaande software en helpt mee aan het automatiseren van bedrijfsprocessen. Je gaat samen met je collega's de juiste oplossing op basis van de wensen van de klanten uitwerken tot een mooi product. Bedrijfsprofiel Het ontwikkelen van softwareoplossingen en kantoorautomatiseringen is waar dit bedrijf voor staat.

Bekijk vacature »

Senior Lead Front End Developer

Functieomschrijving Voor Stichting Waternet zijn wij op zoek naar een senior Lead Front End Developer. Binnen het DevOps team Online zijn we op zoek naar een Senior Lead Front End developer met kennis van toegankelijkheid. Deze developer zal zich bezighouden met development van webpaginas die in verbinding staan met systemen uit het back office. Taken Ontwerpen, ontwikkelen, implementeren, documenteren en beheren van webapplicaties in een Azure-omgeving Debuggen, analyseren en oplossen van problemen in de OTAPomgevingen Je participeert in het DevOpsTeam Online voor het verder uitwerken en implementeren van gebruikerswensen Je bent betrokken bij toegankelijkheid audits en het implementeren van WCAG

Bekijk vacature »

SQL Database Ontwikkelaar

Functie omschrijving Kan jij goed overweg met complexe algoritmes en het schrijven van procedures in T-SQL? Heb jij al wat ervaring opgedaan met SQL en vind je het tijd voor de volgende stap? Lees dan snel verder! Dit software bedrijf, gespecialiseerd in de ontwikkeling van logistieke software, is op zoek naar een ervaren SQL database developer. Jouw werkzaamheden zullen onder andere bestaan uit: Je houdt je bezig met het ontwerp en de ontwikkeling van MS SQL server databases, dit doe je met T-SQL als programmeer laag. De begeleiding van projecten van A tot Z, je zult aansluiten bij meetings met

Bekijk vacature »

.NET developer

Functie Jij begint als .NET ontwikkelaar in een team met 10 andere Software Engineers. De werkzaamheden zijn afwisselend, zo kan het dat jij bezig bent met volledig nieuwe features of het door ontwikkelen van bestaande sites of shops. Wij ontwikkelen web applicaties, maar ook mobiele applicaties. Daarnaast bijt jij je soms ook van in externe koppelingen met systemen zoals een ERP. Als team is er een duidelijke focus m.b.t. het waarborgen van de performance en snelheid van webshops. Ook zijn wij expert op het gebied van configuratoren. Kortom enorm veel afwisselende werkzaamheden! Ook jouw werkplek kan afwisselend zijn. Soms heb

Bekijk vacature »

Remote - Front-end Angular developer

Functie The IT team currently consists of the IT Manager, 2 back-end developers, 1 full-stack developer, 1 designer, and a DevOps engineer. They are currently looking for an experienced Front-end developer who will work autonomously and in a disciplined manner, being the only developer working on their Front-end applications at the start. They do have the ambition to find a second developer soon, who you will then be able to supervise. You will be working on the further development of their existing UI in Angular. But also developing a mobile app. They place great value on User Experience and opt

Bekijk vacature »

.NET developer

Functie Als .NET developer wordt jij onderdeel van ons ICT team. In dit multidisciplinaire team ben jij samen met onze senior .NET ontwikkelaar en medior .NET ontwikkelaar verantwoordelijk voor ons ERP systeem. In dit systeem (Navision) ga jij leren ontwikkelen. Wij bieden jou dan ook een gedegen opleiding aan, samen met de ondersteuning van onze Senior .NET developer. Daarnaast ga jij aan de slag met ons portaal geschreven in Sharepoint. Verder ben jij verantwoordelijk voor EDI verkeer en het ontwikkelen binnen het ERP systeem en andere toepassingen en rapportages. Van jou wordt verwacht dat jij het proces goed leert kennen

Bekijk vacature »

Front-end (Angular) developer - remote werken

Functie Als Front-end (Angular) developer ga je aan de slag met het uitbouwen van hun webapplicatie, als één van de front-end experts ga je samen met collega’s in een devops team werken aan een nieuw front-end voor hun calculatie oplossing. Binnen de calculatiesoftware kunnen meerdere professionals tegelijk samenwerken, 3D calculaties uitvoeren en ook inzien met de benodigde specifieke details. Deze software wordt veel ingezet om projectbeschrijvingen en kosten in kaart te brengen, en tijdens de uitvoering te bewaken. Maar hiernaast liggen er in de toekomst veel meer plannen op het gebied van front-end in de andere applicaties. Genoeg te doen

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 »

.NET Developer

Dit ga je doen (Door)Ontwikkelen van het applicatielandschap; (Door)Ontwikkelen van microservices; Bouwen van nieuwe functionaliteiten; Verbeteringen aandragen voor het applicatielandschap; Sparren met de business. Hier ga je werken De organisatie is werkzaam in de financiële dienstverlening met meer dan 200 medewerkers en meer dan 250.000 eindgebruikers is het een van de grotere binnen haar branche. Je komt te werken in een team waarmee je verantwoordelijk bent voor het ontwikkelen en onderhouden van de financiële applicaties binnen de organisatie, denk hierbij aan het bouwen en onderhouden van portalen. Als .net developer ga jij het development team ondersteunen met de transitie naar

Bekijk vacature »

Cobol Developer

Dit ga je doen Als Cobol Ontwikkelaar zal je gaan meebouwen aan een onderdeel van het backend systeem waarbij je het functionele ontwerp vertaald naar een technische oplossing die geïntegreerd kan worden in de huidige omgeving. Je zorgt ervoor dat de bedrijfsprocessen op een efficiënte manier worden uitgevoerd en werkt proactief aan het verbeteren hiervan. Samen met jouw collega’s reviewen jullie elkaars code en test je je eigen code. Je werkt nauw samen met andere ontwikkelaars, testers en functioneel ontwerpers. Taken pakket: Beheren en doorontwikkelen van de bestaande omgeving; Vertalen van een functionele vragen naar een technische oplossing; Doorvoeren van

Bekijk vacature »

Front-end Developer

Front-end 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 »

Backend Developer Scrummaster .NET

Samengevat: Deze werkgever is een ambitieus internetbedrijf met een passie voor digitale communicatie. Ben jij geschikt als Backend Developer? Heb je ervaring met .NET platform? Vaste baan: Backend Developer / SCRUM Master Scrum HBO WO €3.800 - €6.000 Deze werkgever is een innovatief bedrijf met enthousiaste mensen die jarenlang ervaring hebben met het ontwikkelen internet- en intranetoplossingen. Wij houden van korte lijnen en open en eerlijke communicatie. Wij zetten graag onze jarenlange ervaring in om perfect werkende oplossingen te ontwikkelen. Wij ondersteunen dienstverlenende organisaties bij het ontwikkelen en realiseren van een effectief, adaptief communicatieplatform. Je ontwikkelt met ons de meest

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 »

Software Developer

Dit ga je doen Je bent verantwoordelijk voor de warehouse applicatie die een integratie heeft met de PLC laag; Je ontwikkelt in C#/.Net; Je bent verantwoordelijk voor het ontwikkelen van interfaces en het visualiseren van componenten; Je denkt mee over het design voor business oplossingen; Je bent verantwoordelijk voor het testen van de gebouwde oplossing. Hier ga je werken Voor een internationale organisatie in de transport zijn wij momenteel op zoek naar een Software Developer. Ze zijn wereldwijd de grootste speler en lopen voorop met het automatiseren van alle processen van de warehouses. Op dit moment wordt er nog gebruik

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

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

23/11/2024 23:36:09
 
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.