我的MVC PHP应用程序在哪里放置这个构建函数?

时间:2014-06-06 06:57:40

标签: php oop model-view-controller

我正在尝试将我的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>';
    }
}

并且控制器询问模型用户是否已登录?

感谢。

3 个答案:

答案 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);