MVC - 将表单提交给控制器或模型

时间:2014-07-12 10:32:23

标签: php

我正在尝试将一个简单的MVC模式应用到我当前的网站而没有任何框架。因为我还没有真正进入oop,但我现在还在使用程序。

我有一个简单的登录表单(查看)

<form action="controller/login.php" method="Post">
<input type="text" name="username" placeholder="Username" />
<input type="text" name="password" placeholder="Password" />
<input type="submit" value="Sign in" />
</form>

此表单将提交给控制器以登录表单。控制器现在将检查两个字段是否都有输入并且或多或少地“清理”输入

if(isset($_POST['username'])){
$username = $_POST['username'];
$password = $_POST['password'];
$username_escape = mysqli_real_escape_string($connect, $username);
$password_escape = mysqli_real_escape_string($connect, $password);
}

header("../model/login.php");

现在这是一个非常简单的检查但是我现在想知道我是否应该将控制器包含在模型中并从控制器或表单重定向到模型在第一时间提交并包含控制器。

模型

include_once("../controller/login.php");
$query = mysqli_query($connect, "INSERT into DB_table (username, password)
VALUES($username_escape, $password_escape)");

2 个答案:

答案 0 :(得分:5)

你试图将你的顾虑分开是件好事,但MVC是一种基于OOP原则的设计模式。

OOP使用对象,这些对象由类定义,类似于蓝图。

因此,在此示例中,您希望所有内容都通过控制器,然后根据您是否要保存,您需要调用模型。

例如

class LoginController
{
    public function indexAction()
    {

        $username = $_POST['username'];
        $password = $_POST['password'];

        if(!is_null($username) AND !is_null($password))
        {
             $user = new \Service\User();
             $credentialsAreValid = $user->checkCredentials($username, $password);
             if($credentialsAreValid)
             {
                 header("Redirect: Somewhere");
             }
        }

        require_once __DIR__."/../templates/login.php";

    }

}

class User
{
    public function checkCredentials($username, $password)
    {
         $dsn = "mysql:host=localhost;dbname=db";
         $dbuser = "root";
         $dbpass = "pass";
         $db = new PDO($dsn, $dbuser, $dbpass);

         $db->prepare("SELECT * FROM user WHERE username = ? AND password = ?");
         $db->bindValue(1, $username);
         $db->bindValue(2, $password);

         $res = $db->execute();
         if(count($res->fetchAll()>0) return true;
         return false;
    }
}

正如您所看到的,逻辑被分成一个服务,只有在需要时才被调用。我们还使用了pdo来防止SQL注入,(虽然不应该在这里创建对象)。

我建议您研究一下自动加载,并与Silex这样的框架进行游戏,因为它会教你这些原则。

答案 1 :(得分:3)

  1. AS FOR MODELS,为每个db表创建一个模型类。在每个类中,声明特定操作的方法,例如用户模型中的saveRegistrationForm($ form)(对于用户表)。不要在模型内部调用控制器!

  2. IN CONTROLLER,包含MODELS,因此您可以调用他们的方法。在控制器中,您可以将帖子读入某些变量(就像您一样),然后以某种方式验证它们,然后使用特定的模型方法将数据保存到db。

  3. 根据你的问题判断,我认为你的MVC和OOP知识很少。如果你想深入研究这些主题(好主意!),在你尝试创建自己的框架之前,我会首先尝试使用各种MVC框架并学习它们的工作原理。 :)