PHP中的MVC - 控制器如何知道视图?

时间:2012-01-05 16:50:54

标签: php model-view-controller

我是PHP新手MVC,我只是想知道最好的方法是什么? 目前我有一个简单的设置:

  • 模型
    • 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 个答案:

答案 0 :(得分:2)

我认为最好的方法是使用某种路由系统,这样你就可以在某处使用可能的url模式/页面来显示组合,并在决定调用哪个控制器之后您可以在控制器中加载适当的视图。

你在这里介绍的内容对我来说似乎有点模糊。我认为你应该查看那里的实现,如Pure mvcsymfony,这样你就可以快速掌握这个概念。我相信你(或任何其他人)不应该重新发明轮子,但要学习,理解和改进你能得到的东西。

如果您要创建自己的MVC框架,那么在尝试编写之前,您应该查看basic MVC concepts计划您的软件

答案 1 :(得分:1)

我使用的大多数基于PHP的MVC框架都使用前端控制器。 .htaccess文件将所有流量定向到项目根目录中的单个(通常是index.php)文件。

此文件负责确定要加载的应用程序控制器。然后该控制器负责任何和所有应用程序级逻辑。

在我写的框架中,在我的前端控制器中我这样做

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

上述代码中的tgsf_parse_url函数解析$_SERVER['REDIRECT_URL']以确定传递的变量。

上面代码中的resolve_controller处理插件挂钩和404条件,但最重要的是它始终返回一个发送到include / require的路径,以便变量作用域不会成为问题(包括一个函数限制变量范围)

当您包含如下视图时,控件中设置的任何变量都将自动在视图中可用:

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

然后在视图文件中:

<h2><? echo $name; ?></h2>

答案 2 :(得分:0)

你所拥有的一切都不是动态的。

这就是我在my 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());
    }

}