我是PHP新手MVC,我只是想知道最好的方法是什么? 目前我有一个简单的设置:
该模型具有登录和注册的所有数据库功能,视图文件具有相关的工作表单。
我的主要问题是,控制器呼叫页面的最佳方法是什么?目前,它看起来像:
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'); }
}
这似乎不符合逻辑,我做错了吗?
答案 0 :(得分:2)
我认为最好的方法是使用某种路由系统,这样你就可以在某处使用可能的url模式/页面来显示组合,并在决定调用哪个控制器之后您可以在控制器中加载适当的视图。
你在这里介绍的内容对我来说似乎有点模糊。我认为你应该查看那里的实现,如Pure mvc或symfony,这样你就可以快速掌握这个概念。我相信你(或任何其他人)不应该重新发明轮子,但要学习,理解和改进你能得到的东西。
如果您要创建自己的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());
}
}