Доброго времени суток! Что есть сейчас: Пишу свою MVC (велосипед обучения ради) и сейчас, чтобы добавить новую страницу на сайт нужно вручную создать php файлы с моделью, контроллером, представлением и, собственно, хтмл-файл с содержимым. В самом простом случае, первые три содержат только две строки – например, для страницы "example.com/coolpage" файл /app/controller/controller_coolpage.php будет выглядеть так: Код (Text): <?php class Controller_Coolpage extends Controller {} за счёт того, что в классе "Controller" уже написан дефолтный action_index(), в которых вызываются модель и представление. NB: Листинг касса "Router" прилагаю внизу поста. Такой код отрабатывает успешно: Код (Text): <?php if (file_exists('app/view/html/view_'.$name.'.html')) { echo 'Yay, found "app/view/html/view_'.$name.'.html"!'; die(); } else { self::err404(); } Погуглил и читал про фабрики, но то, что я нашёл требует уже готовых файлов классов (фактически, выборка), что не есть гуд. Вероятно, наткнулся на некачественный материал? Вопрос: Каким образом создать новый класс, который наследует Controller и имеет имя Controller_Coolpage "на лету" в случае обнаружения только одного хтмл-файла? И не плодить тучу php-файлов из одной строки, а только там, где нужно переопределить стандартные классы. ps: так же буду рад замечаниям по поводу безопасности реализации роутера, если в нём увидите какие-либо дыры. Спасибо за внимание. Router: Код (Text): <?php class Router { static function run() { $routes = explode('/', $_SERVER['REQUEST_URI']); // get MVC values or set default $name = $model_name = $view_name = $controller_name = (!empty($routes['1'])) ? $routes['1'] : 'Main'; $action_name = (!empty($routes['2'])) ? $routes['2'] : 'index'; $name = strtolower($name); // set MVC classnames $model_name = 'Model_'.$model_name; $controller_name = 'Controller_'.$controller_name; $action_method_name = 'action_'.$action_name; $view_name = 'View_'.$view_name; // set MVC filenames $model_file = strtolower('app/model/'.$model_name.'.php'); $controller_file = strtolower('app/controller/'.$controller_name.'.php'); $view_file = strtolower('app/view/'.$view_name.'.php'); // including main MVC files require_once 'app/model/model.php'; require_once 'app/view/view.php'; require_once 'app/controller/controller.php'; // including page MVC files if (file_exists($model_file)) require_once $model_file; else self::last_chance($name); if (file_exists($view_file)) require_once $view_file; else self::last_chance($name); if (file_exists($controller_file)) require_once $controller_file; else self::last_chance($name); // create controller and launch $controller = new $controller_name; if (method_exists($controller, $action_method_name)) $controller->$action_method_name($name, $action_name); else self::err404(); } // not found static function err404() { header('HTTP/1.1 404 Not Found'); header(' ', TRUE, 404); header('Location: http://'.$_SERVER['HTTP_HOST'].'/404.html'); die(); } // acsess denied static function err403() { header('HTTP/1.1 403 Forbidden'); header(' ', TRUE, 403); header('Location: http://'.$_SERVER['HTTP_HOST'].'/403.html'); } static function last_chance($name) { if (file_exists('app/view/html/view_'.$name.'.html')) { echo 'Yay, found "app/view/html/view_'.$name.'.html"!'; die(); } else { self::err404(); } } } pps: метод last_chance добавлен ради того, чтобы проверять наличие хтмл-файла и создавать новый класс внутри этого метода. Я понимаю, что этот метод должен возвращать объект – напишу чуть позже, когда пойму как вообще создать новый класс динамически )-: Вместо него я раньше сразу вызывал 404.