Инициализация просмотра, шаблона и контроллера и модели является необязательной

Я был слишком сонлив, когда задал вопрос, так извините за это, так или иначе, чтобы понять, что я подготовил вопрос в течение 2 часов.

Я пытаюсь организовать свой код и решил организовать его mvc'ish (mvc-like), я не знаю, могу ли я следовать всем принципам, но я хотел быть как минимум близок к этому.

В моем приложении есть фронт-контроллер (не знаю, если мое определение правильное), так что весь http-запрос моего приложения будет проходить через одну точку, в моем случае index.php в корневом каталоге моего приложение.

Сказав, что я настроил это так, вы можете себе представить, что я использовал .htaccess для направления всего запроса на index.php.

Я взорвал url и создал массив из него, $url[], как это. Поэтому всякий раз, когда я получаю доступ к моему приложению, как этот http://localhost/app/pagename, он будет обращаться к контроллеру (pagename_controller)

Я сделал это вот так:

$file = $controller_path . $page . '_controller.php';

if (file_exists($file)) {
    require $file;
    $class_name = ucfirst($page) . '_controller';
    $target = new $class_name();
}

Также я завершаю его в контейнере, "узор декоратора", для будущего использования, возможно, проверки. например:

$controller = new Wrap($target);
$controller->index();

Я не знаю, подходит ли использование имени переменной $controller, поэтому, пожалуйста, простите меня, когда все будет неправильно.

Мне кажется, что я могу настроить свое приложение следующим образом:

  • пользователь отправляет запрос, как? с помощью приложения означает, что он отправляет http-запрос, который загрузит начальное состояние приложения

    credit : phparchitect design patterns

Как вы можете видеть на диаграмме моей желаемой структуры приложения, я смог выполнить только первую часть, которая должна направить запрос на одну запись (index.php)

Теперь проблема заключается в инициализации других частей приложения.

С этого момента у меня есть 3 файла, которые я хочу настроить, но я смущен тем, как.

index_controller, index_view, Template

class Index_controller {
    private $model;
    private $view;

    public function __construct(){
        // optional model -> $this->model = 'index' 
        $this->view = 'index'  // 
    }

    public function index(){
        $this->load->view($this->view)
    }
}

class Index_view {
    private $model;
    private $template;

    public function __construct(Model $model = null){
         $this->template = new Template('default');
    }

    public function view() {
         $this->template->assign('css', 'default_css'); // don't know if this is efficient
         // or $this->template->assign('header', 'default_header');
         // or $this->template->assign('sidebar', 'default_sidebar');
         // or $this->template->assign('footer', 'default_footer');
         // or any other things I want to use in the template
    }
}

class Template {

    public $data = array();
    private $tmpl;

    public function __construct($template) {
         $this->tmpl = $template . '_tmpl.php';
    }

    public function assign($name, $value){
        $this->data[$name] = $value;
    }

    // public function output
    // function that will explode the data array and render it out as a webpage
    // I'll create templates and
}

С этой стороны я хочу знать, как мне связать эти вещи вместе. На данный момент у меня есть папка system, которая может содержать классы, и я настраиваю автозагрузчик для этой папки.

Я думаю о создании класса Controller и View, который действует как ActionFactory и ViewFactory, как показано на диаграмме, хотя я знаю, что это не их обязанности.

Я думаю об этом:

class Controller {

    protected $load;
    public function __construct() {
        $this->load = new View();
    }
}

class View {
    public function __construct() {
    // some things i don't know
    }

    public function view() {
    // some things i don't know
    }
}

Каковы ваши предложения и комментарии в моей настройке. Как я могу инициировать триаду?

Ответ 1

Хорошо, не слишком сильно зацикливайтесь на деталях реализации. Вы можете прочитать об обеспечении безопасности в какой-то другой момент. Поговорите с вашим вопросом...

Я действительно создал фреймворк, который работает по строкам, которые вы пытаетесь реализовать. Я думаю, что вам не хватает класса RoutingHandler. Маршрутизация - это физическая манипуляция URL-адресом, которая сообщает вашему приложению, какой контроллер загрузить, и какое действие выполнить.

В моем мире у меня также есть модули, поэтому основная схема маршрутизации

Module -> Controller -> Action

Эти три элемента отображают мою схему URI таким образом. Переменные могут быть добавлены так же...

http://www.domain.com/module/controller/action/var1/val1/var2/val2

Итак, что происходит после анализа URI, и управление передается соответствующему контроллеру и действию? Позвольте сделать некоторый код, чтобы продемонстрировать простой пример...

<?php    
    class indexController extends Controller {

        protected function Initialize() {
            $this->objHomeModel = new HomeModel;

            $this->objHeader = new Header();
            $this->objFooter = new Footer();

            $this->objHeader
                ->SetPageId('home');
        }

        public function indexAction() {
            $this->objHeader->SetPageTitle('This is my page title.');
        }
    }
?>

В методе Initialize я устанавливаю некоторые элементы всего контроллера и захватываю экземпляр моей модели для использования позже. Реальное мясо находится в методе indexAction. Здесь вы можете настроить материал, который будет использоваться в вашем представлении. Например...

public function randomAction() {
    $this->_CONTROL->Append($intSomeVar, 42);
}

_CONTROL - это массив значений, которые я манипулирую и передаю в представление. Класс Controller знает, как найти правильный шаблон для представления, потому что он назван в честь действия (и в каталоге sibling).

Родительский класс Controller берет имя метода действия и анализирует его так...

indexAction -> index.tpl.php

Здесь вы также можете сделать некоторые другие забавные вещи...

Application::SetNoRender();

... скажет контроллеру не отображать внутри шаблона, а просто завершить метод. Это полезно для тех ситуаций, когда вы действительно ничего не хотите выводить.

Наконец, все контроллеры, модели и представления живут внутри их собственного каталога, например...

my_module
    controllers
        indexController.class.php
        someotherController.class.php
        :
        :
    models
        HomeModel.class.php
        :
        :
    templates
        index.tpl.php
        someother.tpl.php
        :
        :

Я мог бы продолжать, но я пишу это по памяти, и есть некоторые морщины здесь и там, но, надеюсь, это дает вам пищу для размышлений.