【问题标题】:Where in my MVC PHP app do I put this build function?在我的 MVC PHP 应用程序中,我应该把这个构建函数放在哪里?
【发布时间】:2014-07-27 09:07:08
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • @Daan 哎呀。不知道我是怎么弄错的。
  • 这是一个特定于演示的用户可见字符串,它显然属于视图中的某个位置。
  • @deceze “我对 MVC 没有太多经验”-OP 是的,显然......

标签: php oop model-view-controller


【解决方案1】:

把这个函数放在你调用登录函数的控制器中,如果用户通过身份验证,那么它将设置会话或闪存数据,即 $this->session->set_flashdata('success', 'you are login in作为 $username'); 别的 重定向('登录');

【讨论】:

    【解决方案2】:

    我认为视图不应该包含任何业务逻辑。视图应该专注于呈现东西,所以你的第二个解决方案是不好的做法。

    不仅如此,由于视图专注于表示,模型处理大部分业务逻辑,控制器应该只做必要的事情来链接视图和模型,这意味着从模型中获取数据并将数据插入到视图中。

    所以这行代码没有意义,因为它意味着你在控制器中实现业务逻辑:

    $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://myweb.com/member/check'这样的http请求。

    路由器代码是这样的:

        $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 文件,你就会明白我的意思是路由器和控制器。

    【讨论】:

    • 感谢您的反馈。我已经在我的应用程序中实现了一个基本的路由器,它正在运行,我只是没有提供该代码,因为它听起来没有必要。
    【解决方案3】:

    我不认为 MVC 的目的是将 HTML 放入控制器中,如果我是你,我会发回一些数据并根据发送数据在我的视图中创建 if else 语句。要充分利用 MVC,您首先需要了解它是什么或做什么,因此我建议您搜索教程。

    【讨论】:

    • 我已经阅读了一些教程,尤其是 PHP 教程,但我不是教程的粉丝,而且我已经有了一个非 MVC 库,我宁愿尝试转换也不愿重写。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多