MVC——向控制器或模型提交表单


MVC - Submit form to controller or model

我试图应用一个简单的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)");

你试图分离你的关注点是好的,但是MVC是一种基于面向对象原则之上的设计模式。

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);
       
         $sth = $db->prepare("SELECT * FROM user WHERE username = ? AND password = ?");
         $sth->bindValue(1, $username);
         $sth->bindValue(2, $password);
         $sth->execute();
         if(count($sth->fetchAll())>0) return true;
         return false;
    }
}

正如您所看到的,逻辑被分离到一个服务中,并且只在需要时调用。我们还使用了PDO来防止SQL注入(尽管不应该在这里创建对象)。

我建议你研究一下自动加载,并尝试一下像Silex这样的框架,因为它会教你这些原则。

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

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

从你的问题来看,我认为你的MVC和OOP知识很少。如果您想深入研究这些主题(好主意!),我建议您在尝试创建自己的框架之前,先使用各种MVC框架并了解它们是如何工作的。:)