MVC в PHP - Как контроллер узнает представление? - PullRequest
2 голосов
/ 05 января 2012

Я новичок в MVC в PHP и мне просто интересно, как это лучше всего сделать? На данный момент у меня есть простая установка, подобная этой:

  • Модель
    • User.php
  • Контроллер
    • controller.php
  • Посмотреть
    • login.php
    • register.php
    • my_account.php

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

Мой главный вопрос: как лучше всего иметь страницы вызова контроллера? В настоящее время это выглядит примерно так:

public function show_page()
{
  if ($_GET['p'] == "login")
  { 
     include('View/login.php'); 

     if (isset($_POST['username']))
     {
        $this->user->login($_POST['username'], $_['pass']
     }

  }
  if ($_GET['p'] == "register") { include('View/register.php'); }
  if ($_GET['p'] == "my_account") { include('View/my_account.php'); }
}

Это не кажется логичным, я делаю это неправильно?

Ответы [ 3 ]

2 голосов
/ 05 января 2012

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

То, что вы здесь изложили, мне кажется несколько размытым. Я думаю, что вы должны проверить реализации, такие как Pure mvc или symfony , чтобы вы могли быстро овладеть концепцией. Я считаю, что вы (или кто-либо еще в этом отношении) не должны заново изобретать колесо , а изучать, понимать и улучшать то, что вы можете получить.

Если вы собираетесь создать свою собственную инфраструктуру MVC, вам следует проверить базовые концепции MVC и планировать свое программное обеспечение , прежде чем пытаться написать его.

1 голос
/ 05 января 2012

Большинство основанных на PHP фреймворков MVC, которые я использовал, используют фронт-контроллер .Файл .htaccess направляет весь трафик в один (обычно index.php) файл (обычно) в корне проекта.

Этот файл определяет, какой контроллер application загрузить.,Затем этот контроллер отвечает за любую и всю логику уровня приложения.

в платформе, которую я написал, в моем фронт-контроллере Я делаю это

$page = tgsf_parse_url();
require resolve_controller( $page );

* 1014Функция * tgsf_parse_url в вышеприведенном коде анализирует $_SERVER['REDIRECT_URL'], чтобы определить, какие переменные передаются.

resol_controller в приведенном выше коде обрабатывает перехватчики плагинов и условия 404, но нижняяСтрока заключается в том, что он всегда возвращает путь для отправки, чтобы включить / потребовать, чтобы область видимости переменной не стала проблемой (в том числе в области действия ограничений функции)

Все переменные, которые установлены в контроллере, автоматически доступныв представлении, когда вы включаете представление, подобное этому:

// this is an application level controller file
$name = 'Mr. Example';
include view( 'example' );

Затем в файле представления:

<h2><? echo $name; ?></h2>
0 голосов
/ 05 января 2012

То, что у вас есть, вообще не является динамическим.

Вот как я это делаю в моем MVC :

private function loadView(){        

    //Bring the variables to the global scope
    extract($this->getAll()); //load all variables into local scope

    if(Config::get('view')){
        $template_file = 'view/' . Config::get('view') . '/' . Config::get('method') . '.stp';
        if(is_file($template_file)){
            include $template_file;
        }
        else {
            include 'view/missingview.stp'; //no such view error
        }
    }
    else {
        Config::set('template', 'blank');
        include 'view/missingfunction.stp'; //no such function error
    }

}

Есть что-то для установки viewгде-то в коде.

Вот как я устанавливаю view в контроллере:

public function __construct(SessionManager $SESSION) {

    $this->pageOn = Config::get('page');
    $this->session = $SESSION;
    $model_name = $this->name;
    if(class_exists($model_name) && is_subclass_of($model_name, 'AppModel')){
        /**
         * @var AppModel $model_name
         */
        $this->$model_name = new $model_name();
    }
    else {
        //default model (no database table chosen)
        $this->$model_name = new AppModel();
    }
    /* Get all posts */
    $this->posts = $this->$model_name->getPosts();

    Config::set('view', strtolower($model_name)); //<<RIGHT HERE!

    if(!$this->session->get(strtolower($model_name))){
        $this->session->set(strtolower($model_name), array());
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...