Al langere tijd vind ik het leuk om wat met OOP programmeren te proberen (en vooral het idee van OO). Om die reden heb ik recent een MVC-Framework geschreven.
Dit heb ik nu in gebruik in een andere applicatie en ik loop tegen wat problemen aan.
Ik vind het moeilijk/onduidelijk de verantwoordelijkheden van de View en de controller te scheiden.
Voorbeeldcase:
Er wordt een request gedaan, deze wordt door de froncontroller opgevangen en de router/dispatcher zorgt ervoor dat de goede controller wordt aangeroepen en de bijbehorende method. In dit voorbeeld betreft het een method om een gastenboek bericht toe te voegen.
Je begint met het controleren van de meegegeven POST-waardes. Deze zijn echter niet correct omdat de gebruiker vergeten is zijn naam in te vullen.
Het bericht wordt dus niet toegevoegd en er moet worden verteld dat je de naam in moet vullen omdat het een verplicht formulierveld is en daar onder het formulier laat zien.
De schematische code
<?php
//voorbeeld code, de naam message is natuurlijk niet heel veel zeggend
public function addMessage()
{
try
{
$oForm = new Form('index.php?c=Gastenboek&m=addMessage', 'nameofform');
$oNameField = new Text('name', new Label('Name:', 'class_no_error', 'class_error'));
$oNameField->addValidator(new Required, new NotEmpty);
$oMessageField = new Textarea('message', new Label('Your message:', 20, 10 'class_no_error', 'class_error_textarea'));
$oMessageField->addValidator(new Required, new NotEmpty, new MinLength(3));
$oForm->addElement($oNameField, $oMessageField);
}
catch(Exception $oException)
{
if(Framework::$DEBUG == true)
{
echo $oException->getMessage();
}
else
{
$this->setView(new Error('Formulier kon niet geladen worden'), abstractView::$Notoverridable);
}
}
if($oForm->isSubmitted() && $oForm->isValid())
{
$oMessage = new Message($oNameField->getValue(), $oMessageField->getValue());
$this->saveMessage($oMessage);
header('Location: index.php?c=Gastenboek&m=Done');
}
elseif($oForm->isSubmitted() && !$oForm->isValid())
{
$oView = new addMessageView($oForm);
$oErrorLog = $oForm->getErrorLog();
foreach($oErrorLog as $oError)
{
if($oError->getValidator instanceof NotEmpty)
{
$oView->addError('Je ziet toch wel dat je een naam in moet vullen eikel!');
}
// etc elseif($oError->getValidator instanceof MinLength){ }
}
}
else
{
$oView = new addMessageView($oForm);
}
$this->setView($oView);
}
Alleen zoals deze voorbeeldcode nu is ben ik niet blij met de scheiding output/logica(/data):
Je zou willen dat als je iets aan de output van je applicatie wil veranderen dat je dan alleen de view in moet duiken, maar zoals het nu is geeft de controller de hardcoded data aan de view wanneer er wat fout gaat en moet je dus toch op meerdere plaatsen zoeken als je de output wilt veranderen.
Hoe lossen jullie dat op? Voor elke mogelijke foutmelding een view maken en die dan aan een andere view meegeven met een setError(Errorview $oView) functie? Dat lijkt me redelijk omslachtig omdat je 10000e foutmeldingen kunt hebben.
De kern van mijn probleem is dus hoe je hardcode data opslaat: in de view?(bijvoorbeeld een array met errornummers en errormeldingen en dan een setErrorNumber() functie?), in de controller?, in een Model?
Alvast bedankt,
Freek
[quote]
Edit
Veel typo's, leestekens
[quote]