MVC Routing

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Front-End React Developer

As a Front-End React Developer you improve the user-experience of our web applications for your colleagues in Coolblue. How do I become a Front-End React Developer at Coolblue? As a Front-End React Developer you are responsible for developing user interface components and implementing them using React.js concepts and workflows. You work with the UX Designer and get energy from coming up with creative solutions and present these within the team. During the day you gather and welcome feedback on your technical and soft skills. Would you like to become a Front-End React Developer at Coolblue? Read below if the job

Bekijk vacature »

Full Stack Developer

Ben jij een kei van een full-stack developer? Heb je ambitie om te groeien en jezelf te ontwikkelen binnen een ambitieus bedrijf? Gaat jouw hart sneller kloppen van transpilers of frameworks zoals Angular, Vue of React? Dan ben jij de persoon die wij zoeken! Voor onze opdrachtgever zijn wij op zoek naar een full-stack developer om onderdeel te zijn van een team dat bestaat uit gedreven developers. Ieders met hun eigen specialiteiten en kennis van de projecten en behoeften vanuit de product owners. We zoeken iemand die met zijn/haar huidige competenties en domeinen dit team wil begeleiden, stimuleren en tevens

Bekijk vacature »

Consultant Low Code Developer

Functie omschrijving Heb jij verstand van datamodellering, NO CODE Platformen en kun jij het aan om projecten te leiden? Ben jij toe aan een nieuwe uitdaging en ben jij HBO afgestudeerd in de richting van IT? Voor een mooie opdrachtgever in omgeving Delft zijn wij op zoek naar een No Code developer die zich bezig gaat houden met het optimaliseren van bedrijfsprocessen bij klanten. Onderdelen functie Je gaat geen code kloppen maar bedenken hoe applicaties eruit moet komen te zien. Je gaat werken met een non code platform, je kunt denken aan Mendix of Betty Blocks. Je bent verantwoordelijk voor

Bekijk vacature »

Low Code Developer voor o.a. overheidsprojecten!

Bedrijfsomschrijving Wil jij ook behoren tot de specialist in Low Code? Dan zou ik zeker aanraden om verder te lezen. Deze organisatie is ooit opgericht door twee studenten en is inmiddels uitgegroeid tot een serieuze werkgever met een groot aanzien op Low Code projecten. De sfeer is echter niet veranderd, er heerst een informele sfeer met een open deuren beleid, en hierin mag de eigen bar natuurlijk niet ontbreken. Momenteel maakt deze organisatie een flinke groei door en hier kan jij natuurlijk niet bij ontbreken. Daarom ben ik op zoek naar Low Code Developers met een degelijke technische achtergrond. Kennis

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 »

Java Full Stack Developer

Java Full Stack developer What makes Cognizant a unique place to work? The combination of rapid growth and an international and innovative environment! This is creating a lot of opportunities for people like YOU — people with an entrepreneurial spirit who want to make a difference in this world. At Cognizant, together with your colleagues from all around the world, you will collaborate on creating solutions for the world's leading companies and help them become more flexible, more innovative and successful. And this is your chance to be part of the success story: we are looking for a (Senior) Java

Bekijk vacature »

.NET developer

Functie Als ervaren .NET ontwikkelaar start jij in één van onze vier scrumteams. Met 30 ontwikkelaars werk jij aan de doorontwikkeling van ons core product. Ook werkt jouw team aan maatwerkoplossingen op aanvraag van de klant en op projectbasis. Wij vinden het erg belangrijk dat onze ontwikkelaars met plezier naar werk gaan. Een deel hiervan ligt uiteraard bij jezelf, als jij ontwikkelen niet leuk vindt, ben jij bij ons echt aan het verkeerde adres. Jouw team bestaat namelijk uit een groep gepassioneerde vakidioten die dit werk doen omdat dit eerst een hobby was! Daarnaast wordt er intern rekening gehouden met

Bekijk vacature »

.NET Developer

Functie omschrijving Ervaren .NET Developer gezocht! Wij zoeken een ervaren .NET developer die aan de slag gaat voor een softwarebedrijf in de regio Rhenen. In deze rol ben jij zowel zelfstandig als in teamverband verantwoordelijk voor het ontwikkelen en verbeteren van bestaande producten. Daarnaast houdt jij je bezig met de nieuwbouw van websites, webapplicaties en mobiele applicaties die zowel intern als extern gebruikt worden. Je werkt hierbij nauw samen met andere developer, productmanagers en product specialisten om mooie producten te creëren. Bedrijfsprofiel Waar kom je te werken? Je komt te werken voor snelgroeiende softwareleverancier en allround dienstverlener. Klanten van deze

Bekijk vacature »

Social Media Specialist

Social Media Specialist locatie: Rotterdam (Zuid Holland) Wij zoeken op korte termijn een nieuwe collega, een social media specialist/ adviseur sociale media (24 uur), voor ons sprankelende team Communicatie van CJG Rijnmond. Onze focus ligt op het informeren en binden van onze in- en externe klanten en stakeholders en het versterken van onze naamsbekendheid en zichtbaarheid. Dat doen we in nauwe samenwerking met elkaar. Over de functie Ons team bestaat uit 7 communicatieprofessionals met ieder een eigen expertise. Als lid van het online team ben je verantwoordelijk voor het ontwikkelen, uitvoeren en analyseren van onze socialemediastrategie. Ook stel je campagnes

Bekijk vacature »

C#.NET ontwikkelaar

Functieomschrijving Voor een gewaardeerde werkgever in regio Tilburg zijn wij op zoek naar een C#.NET ontwikkelaar. Je bent verantwoordelijk voor het ontwikkelen van dashboards, webapplicaties en apps voor de eigen IOT-oplossingen. Samen met een vooruitstrevend team van ontwikkelaars en engineers krijgen jullie de opdracht om de sensoren in de apparatuur te scannen en vervolgens de data om te zetten in belangrijke inzichten voor de klanten. Taken en verantwoordelijkheden: Heb jij ideeën over nieuwe technieken die jullie kunnen implementeren? Hier wordt echt naar je geluisterd en gekeken of jouw idee daadwerkelijk ingezet kan worden; Je gaat aan de slag met de

Bekijk vacature »

Senior Software Developer C++

Vacature details Vakgebied: Software/IT Opleiding: Senior Vacature ID: 13342 Introductie Do you want to work for one of the most innovative companies located in the region of Eindhoven. Currently Due to growth we are looking for a Senior Software Developer. Our client is a high-tech company with international roots and can provide you with a challenging opportunity. Functieomschrijving Responsibilities: Design, develop, and maintain high-quality software applications in C++ Collaborate with other engineers, product managers, and stakeholders to understand requirements and develop solutions Write clean, maintainable, and efficient code Conduct thorough testing and debugging to ensure high-quality software Optimize applications for

Bekijk vacature »

Front-end developer (Vue.js) gezocht!

Functie Als Front-end developer is het jouw doel om efficiënte en effectieve frontend code te ontwerpen, ontwikkelen en onderhouden die goed aansluit bij de functionele behoefte vanuit de klant. Je zorgt voor optimale SEO-resultaten, sitespeed en frontend security. You build it, you run it, you own it! Je maakt deel uit van een DevOps Scrum team en werkt samen met back-end developers, test-engineers, interaction designers en een projectmanager. Er zijn verschillende groepen Scrum teams. Een roadmap team is jouw ‘’thuisbasis’’, daar wordt gewerkt aan doorontwikkeling van bestaande omgevingen voor een aantal klanten. Hiernaast zijn er projectteams waar nieuwe omgevingen worden

Bekijk vacature »

.NET developer

Functie Als .NET developer start jij in een ontwikkelteam met 15 developers en twee testers. Samen zijn jullie verantwoordelijk voor financiële applicaties met meer dan 50.000 gebruikers. Een deel van het team is verantwoordelijk voor de webapplicaties van deze organisatie. Ook zijn er twee app ontwikkelaars werkzaam in het team die zich focussen op de mobiele applicatie. Als .NET ontwikkelaar ga jij aan de slag met de webapplicaties van deze organisatie. Hierbij maak jij o.a. gebruik van C# .NET, ASP.NET, T-SQL, Angular en TypeScript. De nadruk van jouw functie ligt wel op de backend van de applicatie. Wat jouw functie

Bekijk vacature »

Front end developer

Functie Qua type opdrachten is er echt een verscheidenheid aan afnemers, zo werken ze met grote multinationals, maar ook met startups. Zo kom je te werken in een gevarieerde omgeving en kan je ook schakelen tussen verschillende culturen. De projecten variëren van greenfield projecten tot langdurige ontwikkeltrajecten. Hier wordt alleen maar gewerkt met aan front end projecten. Daarom maakt het onze partner niet uit waar jij kennis van hebt, als je maar gedegen kennis hebt van Javascript frameworks, Unit testing en ook bekend bent met de scrum methodiek. Eisen Minimaal 4 jaar relevante werkervaring Kennen en ervaring van Javascript frameworks

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 »

Roy B

Roy B

27/06/2014 19:44:24
Quote Anchor link
Ik ben bezig met het ontwikkelen van een eigen MVC. Via htaccess stuur ik alles door naar mijn index. Mijn index bepaalt vervolgens welke controller moet worden aangeroepen. Stel mijn url is /nieuws/nieuwsitem. In dit geval moet de NewsitemController worden aangeroepen om het nieuwsitem te tonen. Stel mijn URL is /over-ons. Dan moet de ContentController worden aangeroepen en een contentpagina getoond worden. Maar nu mijn vraag.. Hoe weet index welke controller moet worden aangeroepen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
// index.php
$route = explode("/", $_SERVER["REQUEST_URI"]);
 
PHP hulp

PHP hulp

26/12/2024 23:37:49
 
Frank Nietbelangrijk

Frank Nietbelangrijk

27/06/2014 22:02:24
Quote Anchor link
Door bijv. een array (van objecten) aan te maken met routes. Programmeer je in OOP of procedureel?

procedureel:
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
<?php

$routes
= array(
    array(
        'route' => 'nieuws',
        'controller' => 'Newsitem',
        'action' => 'index',  // welke method van de controller-class moet aangeroepen worden?
        'method' => 'GET'     // keuze uit GET en/of POST
    ),
    array(
        'route' => 'over-ons',
        'controller' => 'Content',
        'action' => 'index',
        'method' => 'GET'
    ),
};


?>


In plaats van de routes direct in een array te zetten kun je ook Yaml, XML of JSON gebruiken.
 
Roy B

Roy B

22/11/2014 17:40:21
Quote Anchor link
Frank Nietbelangrijk op 27/06/2014 22:02:24:
Programmeer je in OOP of procedureel?

Ik programmeer in OOP. Heb je daar ook een voorbeeldje van?
 
Dennis WhoCares

Dennis WhoCares

22/11/2014 21:04:10
Quote Anchor link
Zou je niet gewoon controllers maken van je pagina's ? En deze dezelfde naam geven als de URL[0] ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
if(file_exists('controllers/' . $route[0] . '.php')) {
  require('controllers/' . $route[0] . '.php');
  //Controle of de Controller-class bestaat, anders doorsturen naar een 404 ???
  if(class_exists($route[0]))
    $this->controller = new $route[0];
  else
    header('location: 404.php');
} else {
  //Controller file bestaat niet, doorsturen naar een 404 ?
  header('location: 404.php');
}


Ik ben zelf ook nog altijd bezig met MVC te leren hoor.. Misschien heb je hier wat aan.
Gewijzigd op 22/11/2014 21:13:34 door Dennis WhoCares
 
Roy B

Roy B

23/11/2014 00:37:24
Quote Anchor link
Ik gebruik nu het volgende, maar ik ben van mening dat het nog stukke beter kan..

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
<?php
include "includes/config.php";

$route = explode("/", trim(strtolower($_SERVER["REQUEST_URI"]), "/"));

// Homepage
if(isset($route[0]) && $route[0] == "")
{

    $model = new HomeModel();
    $controller = new HomeController($model);
}


// Nieuws
if(isset($route[0]) && $route[0] == "nieuws")
{

    $model = new NewsitemModel();
    $controller = new NewsitemController($model);

    if(isset($route[1]) && $route[1] != "")
    {

        // Nieuws detail
        $controller->getByTitle($route[1]);
    }

    else
    {
        // Nieuws overview
        $controller->getAll();
    }
}

?>
Gewijzigd op 23/11/2014 00:38:42 door Roy B
 
Ward van der Put
Moderator

Ward van der Put

23/11/2014 06:37:15
Quote Anchor link
Het kan mooier door van de route ook een object te maken. En eigenlijk ook van het request. Alles is een object.

Verder laat je de applicatie nu allerlei models en controllers langslopen, maar kun je dat ook overdragen aan een front controller.

Schematisch krijg je dan zoiets:

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
<?php
// HTTP-verzoek
$request = new Request();

// Verzoek centraal opslaan
$registry = new Registry();
$registry->set('request', $request);

// Front controller
$front_controller = new FrontController($registry);

// Het verzoek bepaalt de route
if ($request->hasRoute()) {
    $route = $request->getRoute();
}
else {
    $route = new Route('error/404');
}


// Front controller zet andere controller aan het werk
$front_controller->dispatch($route);
?>


Je steekt daarnaast steeds een model in een controller, bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$model
= new HomeModel();
$controller = new HomeController($model);

$model = new NewsitemModel();
$controller = new NewsitemController($model);
?>


Als elke FooController in jouw architectuur echter een bijbehorend FooModel heeft, kun je ook alleen de controller aanroepen. In MVC wil je liever alleen controllers met andere controllers laten communiceren. Jij hebt echter nu naast die bovenwereld nog een schaduwwereld: je moet parallel steeds alle models instantiëren voordat je überhaupt een controller aan het werk kunt zetten.

Afbeelding
Uit: HMVC: The layered pattern for developing strong client tiers

Verder is dat ook niet efficiënt. De controller bepaalt (bijvoorbeeld op basis van het request) of het model eigenlijk wel nodig is. Sommige models zijn slechts nodig als je een UPDATE of een INSERT wilt uitvoeren. Die models hoef je dus lang niet altijd te laden en te instantiëren.
 
Roy B

Roy B

23/11/2014 15:48:41
Quote Anchor link
Ward van der Put op 23/11/2014 06:37:15:
Je steekt daarnaast steeds een model in een controller

Hoe zou dat beter kunnen dan?
 
Ward van der Put
Moderator

Ward van der Put

23/11/2014 16:13:53
Quote Anchor link
Vuistregel: alleen de controller communiceert met het eigen model.

Alleen de controller weet waar Abraham de mosterd haalt. Dat kan bijvoorbeeld data uit een database zijn, maar diezelfde data kunnen ook uit een bestand komen, uit een cache, uit een cURL-request, enzovoort. Dat moet allemaal voorbij gaan aan andere objecten. Die spreken de controller gewoon aan en krijgen het antwoord dat ze verwachten.

Je hebt die regel nu omgekeerd met een "voorschrift": je instantieert eerst een model en schrijft dat vervolgens voor aan de controller door het te injecteren in de controller.
 
Roy B

Roy B

23/11/2014 16:31:30
Quote Anchor link
Ward van der Put op 23/11/2014 16:13:53:
Vuistregel: alleen de controller communiceert met het eigen model.

Alleen de controller weet waar Abraham de mosterd haalt. Dat kan bijvoorbeeld data uit een database zijn, maar diezelfde data kunnen ook uit een bestand komen, uit een cache, uit een cURL-request, enzovoort. Dat moet allemaal voorbij gaan aan andere objecten. Die spreken de controller gewoon aan en krijgen het antwoord dat ze verwachten.

Je hebt die regel nu omgekeerd met een "voorschrift": je instantieert eerst een model en schrijft dat vervolgens voor aan de controller door het te injecteren in de controller.

Hoe zou ik dat kunnen verbeteren dan?
Misschien een setModel() methode?
 
Ward van der Put
Moderator

Ward van der Put

23/11/2014 16:45:31
Quote Anchor link
Ja, prima oplossing.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/11/2014 17:07:16
Quote Anchor link
Dat is dan het MVC model waarin ik toch een ernstige tekortkoming zie. In Symfony bijvoorbeeld kun je gewoon vanuit de VIEW nog een andere controller aanroepen. Mijn ervaring is dat dat echt heerlijk werkt. Wat ik maar wil zeggen is dat het MVC niet heilig is en dat het mij persoonlijk om gebruiksgemak gaat. @Ward: Ik zie met die layers niet hoe je nu meerdere views in één response kunt verwerken. (Bijv. layer1 -> algemene pagina layout, layer 2 sidebar en layer 3 de specifieke content van de huidige pagina)
 
Ward van der Put
Moderator

Ward van der Put

23/11/2014 17:28:54
Quote Anchor link
Frank, het een sluit het ander niet uit.

Een view kán een controller aanroepen. Die doen dan plaatselijk in hun beperkte context hun eigen ding. Niets mis mee.

Voorbeeld: de view is een widget die een beoordeling in sterren toont. De view roept daarvoor een controller aan die de beoordeling "ergens" uit een model haalt. Maakt niet uit waar: het kan de eigen database zijn, maar ook een cURL-request naar KiyOh of iets dergelijks.

De complicatie is dat je dergelijke dingen moet samensmeden tot één fraaie webpagina. En dan komt het HMVC-model van pas, met meerdere hiërarchisch gestapelde MVC-componenten. Díé componenten moet je koppelen via hun controllers, niet via hun models.
 
Roy B

Roy B

23/11/2014 17:51:54
Quote Anchor link
Ward van der Put op 23/11/2014 16:45:31:
Ja, prima oplossing.

Kun je daar een voorbeeldje van geven?
Misschien zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$controller = new NewsitemController();

$model = new NewsitemModel();
$controller->setModel($model);
Gewijzigd op 23/11/2014 17:52:20 door Roy B
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/11/2014 17:53:47
Quote Anchor link
Oké dus in een HMVC is het wel mogelijk om vanuit de view een andere controller in beweging te brengen. Dat je de controllers met elkaar koppelt dat klinkt wel logisch. Maar nu:

controller A wordt aangeroepen en die roept zijn eigen VIEW aan. Ik neem aan dat de VIEW niet direct output genereert maar eerder een response object vult en dit object dan weer teruggeeft aan de controller?
Daarna roept controller A controller B aan? Deze roept ook weer zijn VIEW aan en deze geeft ook een response object terug? Dan zitten we dus met twee response objecten??
 
Ward van der Put
Moderator

Ward van der Put

23/11/2014 18:14:33
Quote Anchor link
>> Dan zitten we dus met twee response objecten??

Yep, goed gezien, vooral dat zit in de weg.
Daarvoor hebben we dan een registry met één request en één response.

Daarom hebben we ook de neiging om het request/response-systeem te modelleren als een besturingssysteem.

1. Er komt één request binnen. Helder: dít is ons HTTP-verzoek, hier moeten we een antwoord op vinden.
Van dat request is er maar één, dus we hebben een uniek instance die we centraal kunnen registreren.

2. Van die request moeten onderdelen worden gedelegeerd aan specifieke controllers.
Hier komt het op creativiteit aan. Alleen de webdeveloper weet wat het systeem met specifieke requests moet doen.

3. Er komt één response uit.
We kunnen HTTP-output genereren of een HTTP-statuscode, maar veel alternatieven biedt HTTP ons niet.
De request wordt beantwoord met een response óf een code voor een ongeldig request.
 
Roy B

Roy B

23/11/2014 19:58:15
Quote Anchor link
Roy B op 23/11/2014 17:51:54:
Ward van der Put op 23/11/2014 16:45:31:
Ja, prima oplossing.

Kun je daar een voorbeeldje van geven?
Misschien zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$controller = new NewsitemController();

$model = new NewsitemModel();
$controller->setModel($model);
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/11/2014 21:59:37
Quote Anchor link
Bedankt voor je heldere uitleg Ward. (Ben nog wel even aan piekeren hoe de developer dan zorgt dat dat ene response object dan bij de tweede en derde layer op de juiste manier uitgebreid wordt).

@Roy: In het systeem dat Ward beschrijft gaat het inderdaad om die manier. Ward geeft dat ook duidelijk aan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$model
= new NewsitemModel();
$controller = new NewsitemController($model);
?>


Het enige verschil tussen jouw voorbeeld en die van Ward is dat Ward het Model aan de constructor meegeeft en jij daar een aparte method voor aanroept.

In andere MVC's wordt het model in de controller bepaald. Je krijgt dan zoiets:

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

$route
= new Route('NewsItem', 'index');

$controllerName = $route->getController(); // geeft NewsItemController
$methodName = $route->getAction(); // geeft indexAction

$controller = new $controllerName();
$controller->$methodName($route->getVars());

?>


Controller:
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
<?php

class NewsItemController
{
    public indexAction($newsitem_id)
    {

        $model = new NewsModel();
        $newsitem = $model->getNewsItem($newsitem_id);

        $data = array(
            'newsitem' => $newsitem
        );
        
        return $this->loadView('newsItem', $data);
    }
}

?>
 
Roy B

Roy B

23/11/2014 22:07:28
Quote Anchor link
Het Model in de Controller meegeven is doorgaans de beste optie dan?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/11/2014 22:18:08
Quote Anchor link
Het is een keuze denk ik. Ik zou het doen maar dat is omdat ik het op die manier gewend ben. Ward mag zijn methode nog eens onderbouwen ;-).

Het probleem waar ik een beetje tegen aanloop is welke method moet ik nu aanroepen in het Model van Ward.
Je krijgt namelijk het hele object geïnjecteerd in je Controller maar in dat object kunnen twintig verschillende methods zitten...
 
Ward van der Put
Moderator

Ward van der Put

24/11/2014 07:31:59
Quote Anchor link
Laten we ze dan eens vergelijken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
// Variant A
$user_model = new UserModel();
$user_controller = new UserController($user_model);

// Variant B
$user = new User();
?>


Bij variant A moet je overal steeds in de weer met twee objecten: model en controller. Bij variant B heb je maar één API: je spreekt de controller aan en die zoekt verder zelf maar uit of er een model nodig is, hoe dat model er uitziet en hoe met het model wordt gecommuniceerd.

Bij variant A kun je makkelijker verschillende combinaties van models en controllers maken, wat met name bij frameworks handig kan zijn. Je zou in het voorbeeld UserModel door AdminModel kunnen vervangen. Bij variant B is die logica verborgen, wat zowel een voordeel als een nadeel kan zijn.

Variant B leent zich ook wat beter voor het inzetten en veranderen van design patterns: een blanco new User() kun je op verschillende manieren bouwen, terwijl er bij een new User(\UserModel $model) al veel meer is voorgeschreven.

Het is dus inderdaad een keuze.
Gewijzigd op 24/11/2014 07:32:29 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

24/11/2014 12:51:41
Quote Anchor link
Heren, interessante discussie.

Ik zal ook even een spreekwoordelijke duit in het spreekwoordelijke zakje doen.

Wanneer geven we waardes of een object mee aan de constructor? Op het moment dat een class kan werken met dynamische data. Zo kan een database class via de constructor verschillende "verbindingsobjecten" binnenkrijgen om zodoende met verschillende databases contact te kunnen maken, en een e-mailer class kan bijvoorbeeld verschillende e-mailadressen ontvangen om naar verschillende personen te kunnen mailen.

Praten we over een model, dan ligt de situatie echter wat anders. Mijns insziens is een model niets meer dan een verlengstuk van een controller. De code die in het model staat, zouden we ook rechtstreeks in de controller kunnen plaatsen, maar dat doen we niet omdat we alles netjes gescheiden willen houden. En ... mochten we ooit een ander model gaan gebruiken, dan hoeven we niet alle code in de class zelf aan te passen.

Het klinkt natuurlijk leuk om het model via de constructor mee te geven, want dan hoeven we de class nooit aan te passen als we een ander model willen gebruiken. Maar ... is het logisch? Ik vind van niet. Een model is namelijk afgestemd op de controller. De controller en het model zijn onlosmakelijk met elkaar verbonden. Ze horen bij elkaar. Ze zijn als Bert en Ernie, of als Bassie en Adriaan ... maar net waar je zelf de voorkeur aan geeft. Het is dan ook vreemd om van buitenaf te gaan bepalen welk model er nodig is. Dat hoort niet. Als "buitenstaander" praat je enkel met de controller, en die controller bepaalt zelf welk model er nodig is. Het is de controller die dit bepaalt, en niet de "buitenstaander".

Op het moment dat je een AdminModel wilt gebruiken in een UserController zoals Ward hierboven aangeeft, zou het raar zijn om als "buitenstaander" zelf een model te kiezen en dat mee te geven aan de constructor van de UserController. Wie zegt dat de UserController wel overweg kan met dat door de "buitenstaander" gekozen model? Logischer zou het dan zijn om in de constructor van de UserController een parameter in te bouwen:

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

public function __construct($is_admin = false) {
    if ($is_admin) {
        $this->model = AdminModel;
    }
else {
        $this->model = UserModel;
    }
}


?>

Op deze manier houd je de beslissingsbevoegdheid bij de controller zelf.

Bottomline: als "buitenstaander" praat je enkel met de controller, en beslis je niet welk model de controller moet gebruiken. Deze bevoegdheid ligt bij de controller zelf.

Amen ... :)
 

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.