我不知道一个好的MVC模式,现在学习......所以,我想做:从数据库中获取行,如果结果没有(0行)打印“我们没有结果”,否则打印结果。
在模型中我有这个PHP代码
function getAutos () {
//here connect to database
$res = $this->db->query("SELECT names FROM auto");
if ($res->num_rows == 0) {
return "we have no results";
}
else {
return $res;
}
}
这个函数返回对象或字符串,对吗?现在我认为:
<!--some html code -->
<?php
$resultFromGetAutos = /*result from function getAutos ()*/
if (is_object(resultFromGetAutos)) {
while ($row = resultFromGetAutos->fetch_assoc()) {
echo row['names']."<br>";
}
}
else {
echo resultFromGetAutos;
}
?>
<!--some html code -->
它有效,但据我所知,许多PHP代码在视图中,是不正确的MVC,也就是当我在视图中检查结果类型时:if (is_object(Resultat)) {do something} else { do other something }
这不是正确的MVC概念?如果不对,在这种情况下如何正确的方式?
答案 0 :(得分:3)
MVC中的模型不是类或对象。模型为layer,其中包含应用程序中的所有域业务逻辑。虽然它可能与数据库交互,但它不应该在任何时候直接创建连接。您可以阅读this post。它将包含一些方向。
这里的底线是,你所谓的“模特”,甚至不接近原始概念。
对于视图,在适当的MVC(或MVC启发)模式实现中,视图负责所有表示逻辑。这意味着视图会决定用户可以看到的内容。它是通过从模型层获取信息(通过在经典MVC和Model2 MVC中直接请求,并通过MVP和MMVM模式中的类似控制器的结构获取)来确定的。
在Web应用程序中,视图会创建响应。响应的形式将根据所使用的请求或接口的不同而不同。 View可以通过组合多个templates或仅发送一个HTTP位置标头来创建响应。
答案 1 :(得分:1)
MVC设计的原则之一是模型和视图不能直接访问彼此,甚至不知道彼此。
大多数情况下,观点是最愚蠢的。它应该不理解它正在显示的数据,它应该如何显示“数据”,这可能是一切。
你应该有一个控制器,如果它想要汽车,它会被视图注意到。然后控制器应该向模型询问汽车,并将模型的返回值解析为视图可以直接显示的格式。
或者,如果您已经在页面加载中使用这些汽车,请通过构造函数(示例)执行此操作
它应该看起来像这样::
<View> // you shouldn't include that, that's just that readers notice it is the view.
<?php
// a bunch of other code
function AutoView($whatViewShouldDisplay) { // should be the constructor, OOP PHP is not my strongest point
$content = $whatViewShouldDisplay;
echo $content;
}
?>
<Controller>
<?php
// Bunch of other code
function AutoController() { // should-be constructor
$model = new AutoModel();
$result = $model->getAutos();
if ($result->num_rows != 0) {
while ($row = resultFromGetAutos->fetch_assoc()) {
$viewContent .= row['names']."<br>";
}
}
else {
$viewContent = "Sorry, no results found.";
}
$view = new AutoView($viewContent);
}
?>
<Model>
<?php
// Bunch of other code
function getAutos() {
return $this->db->query("SELECT names FROM auto");
}
?>
如您所见,只要Model实现返回SQL结果集的方法getAutos()
并且视图具有one-args构造函数,您就可以用所有内容替换它们!
或者,记住您的代码:
<!--some html code -->
<?php
$text = $controller->requestContentForThisPlace(); // Something like getMainContent()? I don't know where this is on your page.
echo $text;
?>
您的代码的Controller将实现此方法:
function requestContentForThisPlace() {
$result = $model->getAutos();
if ($result->num_rows != 0) {
while ($row = resultFromGetAutos->fetch_assoc()) {
$content .= row['names']."<br>";
}
}
else {
$content = "Sorry, no results found.";
}
return $content;
}