За последние 24 часа нас посетили 19320 программистов и 1605 роботов. Сейчас ищут 875 программистов ...

Динамическое создание класса в MVC – как?

Тема в разделе "PHP для новичков", создана пользователем TrogWar, 8 апр 2013.

  1. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Доброго времени суток!

    Что есть сейчас:
    Пишу свою MVC (велосипед обучения ради) и сейчас, чтобы добавить новую страницу на сайт нужно вручную создать php файлы с моделью, контроллером, представлением и, собственно, хтмл-файл с содержимым. В самом простом случае, первые три содержат только две строки – например, для страницы "example.com/coolpage" файл /app/controller/controller_coolpage.php будет выглядеть так:
    Код (Text):
    1. <?php class Controller_Coolpage extends Controller {}
    за счёт того, что в классе "Controller" уже написан дефолтный action_index(), в которых вызываются модель и представление.
    NB: Листинг касса "Router" прилагаю внизу поста.

    Такой код отрабатывает успешно:
    Код (Text):
    1.  
    2. <?php
    3. if (file_exists('app/view/html/view_'.$name.'.html')) {
    4.     echo 'Yay, found "app/view/html/view_'.$name.'.html"!';
    5.     die();
    6. } else {
    7.     self::err404();
    8. }
    Погуглил и читал про фабрики, но то, что я нашёл требует уже готовых файлов классов (фактически, выборка), что не есть гуд. Вероятно, наткнулся на некачественный материал?

    Вопрос:
    Каким образом создать новый класс, который наследует Controller и имеет имя Controller_Coolpage "на лету" в случае обнаружения только одного хтмл-файла? И не плодить тучу php-файлов из одной строки, а только там, где нужно переопределить стандартные классы.

    ps: так же буду рад замечаниям по поводу безопасности реализации роутера, если в нём увидите какие-либо дыры.

    Спасибо за внимание.

    Router:
    Код (Text):
    1.  
    2. <?php
    3.     class Router {
    4.         static function run() {
    5.             $routes = explode('/', $_SERVER['REQUEST_URI']);
    6.  
    7.             // get MVC values or set default
    8.             $name = $model_name = $view_name = $controller_name = (!empty($routes['1'])) ? $routes['1'] : 'Main';
    9.             $action_name = (!empty($routes['2'])) ? $routes['2'] : 'index';
    10.             $name = strtolower($name);
    11.  
    12.             // set MVC classnames
    13.             $model_name = 'Model_'.$model_name;
    14.             $controller_name = 'Controller_'.$controller_name;
    15.             $action_method_name = 'action_'.$action_name;
    16.             $view_name = 'View_'.$view_name;
    17.  
    18.             // set MVC filenames
    19.             $model_file = strtolower('app/model/'.$model_name.'.php');
    20.             $controller_file = strtolower('app/controller/'.$controller_name.'.php');
    21.             $view_file = strtolower('app/view/'.$view_name.'.php');
    22.  
    23.             // including main MVC files
    24.             require_once 'app/model/model.php';
    25.             require_once 'app/view/view.php';
    26.             require_once 'app/controller/controller.php';
    27.  
    28.             // including page MVC files
    29.             if (file_exists($model_file)) require_once $model_file;
    30.             else self::last_chance($name);
    31.             if (file_exists($view_file)) require_once $view_file;
    32.             else self::last_chance($name);
    33.             if (file_exists($controller_file)) require_once $controller_file;
    34.             else self::last_chance($name);
    35.  
    36.             // create controller and launch
    37.             $controller = new $controller_name;
    38.             if (method_exists($controller, $action_method_name)) $controller->$action_method_name($name, $action_name);
    39.             else self::err404();
    40.         }
    41.  
    42.         // not found
    43.         static function err404() {
    44.             header('HTTP/1.1 404 Not Found');
    45.             header(' ', TRUE, 404);
    46.             header('Location: http://'.$_SERVER['HTTP_HOST'].'/404.html');
    47.             die();
    48.         }
    49.  
    50.         // acsess denied
    51.         static function err403() {
    52.             header('HTTP/1.1 403 Forbidden');
    53.             header(' ', TRUE, 403);
    54.             header('Location: http://'.$_SERVER['HTTP_HOST'].'/403.html');
    55.         }
    56.  
    57.         static function last_chance($name) {
    58.             if (file_exists('app/view/html/view_'.$name.'.html')) {
    59.                 echo 'Yay, found "app/view/html/view_'.$name.'.html"!';
    60.                 die();
    61.             } else {
    62.                 self::err404();
    63.             }
    64.         }
    65.  
    66.     }
    pps: метод last_chance добавлен ради того, чтобы проверять наличие хтмл-файла и создавать новый класс внутри этого метода. Я понимаю, что этот метод должен возвращать объект – напишу чуть позже, когда пойму как вообще создать новый класс динамически )-: Вместо него я раньше сразу вызывал 404.