我正在尝试将一个简单的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>
Run Code Online (Sandbox Code Playgroud)
此表格将提交给控制人员登录表格.控制器现在将检查两个字段是否都有输入并且或多或少地"清理"输入
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");
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的检查现在,但我现在想知道我应该将控制器包含在模型中并从控制器或表单重定向到模型提交它在第一个位置并包含控制器.
模型
include_once("../controller/login.php");
$query = mysqli_query($connect, "INSERT into DB_table (username, password)
VALUES($username_escape, $password_escape)");
Run Code Online (Sandbox Code Playgroud)
你试图分离你的顾虑是件好事,但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;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,逻辑被分成一个服务,并且仅在需要时才被调用.我们还使用了pdo来防止SQL注入,(虽然不应该在这里创建对象).
我建议你看看自动加载,并与Silex这样的框架玩,因为它会教你这些原则.