Witam,
W celach treningowych projektuje sobię aplikację na MVC, przeczytałem dość dużo artykułów na temat MVC, z których się dowiedziałem, że zarówno Controller i View musi obsługiwać warstwę modelu.
I tu zwracam się do was z prośbą o pomoc w rozwikłaniu tego problemu, bo zastanawiam się jak to zaprojektować, by kontroler i widok używały tej samej instancji modelu, a także mam takie pytanie: Jak widok powinien wyglądać?
A tutaj cały kod, który dotychczas napisałem:
Index.php
<?php
//Installation path(Do not change this, unless you know what are you doing)
/*
*--------------------------------------------------
*---------------CONFIGURATION SECTION--------------
*--------------------------------------------------
*/
//Home page - Default page
//Must be existing controller
define("DEFAULT_CONTROLLER", 'home');
/*
*--------------------------------------------------
*-----------------------PATHS----------------------
*--------------------------------------------------
*/
$paths['app'] = BASE_DIR.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR;
$paths['controllers'] = $paths['app'].'controllers'.DIRECTORY_SEPARATOR;
$paths['models'] = $paths['app'].'models'.DIRECTORY_SEPARATOR;
$paths['views'] = $paths['app'].'views'.DIRECTORY_SEPARATOR;
$paths['libs'] = $paths['app'].'libraries'.DIRECTORY_SEPARATOR;
$paths['helpers'] = $paths['app'].'helpers'.DIRECTORY_SEPARATOR;
$paths['styles'] = $paths['app'].'styles'.DIRECTORY_SEPARATOR;
//Ustawienia środowiska
/*
* Środowisko służy do ustawiania trybu wyświetlania błędów
* Istnieją 3 tryby
*
* 0 - Produkcja (Błędy nie są wyświetlane)
* 1 - Testowanie (Wyświetlane są ostrzeżenia oraz uwagi)
* 2 - Rozwój (Wszystkie błędy są wyświetlane)
*
* Tutaj możesz zmienić ustawienia środowiska:
*/
/*
*--------------------------------------------------
*------------END OF CONFIGURATION SECTION----------
*--------------------------------------------------
*/
switch(SRODOWISKO){
case 0:
break;
case 1:
break;
case 2:
break;
default:
exit("Środowisko nie jest skonfigurowane poprawnie!"); break;
}
} else{
exit("Środowisko nie jest zdefiniowane!"); }
//Check if CMS is installed
if(is_dir(BASE_DIR
.'install')){ header(HEADER_LOCATION
.'install'); }
//Check if paths are valid
exit('Application folder doesn\'t exist'); } else if(!is_dir($paths['libs'])){ exit('Libraries folder doesn\'t exist'); } else if(!is_dir($paths['controllers'])){ exit('Controllers folder doesn\'t exist'); } else if(!is_dir($paths['models'])){ exit('Models folder doesn\'t exist'); } else if(!is_dir($paths['views'])){ exit('Views folder doesn\'t exist'); } else if(!is_dir($paths['helpers'])){ exit('Helpers folder doesn\'t exist'); } else if(!is_dir($paths['styles'])){ exit('Styles folder doesn\'t exist'); }
//Autoload called classes
spl_autoload_register( function ($className) {
$className = ltrim($className, '\\'); $fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) { $namespace = substr($className, 0
, $lastNsPos); $className = substr($className, $lastNsPos + 1
); $fileName = str_replace('\\', DIRECTORY_SEPARATOR
, $namespace) . DIRECTORY_SEPARATOR
; }
$fileName .= str_replace('_', DIRECTORY_SEPARATOR
, $className) . '.php';
require $paths['app'].$fileName;
});
//Load error class
$error = new Libraries\Error();
$url = filter_var($_GET['url'], FILTER_SANITIZE_URL);
} else{
$url = DEFAULT_CONTROLLER;
}
$controller = "Controllers\\{$url[0]}";
$controller = new $controller;
case 1:
if(method_exists($controller, 'main')){
$controller->main();
} else{
$error->display404();
}
break;
case 2:
if(method_exists($controller, $url[1])){
$controller->{$url[1]}();
} else{
$error->_404();
}
break;
case 3:
if(method_exists($controller, $url[1])){
$controller->{$url[1]}($url[2]);
} else{
$error->display404();
}
break;
case 4:
if(method_exists($controller, $url[1])){
$controller->{$url[1]}($url[2], $url[3]);
} else{
$error->display404();
}
break;
case 5:
if(method_exists($controller, $url[1])){
$controller->{$url[1]}($url[2], $url[3], $url[4]);
} else{
$error->display404();
}
break;
case 6:
if(method_exists($controller, $url[1])){
$controller->{$url[1]}($url[2], $url[3], $url[4], $url[5]);
} else{
$error->_404();
}
break;
}
} else{
$error->_404();
}
Controller.php
<?php
namespace Libraries;
class Controller{
private $model;
private $view;
public function __construct(){
$this->view = new \Libraries\View();
}
public function _loadModel($name){
require_once('{$models}{$name}_model.php');
$model = '$name_model()';
$this->model = new $model;
}
}
View.php
<?php
class View{
private $model;
private $template = array();
public function __construct(){
//$this->model = new
}
public function getTemplate($template){
$path = '{BASE_DIR}/cache/templates/{$template}_cache.html';
} else{
$template = $this->model->fetchTemplate($template);
$cache = fopen($path, 'w'); $this->template[$template] = $template;
}
}
}
Przeczytałem również, że widok nie powinien działać jak template engine, więc to do czego dążę już jest pewnie źle, proszę o nakierowanie w dobrą stronę, bo wszędzie gdzie szukam w internecie czy po polsku, czy angielsku, żaden artyku nie omawia wyczerpująco MVC, a większość artykułów wprowadza w błąd. Warstwy modelu nie zacząłem ze względu na to, że przeczytałem, że model to nie klasa, więc siętrochę pogubiłem.
Z góry dziękuje (IMG:
style_emoticons/default/smile.gif)