我正在尝试将我的PHP应用转换为更多的MVC应用。我对MVC没有太多经验,我不完全理解一些/所有概念或如何用PHP做,所以我需要一些帮助来理解特定功能的去向。
此函数返回一些HTML,具体取决于用户是否已登录。
public function buildLoggedInMessage() {
if ($this->User->isLoggedIn()) {
return ' You are logged in as <strong>'.$this->User->getUsername().'</strong> (<a href="/logout.php">logout</a>)';
} else {
return ' <a href="/login.php">Login</a>';
}
}
我最初的想法是将此功能放在我的“控制器”中,因为它询问User
模型是否已登录(检查数据库记录),但是它“构建”了一些HTML,所以也许它应该在视图中。我应该搬家吗?
我最终会将HTML从函数移动到模板中,因此请忽略内联HTML。
如果它是这样的话,该函数是否更适合于视图:
public function buildLoggedInMessage() {
if ($this->Controller->isLoggedIn()) {
return ' You are logged in as <strong>'.$this->User->getUsername().'</strong> (<a href="/logout.php">logout</a>)';
} else {
return ' <a href="/login.php">Login</a>';
}
}
并且控制器询问模型用户是否已登录?
感谢。
答案 0 :(得分:0)
我认为视图不应包含任何业务逻辑。观点应该集中在呈现内容,所以你的第二个解决方案是不好的做法。
更重要的是,由于视图侧重于表示,模型处理大多数业务逻辑,因此控制器应该只做必要的事情来链接视图和模型,这意味着从模型中获取数据并将数据插入到视图中。
所以这行代码毫无意义,因为它意味着你在控制器中实现业务逻辑:
$this->Controller->isLoggedIn()
现在让我们看看你的第一个解决方案。
public function buildLoggedInMessage() {
if ($this->User->isLoggedIn()) {
return ' You are logged in as <strong>'.$this->User->getUsername().'</strong> (<a href="/logout.php">logout</a>)';
} else {
return ' <a href="/login.php">Login</a>';
}
}
这个函数'return'htmls而不是'echo'htmls。那么谁在调用这个函数呢?谁将从这个函数'回显'字符串?我会说这不是一个完整的控制器。
在现代Web MVC中,总有某种“路由器”处理http请求并执行与此相关的一些指令。由于您想要实现MVC模式,您需要首先实现“路由器”。
例如,您可以创建一个“成员”类,该类具有“检查”方法以实现您想要的功能。
class Member{
public function check() {
if ($this->User->isLoggedIn()) {
echo ' You are logged in as <strong>'.$this->User->getUsername().'</strong> (<a href="/logout.php">logout</a>)';
} else {
echo ' <a href="/login.php">Login</a>';
}
}
}
您需要实现路由器类来处理http请求,例如“http://myweb.com/member/check”。
路由器代码将是这样的:
$url_segments = explode('/', $_SERVER['REQUEST_URI']);
if (count($url_segments) == 4){
$controller_name = $url_segments[2];
$method_name = $url_segments[3];
}
else if (count($url_segments) == 3){
$controller_name = $url_segments[2];
$method_name = $this->default_method;
}
else if (count($url_segments) == 2){
$controller_name = $this->default_controller;
$method_name = $this->default_method;
}
$this->current_controller = $controller_name;
$this->current_method = $method_name;
require BASEPATH . '/controller/' . $controller_name . '.php';
$class_name = ucfirst($controller_name);
$controller = new $class_name($method_name);
call_user_func( array( $controller, $method_name ) );
创建MVC框架并不是一件容易的事。 我为教育目的创建了一个简单的MVC框架。 https://github.com/howtomakeaturn/PigFramework
检查index.php文件,你就会知道我的意思是路由器和控制器。
答案 1 :(得分:0)
我不认为MVC的重点是将HTML放在控制器中,如果我是你,我会发回一些数据并根据发送数据在我的视图中生成if else语句。要充分利用MVC,首先需要了解它是什么或做什么,所以我建议您搜索一个教程。
答案 2 :(得分:-2)
将此功能放在您调用登录功能的控制器中,如果用户通过身份验证,则会设置会话或闪存数据,即$ this-&gt; session-&gt; set_flashdata(&#39; success&#39 ;,&#39;你被用作$ username&#39;); 其他 重定向(&#39;登录&#39);