teroristd каза:
А иначе може и да греша но по този цитат
"И понеже всички проверки ми бяха в контролерите трябваше да дублирам огромно количество код, вместо само да си използвам готови функции на моделите (които да си правят валидацията). "
нали затова има наследяване и презаписване на функции
Няма да стане с наследяване, защото представи си следната ситуация:
Имаш 1 контролер, който се използва за логин система. В него имаш метод за регистриране на потребител, който прави проверки дали мейла е валиден, дали има друг потребител с това име, дали има друг с този мейл, регистрира потребител и праща мейл за потвърждение. В модела има методи от рода на: loginUser, registerUser, checkEmail, checkUsername, sendEmail, които не правят проверки за валидност на данните.
Този контролер използва директно данни подадени от форма чрез POST и като си свърши работата показва на екрана някакво view.
Сега да речем, че ми се налага да направя API за сайта. Да, ама API-тата не ползват форми, пък и не трябва да показват view, а да показват някакви JSON/XML съобщения. Следователно същия контролер не мога да го ползвам, защото той ще работи само с форми и вюта. Пък и за API-то ми трябват още проверки като например проверка за API ключ, проверка за това какъв резултат да връщам (json или xml) и т.н.
Не мога и да наследя този контролер, защото няма смисъл - не мога да ползвам същия код, ще трябва да се попромени. Ще трябва да копирам всичко в контролера за API-то, да променя това, което работи с view-тата и формата и вече ще трябва да поддържам по 2 копия на тези проверки.
Ако методите на модела ми правеха проверки и просто ми съобщаваха за грешките (чрез exceptions например) първия контролер щеше да ми изглежда по този начин:
PHP:
class TestController
{
public function register()
{
if (isset($_POST['submit']))
{
try
{
$model->register($_POST['username'], $_POST['password'], ....);
}
catch (ValidationException $e)
{
$view->error($e);
}
}
$view->render();
}
[...]
}
Сега много лесно мога да си направя втория контролер, така че логиката да е същата, но да не взима информацията от форма и да не показва view, ами да праща нещо друго като json/xml. Просто ще сменя параметрите на $model->register, ще сменя кода за render на view с функции, които принтират json/xml и всичко ще е ОК, защото проверките са в модела - ще са на 1 място и могат да се използват отвсякъде.