我正在尝试学习Web应用程序的MVC设计模式,所以我决定编写自己的PHP MVC框架。在写这篇文章之前,我读了很多关于MVC的教程和论坛。现在我非常了解MVC的想法,以及如何沟通控制器模型视图。我写了路由器和几个模块(登录,类别,......) - 似乎它正在工作。
现在我有点困惑:
如果我拨打localhost/LogIn
,我只会收到登录表单,如果我拨打localhost/categories
我会收到类别列表。一切都还好,但我想创建索引控制器,并在调用localhost/index
时,我想查看登录表单,类别和更多模块。
我应该从indexController.php
呼叫控制器(登录,类别)吗?
我需要建议如何在一个页面中连接所需的模块。
答案 0 :(得分:0)
不,控制器不应该调用彼此的功能。一些框架引入了“helpers”来实现您的需求。
控制器可以使用相同的模型,并且视图无论如何都会有所不同,因此您可以使用类别模型为您提供要显示的类别(例如$ categories-> getCategoriesList()),然后在类别控制器中使用它视图以及索引控制器视图。
从另一个控制器调用一个控制器的合法方法是通过形成HTTP请求 - 例如接收HTML片段(另一个控制器渲染视图),通过AJAX或使用指向另一个控制器的源的iframe显示在视图中(这是一个笨拙的解决方案,主要用于想法说明)。
答案 1 :(得分:0)
你需要几件事:
您需要一个.htaccess文件,该文件会导致所有请求都通过索引文件,这里只是一个简单的文件:
RewriteEngine On
RewriteBase /demo
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]
在index.php文件中,您需要设置包含路径,因此您不必显式包含模块/控制器/视图或您选择的任何其他类:
define("APPLICATION_PATH", realpath('.'));
$paths = array(
APPLICATION_PATH.'/controllers',
APPLICATION_PATH.'/models',
APPLICATION_PATH.'/views',
APPLICATION_PATH.'/libs',
APPLICATION_PATH.'/includes',
get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $paths));
现在为自动加载类添加'魔术方法'(自动调用)并初始化你的Bootsrap类:
function __autoload($className){
$fileName = str_replace('\\','/', $className);
require_once "$fileName.php";
}
new Bootstrap();
bootstrap.php中:
<?php
class Bootstrap {
public function __construct() {
$url = $_GET['url'];
$params = explode('/', $url);
//if controller exist - call it, else call login controller
if (isset($params[0]) && $params[0]){
$controller = new $params[0]();
}
else{
$controller = new login();
}
//if method exist - call it, else call index method
if (isset($params[1]) && $params[1]){
//if parameter exit - call method with param, else call witout param
if (isset($params[2]) && $params[2]){
$controller->$params[1]($params[2]);
}
else{
$controller->$params[1]();
}
}
else{
$controller->index();
}
}
}
那应该给你一个基本的MVC框架。
答案 2 :(得分:0)
使用您的控制器(index.php)集中在每个页面上使用的代码(请求验证程序,错误句柄,异常处理程序,会话内容)。
创建一个Router类以获取正确的模型。允许模型获得正确的视图。我在其他答案(https://stackoverflow.com/questions/42172228/is-this-how-an-mvc-router-class-typically-works)中包含了一些UML图表以帮助解决问题。请记住,尝试编程为抽象接口,而不是具体实现。