Multidesk.be » Forums » PHP » MVC (Model View Controller)

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Simon op zaterdag 12 september 2009 om 19:41:47.
Simon's avatar
Multiviteit: 3742
Ik heb deze middag wat dingen gelezen over MVC in PHP. Ik snap nu wel beter wat het is en ook dat de code veel gemakkelijker in gebruik is. Ik begrijp echter niet waarvoor het anders nog nuttig is. Als ik zo voorbeelden zie staan dan zie ik enorm veel klasses en functies (code dus) de eigenlijk weinig output teruggeeft.
Zijn er hier nog mensen die daar mee bezig zijn. En mij eens het nut kunnen uitleggen. Ik wil er wel wat over bijleren, maar als ik het toch nergens zal kunnen gebruiken heeft dat weinig nut lijkt me.

Dan heb ik ook nog een vraagje over een voorbeeld dat ik in één van die artikels vond.

Het bestand index.php snap ik wel, de controller ook. In de view staat echter iets wat ik niet ken: interface (op php.net begreep ik de uitleg niet echt). Waarom staat er in de interface één functie met de naam van een functie uit de view klasse? En waarom is die implements interface nodig?
Daaruit volgt dan ook dat ik het nut van de functie registerview() in de controller ook niet begrijp. Die krijgt als argument de naam van de interface en een object (van de klasse die die interface geimplementeerd heeft). In index.php wordt dan dat object opgevraagd (via get_view()) en dan wordt de functie render() (deel van de interface en ook van de klasse).
Ik begrijp nu niet waarom die interface überhaupt nodig is. Ik weet niet precies wat het is, maar als je de interface nu weglaat en de naam van die interface in het argument van registerview() kan je toch ook alles uitvoeren? Of zie ik dat nu echt helemaal verkeerd?

Even de code hier plaatsen:

INDEX.PHP
PHP
  1.  
  2. <?php
  3.  
  4. $controller = isset( $_GET['c'] ) ? $_GET['c'] : 'default';
  5. $action = isset( $_GET['a'] ) ? $_GET['a'] : 'default';
  6.  
  7. if( file_exists( 'controllers/' . $controller . '.php' ) )
  8. {
  9.         require_once( 'controllers/' . $controller . '.php' );
  10.         $controllername = ucfirst( $controller ) . 'Controller';
  11.         if( class_exists( $controllername ) && in_array( $action, get_class_methods( $controllername ) ) ) {
  12.                 $c = new $controllername (); /** Controller maken. **/
  13.                 $c->$action( ); /** Actie uitvoeren. **/
  14.                 $view = $c->getView( );
  15.         } else {
  16.                 $view = new NotFoundView( );
  17.         }
  18.         echo $view->render( );
  19. }
  20.  
  21. ?>
  22.  


CONTROLLER
PHP
  1. <?php
  2. class AgendaController
  3. {
  4.         private $_view;
  5.  
  6.         public function show( )
  7.         {
  8.                 $mapper = new AppointmentMapper( );
  9.                 if( isset( $_GET['start'] ) && isset( $_GET['end'] ) ) {
  10.                         $appointments = $mapper->getAppointments( $_GET['start'], $_GET['end'] );
  11.                 } else {
  12.                         $appointments = $mapper->getAllAppointments();
  13.                 }
  14.                 $agendaView = new AgendaView( );
  15.                 $agendaView->setAppointments( $appointments );
  16.                 $this->registerView( $agendaView );
  17.         }
  18.  
  19.         private function registerView( iView $view )
  20.         {
  21.                 $this->_view = $view;
  22.         }
  23.  
  24.         public function getView( )
  25.         {
  26.                 return $this->_view;
  27.         }
  28. }
  29. ?>


VIEW
PHP
  1.  
  2. <?php
  3.  
  4. interface iView
  5. {
  6.         public function render( );
  7. }
  8.  
  9. class AgendaView implements iView
  10. {
  11.         private $_appointments;
  12.  
  13.         /**
  14.          * Set the appointments for display.
  15.          *
  16.          * @param array $appointments
  17.          */
  18.         public function setAppointments( Array $appointments )
  19.         {
  20.                 $this->_appointments = $appointments;
  21.         }
  22.  
  23.         /**
  24.          * Renders a page and returns it as a string.
  25.          *
  26.          * @return String The rendered page.
  27.          */
  28.         public function render( )
  29.         {
  30.                 ob_start( );
  31.                 include( 'templates/agenda.tpl' );
  32.                 $contents = ob_get_contents( );
  33.                 ob_end_clean( );
  34.                 return $contents;
  35.         }
  36. }
  37.  
  38. ?>
^ Reactie #1 geschreven door Martijn op maandag 14 september 2009 om 10:35:34.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Een MVC architectuur gebruik je doorgaans voor meer structuur en overzicht in je project te brengen. Voor kleine projecten lijkt het nut hiervan relatief laag, maar zodra je met grotere projecten begint of met meerdere ontwikkelaars aan één project werkt, loont het gebruik van een design pattern als MVC al vrij snel. Doorgaans dwing je hiermee ook enige vorm van code consistency af.

Een interface gebruiken hoeft helemaal niet, maar ook hier: interfaces gebruiken (en beter: tegen een interface programmeren) vergroot enkel de duidelijkheid van je code. Een klasse (in PHP) kan meerdere interfaces implementeren, vandaar het keyword "implements".

De functie van de interface hier (in jouw voorbeeld) is in feite net hetzelfde als die van een interface op eender welke andere plaats, zelfs in andere (programmeer)talen. Je geeft (via de interface) de vereisten op aan welke een implementatie moet voldoen. In dit geval dient elke implementatie minstens de methode "render" te bevatten, welke (in deze context) de view opstelt.

In jouw voorbeeld zorgt de methode render ervoor dat de klasse AgendaView de informatie op je view correct kan weergeven. Als die klasse de interface iView niet implementeerde, had je geen enkele behoefte (lees: verplichting) om die methode render te implementeren, waardoor alle volgende aanroepen van die methode in die klasse zouden falen.

Duidelijk?
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #2 geschreven door Simon op maandag 14 september 2009 om 13:49:25.
Simon's avatar
Multiviteit: 3742
Zeer duidelijk, alleszins bedankt!

Het lijkt me nog allemaal vrij moeilijk om er zo van de eerste keer mee te beginnen. Daarom was ik van zin om die methode eens toe te passen binnen een framework (die natuurlijk op MVC gebaseerd is). Is er hier iemand die ervaring heeft met een goed framework voor PHP.

Ik heb al eens naar Zend Framework gekeken. De installatie vond ik echter veel te moeilijk (met al die command lines enzo), dus heb ik het maar opgegeven. De documentatie op hun website vond ik ook nogal omslachtig en nogal moeilijk te begrijpen voor beginners. Tutorials op andere websites zijn dan weer heel zeldzaam.

Daarna heb ik eens geprobeerd met CodeIgniter. In tegenstelling tot Zend ging de installatie wel heel vlot. De tutorials op hun website zijn wel duidelijk en eerder wel op beginners gericht. Ik ben er nu ongeveer een dag mee bezig (ofja, wat uitproberen en zo) en dat gaat wel vrij vlot.

Is CodeIgniter een goed framework? En zijn er nog mensen die andere goede frameworks gebruiken. Is er voor multidesk.be trouwens ook een framework gebruikt :)?
Deze tekst werd het laatst bewerkt voor 0.74 % door Simon op maandag 14 september 2009 om 13:49:39.
^ Reactie #3 geschreven door Martijn op maandag 14 september 2009 om 14:39:58.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Installatie bij Zend Framework? Is toch niet ndoig in principe.

Probeer volgende frameworks eens:

  • Zend Framework (goede documentatie - zeker nog verbeterd bij de recentste versie), losse componenten, eenvoudig uit te breiden)
  • CakePHP (strikt MVC model, deftige documentatie en voorbeelden op hun website)
  • Symfony (nog niet zo heel erg veel ervaring mee, maar dit pakket heeft ook zijn aanhangers en had geloof ik ook een Ruby on Rails-like code generatie module)
  • CodeIgniter (wordt gebruikt voor heel wat grote projecten en heeft zeer duidelijke eenvoudige documentatie)]


In principe zijn de meer strikte frameworks vooral bedoeld om je in één bepaalde "goede" richting annex werkwijze te duwen. Sommige mensen houden liever van strikte regels (als bij Cake PHP), andere houden liever van meer losse componenten die je naar eigen goeddunken kan gebruiken (als bij Zend Framework).

Multidesk.be gebruikt een eigen framework. Een groot deel van het opzet dateert van voor de opkomst van PHP en Javascript Frameworks, dus moest er wel een eigen manier gevonden worden om de zaken af te handelen met een goede performantie. Tegenwoordig zijn de grote PHP/JavaScript frameworks echter wel vrij compleet en is alle code (soms letterlijk tot op de milliseconde) getest en gebenchmarked op meerdere platformen.
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #4 geschreven door Simon op maandag 14 september 2009 om 21:38:27.
Simon's avatar
Multiviteit: 3742
De documentatie bij Zend ik zeker goed, maar ik bedoelde dat het voor iemand die nog niets weet over frameworks toch wel wat moeilijk is.
Ik had ergens een tutorial gelezen waar er wel degelijk iets stond over installatie. Nuja, het lukte mij alleszins niet om het aan de praat te krijgen.

CodeIgniter had ik al geïnstalleerd en ik vind het tot nu toe wel prettig om mee te werken. CakePHP lijkt me ook wel leuk. Dat zal ik later zeker ook nog eens proberen.
^ Reactie #5 geschreven door Martijn op maandag 12 oktober 2009 om 14:29:10.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Ietwat laat, maar kijk eens hier voor een overzichtje ;).
Met vriendelijke groeten,
Martijn Wouters
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen