Ik heb even een vraag over Zend Frameworks en het integreren van een applicatie in de MVC.
Op dit moment heb ik een filmdatabase met een index.php. Hierin staan twee OOP class bestanden geinclude: Filmclass.php en acteur.php. Hierin staan al mijn public functions, INSERT, SELECT, UPDATE functies, abstracte handige dingetjes, etc.
In de index.php staat een switch statement met bijvoorbeeld de onderdelen case toevoegen/case delete /case update. Met daarin objecten aangemaakt die verwijzen naar de public functions in mijn class bestanden.
Nu ga ik het switch statement opsplitsen in de controller map van Zend framework. Ik maak dus een controllerbestand "FilmdbController.php". Hierin maak ik een class aan: class FilmdbController extends Zend_Controller_Action.
In deze controller class FilmdbController maak ik verschillende publlic functions aan. (public function indexAction, indexToevoegen, indexDelete, etc). Voor de views is er een koppeling gemaakt naar Smarty, voor het netjes verwerken van de templates. Dit is allemaal in orde.
Maar waar laat ik nu de classes (filmclass.php, en acteur.php) met alle functies erin? Deze had eerder ik in PHP zonder ZF altijd geinclude in de index.php.
Moet ik deze weer ergens in een map plaatsen en dan includen, of moet ik iets met de "models" map doen?
Ik ben erg benieuwd of iemand mij hiermee kan helpen.
Een model regelt de manipulatie van objecten, meestal is dit een Database tabel. Die dingen heb je dus niet echt meer nodig, tenzij het specifieke zaken betreffen.
In een model kun je voor die specifieke zaken gewoon een method maken die je dan aanroept in je controller:
Het is nog niet helemaal duidelijk. Hoe zou ik het bijvoorbeeld onderstaande stukje script uit mijn film.php in een model/contoller zetten? Bijvoorbeeld het stukje INSERT. Moet de naam van het model dan ook dezelfde naam hebben als de Action in de controller?
class Film {
private static $_mogelijke_beeldkwaliteiten = array("720P", "1080P","DivX", "DVD5", "DVD9");
private $_gegevens;
public function __construct($id = null) {
if (is_numeric($id)) {
$query = "SELECT * FROM filmdatabase WHERE id=$id";
$result = mysql_query($query);
$this->initByDatabaseRow(mysql_fetch_assoc($result))
}
}
public function initByDatabaseRow($row) {
$this->_gegevens = $row;
}
public function initByPostData($post) {
$this->_gegevens = $post;
}
public function getId() {
return $this->_gegevens['id'];
}
public function setId($id) {
$this->_gegevens['id'] = $id;
public function getTitel() {
return $this->_gegevens['titel'];
}
public function setTitel($titel) {
$this->_gegevens['titel'] = $titel;
}
public function getJaar() {
return $this->_gegevens['jaar'];
}
public function setJaar($jaar) {
$this->_gegevens['jaar'] = $jaar;
}
public function getBeeldKwaliteit() {
return $this->_gegevens['beeldkwaliteit'];
}
public function setBeeldKwaliteit($beeldkwaliteit) {
if(in_array($beeldkwaliteit, $this->_mogelijke_beeldkwaliteiten)) {
$this->_gegevens['beeldkwaliteit'] = $beeldkwaliteit;
}
}
public function getOmschrijving() {
return $this->_gegevens['omschrijving'];
}
public function setOmschrijving($omschrijving) {
$this->_gegevens['omschrijving'] = $omschrijving;
}
public function getFilmtype() {
return $this->_gegevens['filmtype'];
}
public function setFilmType($filmtype) {
$this->_gegevens['filmtype'] = $filmtype;
}
public function getTijdsduur() {
return $this->_gegevens['tijdsduur'];
}
public function setTijdsduur($tijdsduur) {
$this->_gegevens['tijdsduur'] = $tijdsduur;
}
public static function getMogelijkeBeeldkwaliteiten() {
return self::$_mogelijke_beeldkwaliteiten;
}
public function verwijderen() {
if (is_numeric ($this->_gegevens['id'])) {
mysql_query("DELETE FROM filmdatabase WHERE id = '{$this->_gegevens['id']}'");
}
}
public function opslaan() {
mysql_query ("INSERT INTO filmdatabase (titel, jaar, beeldkwaliteit, omschrijving)
VALUES ('{$this->_gegevens['titel']}',
'{$this->_gegevens['jaar']}',
'{$this->_gegevens['beeldkwaliteit']}',
'{$this->_gegevens['omschrijving']}')") ;
$this->_gegevens['id'] = mysql_insert_id();
}
Hoe je het moet doen in je code, gaan we niet uitleggen. Zoek eens op de termen: MVC, ORM, DataMapping en DAO. Dat zijn dingen die voorkomen in de MVC structuur van de nieuwste Zend Framework. Je maakt een model klasse voor een film. Die heeft velden als titel, duurtijd, ...
Dan heb je een klasse met database operaties (DAO klasse). En dan heb je een datamapper klasse nodig die je model opslaat in de database of gegevens van de database teruggeeft in je model. Als dit nieuw voor je is, ga je er 1% van verstaan wat hier getypt is. Ik ken je kennis van ZF ook niet en ook niet van OOP. Misschien dat je eerst kan zeggen wat je ervaringen zijn met die twee dingen.
Ik ga er eerst wel eens wat dieper in duiken. Het is dus niet even simpel wat code uit de class omzetten / verplaatsen
Het Controller / View gedeelte heb ik nu aardig door met ZF. En dit werkt goed. Maar nu ik de scripts met OOP classes moet gaan omzetten loop ik tegen wat problemen aan.
Dat komt omdat ik nog nooit met het "models" gedeelte bezig ben geweest denk ik.
Volgens mij is hier op Sitemasters een tutorialreeks voor Zend Framework te vinden, geschreven door Stijn.
Dit is wellicht een outdated versie, maar voor het principe models zou het een uitstekende beginsel moeten zijn. Daarnaast heeft Zend op hun website een reference waar je werkelijk alles over het MVC kunt nalezen ;)
Hey, dat klopt ik heb ook geprobeerd de reeks van Stijn te downloaden, maar deel 1 was niet meer beschikbaar.
Gelukkig staan er op internet genoeg andere E-books, tuts, etc. Ik ga me er eerst maar eens op deze manier in verdiepen. Bedankt voor de tips allemaal.
Ik weet niet of dit nog billijk is. ZF2 is in aantocht en gaat enkele grote MVC breuken introduceren. Ik volg alle development van ZF2 nauwgezet op en ben dus bezig met de "cutting-edge" features van ZF2.
Wat ik WEL aanraad, is de tutorial van Rob Allen (akrabat.com), een contributor tot het ZF. Deze is zeer gekend in de ZF community en legt de concepten van MVC zeer goed uit in de ZF-omgeving.
Ik zou aanraden de tutorial voor ZF1 door te nemen om je vertrouwd te maken met de concepten. Daarna kan je zijn tutorial voor ZF2 volgen als je mee op de kar van de evolutie wil springen.
Wat ik alleszins wel al kan zeggen is dat ZF1 weldra deprecated zal worden. Het heeft mijns inziens dus niet veel zin om bij ZF1 te blijven. Vooral omdat dit over de jaren heen een zwaar framework geworden is en meer sites trager maakt dan snel. ZF2 is the way to go.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.