Php 我如何将对数据库的查询与我的逻辑分离——基本上是分离责任

Php 我如何将对数据库的查询与我的逻辑分离——基本上是分离责任,php,mysql,Php,Mysql,我正在开发一个登录系统。我试图避免重复代码,并尽可能地将责任分开 假设我有一个身份验证类,它执行以下操作: class Authentication { public function login($username, $password); public function logout(); } 再往下看一点,我需要将用户输入的凭据与数据库中的凭据进行比较 总的来说,我可以将其抽象到某一点,在这一点上,我需要对某些事物进行实际的唯一查询 例如,对于登录函数,我需要如下查询

我正在开发一个登录系统。我试图避免重复代码,并尽可能地将责任分开

假设我有一个
身份验证
类,它执行以下操作:

class Authentication
{
    public function login($username, $password);

    public function logout();

}
再往下看一点,我需要将用户输入的凭据与数据库中的凭据进行比较

总的来说,我可以将其抽象到某一点,在这一点上,我需要对某些事物进行实际的唯一查询

例如,对于登录函数,我需要如下查询:

$dbPDO->prepare("SELECT $loginUsername, FROM $tableName WHERE $loginUsername=:username");
$dbPDO->prepare("INSERT INTO $tableName($loginUsername, $loginPassword, $loginEmail) VALUES (:username, :password, :email)");
要注册用户,我需要如下查询:

$dbPDO->prepare("SELECT $loginUsername, FROM $tableName WHERE $loginUsername=:username");
$dbPDO->prepare("INSERT INTO $tableName($loginUsername, $loginPassword, $loginEmail) VALUES (:username, :password, :email)");
等等等等

这是我的问题/顾虑,不管你怎么称呼它

一般来说,我构建一个类,它只做特定的事情。我真的不想把查询和逻辑混在一起(可以这么说)

写一个专门处理查询的类(或者其他东西,比如接口,我不知道)是不是一个好主意。或者将查询与逻辑混合在一起可以吗


我真的希望我已经用一种可以理解的方式解释了自己。

解决这个问题的一个非常常见的方法是存储库模式。基本上,这个想法是,您试图尽可能接近能够处理您的实体,就像它们从未写入磁盘一样,而是始终保留在内存中

您的存储库有一系列不同的方法,用于根据标准查找和水合您的实体(当大多数框架说模型是指实体时)。然后,存储库实现查询数据库和设置存储库返回的对象的必要属性的所有逻辑。它还应该包含相关对象。许多ORM为你做这部分(水合作用)。例如hibernate(Java)和doctrine2(php)

基本上,您最好的选择是要么将从sequel查询到object的所有逻辑都放到一个存储库类中,要么使用orm为您完成这项工作


在您的情况下,您的身份验证类应该有一个用户存储库,获取具有给定Id的用户,并将检索到的用户密码与输入的密码进行比较

我认为让数据库查询或数据处理方法与应用程序逻辑不同是个好主意。这是MVC体系结构解决的问题之一。如果您不熟悉MVC,您现在就要阅读它,看看它是否适合您心目中的模型


如果您愿意的话,这里有一个示例。

即使通过设置存储库(基于一个非常通用的抽象类),我也建议只从该存储库生成查询,并将所有DML和DDL内容放在一个数据库层对象中进行维护。