繁体   English   中英

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 原则的设计模式。

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. 对于模型,为每个 db 表创建一个模型类。 在每个类中,声明特定操作的方法,例如用户模型中的 saveRegistrationForm($form)(用于用户表)。 不要在模型内部调用控制器!

  2. 在控制器中,包括模型,以便您可以调用它们的方法。 在控制器中,您会将帖子读入一些变量(就像您所做的那样),然后以某种方式验证它们,然后使用特定的模型方法将数据保存到数据库中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM