簡體   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