MVC Routing

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Database Developer

Functieomschrijving Heb jij ongeveer 3 jaar ervaring als Database Developer met MS SQL of een vergelijkbare database? Wil jij werken voor een ambitieuze werkgever in regio Tilburg waar jij volledig de mogelijkheid krijgt jezelf te ontwikkelen? Lees dan snel verder! Hoe ziet jouw takenpakket eruit? Je gaat projecten gedurende het hele proces begeleiden. Je sluit aan bij afspraken met klanten om hun processen helder te krijgen. Vervolgens voer jij het project uit en zorgt dat dit zo goed mogelijk verloopt; Je werkt aan nieuwe softwareoplossingen die de logistieke processen verbeteren of vernieuwen; Je houdt je bezig met het ontwikkelen van

Bekijk vacature »

Magento2 Developer

Functie Ben jij een ontwikkelaar en wil jij een volgende stap zetten en als teamlead aan de slag? Lees dan snel verder! Voor een gewilde opdrachtgever in omgeving Delft zijn wij op zoek naar een programmeur die als meewerkend voorman aan de slag wilt gaan. Een developer die een team van twee man aan zal sturen. Jouw werkzaamheden zullen er als volgt uitzien; Ontwikkelen en ontwerpen van API's; Maatwerkoplossingen; Databeveiliging; Optimalisatie webshops; Ontwikkelen technische implementaties voor verbetering database; Aanspreekpunt voor de organisatie en verantwoordelijk voor de aansturing van externe developers. Zoek je veel uitdaging en veelzijdigheid in je werk dan

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Back-end PHP Developer

Dit ga je doen Her- en uitbouwen van het inhouse softwareplatform dmv PHP; Onderhouden van bovengenoemd platform in PHP; Sparren met het team; Meedenken over nieuwe functionaliteiten, security etc; Jouw input leveren aan het proces door op de hoogte te blijven van nieuwe ontwikkelingen etc. Hier ga je werken Onze klant, gevestigd in de omgeving van Alkmaar, levert wereldwijd oplossingen op het gebied van IT. Dag in dag uit werken zij met veel passie aan hun product waarmee ze streven naar verbeteringen binnen zorg. Voor onze klant zijn we op zoek naar een medior PHP Developer. Je komt te werken

Bekijk vacature »

Front-end developer gezocht

Functie Je komt in een team met ambitieuze developers die de passie voor Front-End met jou delen. Samen ga je aan de slag met leuke en leerzame opdrachten. Het team heeft een eigen budget en financiën en zij bepalen zelf hoe dat besteed en investeert wordt. Je gebruikt tools als JavaScript, Node.js, React, Angular, Typescript en Vue.js wanneer je werkt aan de opdrachten. Daarnaast zul je veel leren van je collega’s en gezamenlijk een leuke tijd doorbrengen tijdens activiteiten zoals wintersport, hackatons en conferentiebezoeken. Je krijgt niet alleen de mogelijkheid Front-End te ontwikkelen, maar ook vooral jezelf. Dit kan behaald

Bekijk vacature »

Lead javascript developer Node.js React

Functie Als fullstack JavaScript developer vind jij het uitdagend om op basis van concrete klantvragen nieuwe functionaliteiten te ontwikkelen. Bij voorkeur worden deze functionaliteiten op een bepaalde manier geprogrammeerd, zodat ze door meerdere klanten te gebruiken zijn. Je hebt dus vaak te maken met abstracte vraagstukken. Om dit te kunnen realiseren sta je nauw in contact met de product owner en/of klant. Je bent niet alleen onderdeel van het development team, maar hebt ook vaak contact met de product-owner en/of klanten om daardoor inzichten te verzamelen die leiden tot productverbeteringen. • Inzichten verzamelen bij de klant en/of product owner •

Bekijk vacature »

Als PHP developer bijdragen aan beter onderwijs?

Functie Momenteel zijn ze op zoek naar een PHP developer die mee gaat werken aan de (door)ontwikkeling van de producten en zo helpt aan de uitvoering van hun ontwikkelprojecten. Je komt te werken binnen hun development team bestaande uit 6 ontwikkelaars. Ze staan zowel open voor meer junior als medior/senior developers. Je kunt snel veel verantwoordelijkheid krijgen en doorgroeien binnen het bedrijf. Bovendien ben je betrokken bij het bepalen van de product roadmap en de inbreng van (nieuwe) technologieën. De applicaties waaraan je werk worden gebruikt op onderwijsinstellingen door heel Nederland. De tech-stack bestaat voornamelijk uit Laravel (PHP), Vue.js en

Bekijk vacature »

Als Front-end developer werken aan apps voor het o

Functie Als Front-end developer werk je intensief samen met 1 van de UX-designers en denk je mee over de gebruiksvriendelijkheid en design van onze web- en mobile apps. Je bent betrokken bij sessies met gebruikers om designs te valideren en usability van de app-in-wording te testen. Vervolgens gebruik je dit om samen met je team waarin ook back-end (.NET) developers zitten, te zorgen voor de realisatie van de best mogelijke apps voor studenten en docenten. Eisen • Je hebt een hands-on development en coding mind-set en werkt graag aan een high quality code base welke je consequent onderhouden kan worden

Bekijk vacature »

Software Programmeur PHP - JAVA

Functie Wil jij bij een platte en informele organisatie werken? Lees dan snel verder! Voor een opdrachtgever in omgeving Boskoop dat zich gespecialiseerd heeft in het realiseren van veilige netwerkverbindingen zijn wij op zoek naar een leuke software developer ter versterking van het huidige team. Hoe kan jouw dag er straks uitzien? Je gaat technische klussen uitvoeren op locatie bij klanten.Je onderhoudt contact met de projectleider om er zeker van te zijn dat een projecten goed verlopen. Je gaat klanten ondersteunen op het gebied van geleverde software en webapplicaties. Je gaat software en webapplicaties ontwikkelen met behulp van de talen

Bekijk vacature »

Technisch Applicatie ontwikkelaar

Functie omschrijving Ben jij op zoek naar een nieuwe uitdaging en zoek jij een informele werkgever waar je zelfstandig kunt werken binnen een leuk IT team, lees dan snel verder want wie weet zijn wij op zoek naar jou! In deze functie werk jij voornamelijk aan: Het onderhouden en ontwikkelen van de IT systemen; Het opzetten van Azure Cloud systemen, denk aan interfaces, hardware op de Cloud, webportalen of BI functies; Werk je aan scripts binnen verschillende software applicaties, denk aan ERP en CAD; Ontwikkel en implementeren je MS PowerApps en Power BI. Bedrijfsprofiel Je komt terecht bij een familiair

Bekijk vacature »

Junior/Medior Front-end developer

Functie Als Front-end developer werk je intensief samen met 1 van de UX-designers en denk je mee over de gebruiksvriendelijkheid en design van onze web- en mobile apps. Je bent betrokken bij sessies met gebruikers om designs te valideren en usability van de app-in-wording te testen. Vervolgens gebruik je dit om samen met je team waarin ook back-end (.NET) developers zitten, te zorgen voor de realisatie van de best mogelijke apps voor studenten en docenten. Eisen • Je hebt een hands-on development en coding mind-set en werkt graag aan een high quality code base welke je consequent onderhouden kan worden

Bekijk vacature »

BizTalk/ Azure Developer

Dit ga je doen •Understanding the scope of required functionality, translate them within context of way of working of the team into developed solutions, whilst safeguarding documentation; •Planning based on assigned sprint tasks; •Acting as an expert in estimation techniques and planning; •Understanding your role in the agile process and act in this way; •Facilitating internal communication and effective collaboration; •Working closely with scrum master to handle backlogs and new requests; •Providing information to the third parties about activities and needs for compliance. Hier ga je werken Our client is a leading organization focusing on animal nutrition, offering solutions that

Bekijk vacature »

.NET Developer

Functie omschrijving In deze functie ga je werken als C# Developer. Jij gaat aan de slag met de volgende taken: Maatwerk software bouwen; Huidige softwareprojecten verder uitbouwen en optimaliseren; Ideeën van de klant omzetten naar handige oplossingen en tools; Bovenstaande doe je middels de Microsoft- stack: C#, ASP.NET en MVC/ Entity Framework. Ben je net afgestudeerd aan een HBO opleiding Informatica, aarzel dan niet om te solliciteren. Dit is namelijk de ideale startersfunctie! Bedrijfsprofiel Deze organisatie is gevestigd in de regio van Boxtel. Het is van oorsprong een familiebedrijf, die gestart zijn met het bouwen van websites. Dit is door

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 »

Back-end developer

Dit ga je doen Development d.m.v. XQuery, JSON/XML en REST API's; Ontwikkelen aan een tof en complex zorgplatform; Koppelingen maken met de NoSQL database; Testen en documenteren van de ontwikkelde functionaliteiten; Samenwerking met andere front- en back-end ontwikkelaars. Hier ga je werken Voor een vooruitstrevende organisatie binnen de zorg in Den Haag zijn wij opzoek naar een Back-end Developer die ervaring heeft met o.a.XQuery en Vue.JS of daarin graag zou willen ontwikkelen. Je zal ontwikkelen aan een tof en complex zorgplatform en koppelingen maken met de NoSQL database. Ook het testen en documenteren van de ontwikkelde functionaliteiten behoort tot jouw

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

17/02/2025 08:45:58
 
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.