所以我一直在研究和构建我自己的MVC框架,但一直在尝试6种不同的实现方式,我想知道我目前的做法是否正确。是的,我知道我可以使用Zend或其他类似的东西,但我真的想学习框架是如何工作的,而不仅仅是使用别人的。
这是我的索引文件的一个简单版本:
if(isset($_GET['url']))
{
$url = strtolower($_GET['url']);
}
else
{
$url = 'home';
}
switch($url) // Select the controller based on the GET var in the url
{
case 'home': include(ROOT_DIR . 'app/controllers/homeCon.php'); // This page has the link to the DB test page on it
break;
case 'dbtest': include(ROOT_DIR . 'app/controllers/dbTestCon.php');
break;
default: include(ROOT_DIR . 'app/views/error404View.php');
}
这是我的dbTestCon.php控制器的一个简单版本:
if(isset($_POST['dbSubBtn']))
{
$model = new DbTestModel();
if($_POST['firstName'] != '' && $_POST['lastName'] != '')
{
$model->submitToDb($_POST['firstName'], $_POST['lastName'])
$model->displayPage('goodToGo');
}
else
{
$model->displayPage('noInput');
}
}
else
{
$model->displayPage('normal');
}
这是我的DbTestModel.php:
class DbTestModel
{
public function displayPage($version)
{
$title = "DB Test Page";
$themeStylesheetPath = 'public/css/cssStyles.css';
include(ROOT_DIR . 'app/views/headerView.php');
include(ROOT_DIR . 'app/views/dbTestView.php');
switch($version)
{
case 'goodToGo':
include(ROOT_DIR . 'app/views/dbTestSuccessView.php');
break;
case 'noInput':
include(ROOT_DIR . 'app/views/noInputView.php');
break;
}
include(ROOT_DIR . 'app/views/footerView.php');
}
public function submitToDb($firstName, $lastName)
{
try
{
$db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = $db->prepare('insert into dbtest(firstName, lastName) values(:firstName, :lastName)');
$sql->bindParam(':firstName', $firstName);
$sql->bindParam(':lastName', $lastName);
$sql->execute();
$db = null;
}
catch(PDOException $e)
{
echo "It seems there was an error. Please refresh your browser and try again. " . $e->getMessage();
}
}
}
这是我的dbTestView.php:
<form name="dbTestForm" id="dbTestForm" method="POST" action="dbtest">
<label for="firstName">First Name</label>
<input type="text" name="firstName" id="firstName" />
<label for="lastName">Last Name</label>
<input type="text" name="lastName" id="lastName" />
<input type="submit" name="dbSubBtn" id="dbSubBtn" value="Submit to DB" />
</form>
这个简单的例子在我的测试环境中有效,但我担心我会在下一个项目中开始使用它,并在进行到一半时意识到我的框架存在根本问题,必须重新开始。谢谢你的帮助或建议。
不,这不是正确的方式
-
完全不完善的路由机制:
在当前的代码库中,您必须手动注册每个控制器,这显然会使引导阶段(index.php文件)变得混乱和容易出错。
-
你有"模型"呈现模板
即使在MVC设计模式最原始的解释中,这也是错误的。视图应该是包含表示逻辑的实例,而不是由您称之为"模型"的东西呈现的模板。
-
模型是一个层次,而不是任何单一类别的
MVC设计模式由两层组成:表示层和模型层。模型层包含所有域业务逻辑,并通过某种形式的抽象与存储交互。
-
不要每次都重新初始化数据库连接。
每次需要使用数据库时,您的"模型"都会初始化新的PDO实例。相反,您应该只创建一次连接实例,并通过构造函数将其传递给每个对象。
-
停止编写带有隐藏警告和错误消息的代码!
在同一个地方同时进行数据存储(如模型逻辑)和输出(如视图逻辑)通常被认为是不好的形式,这种情况在DbTestModel中发生。
你可以做大量的重构,但我不会为你详细说明,因为我最终会写段落。
我敦促你阅读Fabien Potiencer的博客系列创建你自己的框架。。。位于Symfony2组件之上。
即使你不想使用他的组件来帮助构建任何东西,它也应该给你一堆好主意。