Php 验证外键的最佳方法?
我在验证引用其他模型的模型时遇到了一个问题 我有一个“用户”模型和一个“个人资料”模型。我想创建配置文件,但我需要检查用户是否确实存在 在我的概要文件模型中,我有一个“validateUser”方法,但我要么必须向数据库中的特定表写入查询,要么必须创建一个用户模型对象并调用exists(id) 这两种选择似乎都有很多缺点。表名可能会更改,我必须检查所有使用它的模型。对于用户模式对象,我必须在概要文件模型中创建一个对象或将其注入 解决这个问题的最佳方法是什么?厄运的领域。。 在现实世界中,验证很少是一个简单的过程。相反,您有几个不相关的问题:Php 验证外键的最佳方法?,php,oop,model,Php,Oop,Model,我在验证引用其他模型的模型时遇到了一个问题 我有一个“用户”模型和一个“个人资料”模型。我想创建配置文件,但我需要检查用户是否确实存在 在我的概要文件模型中,我有一个“validateUser”方法,但我要么必须向数据库中的特定表写入查询,要么必须创建一个用户模型对象并调用exists(id) 这两种选择似乎都有很多缺点。表名可能会更改,我必须检查所有使用它的模型。对于用户模式对象,我必须在概要文件模型中创建一个对象或将其注入 解决这个问题的最佳方法是什么?厄运的领域。。 在现实世界中,验证很少
- 检查实例中的数据是否与业务规则一致
- 确保实例的状态不与其他域结构冲突
- 根据存储中的现有数据和约束验证信息的完整性
- 域对象:用于处理域实体的特定规则
- 数据映射器:用于存储抽象
- 服务:用于域对象和映射器(或其他域对象)之间的交互
public function createProfile( $id, $email, $name )
{
$account = new Account;
$account->setId( $id );
$accountMapper = new AccountMapper( $pdo ); // explained below
if ( $accountMapper->fetch( $account ) === false )
{
$this->errors[] = .. something about missing account
return;
}
$profile = new Profile;
$profile->setEmail( $email )
->setName( $name );
if ( $profile->isValid() === false )
{
$this->errors[] = .. something about invalid profile
return;
}
try
{
$profileMapper = new ProfileMapper( $pdo ); // explained below
$profileMapper->store( $profile );
}
catch ( Exception $e )
{
$this->errrors[] = .. something about failing to create profile
return;
}
$account->addProfile( $profile );
$accountMapper->store( $account );
}
这是一个极其简化的示例。特别是在映射器被初始化的情况下,因为现实世界中的那个部分将由一些工厂处理。有点像书中描述的
这里的要点是域数据的验证和数据库完整性的保险是分开完成的。用于与数据库交互的底层API实际上会返回错误代码,即您违反了唯一键
或外键
或任何其他约束,然后您可以使用这些约束来确定出错的原因
方法本身将是服务的一部分(在本例中是管理用户帐户的服务)
注意:如果您的应用程序需要对每个操作执行多个SQL交互,并且这些交互需要作为具有回滚功能的事务来完成,那么您应该考虑实现,而不是直接使用数据映射器。要了解UoW,你必须阅读,因为它是一门非常广泛的学科
厄运的领域。。
在现实世界中,验证很少是一个简单的过程。相反,您有几个不相关的问题:
- 检查实例中的数据是否与业务规则一致
- 确保实例的状态不与其他域结构冲突
- 根据存储中的现有数据和约束验证信息的完整性
- 域对象:用于处理域实体的特定规则
- 数据映射器:用于存储抽象
- 服务:用于域对象和映射器(或其他域对象)之间的交互
public function createProfile( $id, $email, $name )
{
$account = new Account;
$account->setId( $id );
$accountMapper = new AccountMapper( $pdo ); // explained below
if ( $accountMapper->fetch( $account ) === false )
{
$this->errors[] = .. something about missing account
return;
}
$profile = new Profile;
$profile->setEmail( $email )
->setName( $name );
if ( $profile->isValid() === false )
{
$this->errors[] = .. something about invalid profile
return;
}
try
{
$profileMapper = new ProfileMapper( $pdo ); // explained below
$profileMapper->store( $profile );
}
catch ( Exception $e )
{
$this->errrors[] = .. something about failing to create profile
return;
}
$account->addProfile( $profile );
$accountMapper->store( $account );
}
这是一个极其简化的示例。特别是在映射器被初始化的情况下,因为现实世界中的那个部分将由一些工厂处理。有点像书中描述的
这里的要点是域数据的验证和数据库完整性的保险是分开完成的。用于与数据库交互的底层API实际上会返回错误代码,即您违反了唯一键
或外键
或任何其他约束,然后您可以使用这些约束来确定出错的原因
方法本身将是服务的一部分(在本例中是管理用户帐户的服务)
注意:如果您的应用程序需要对每个操作执行多个SQL交互,并且这些交互需要作为具有回滚功能的事务来完成,那么您应该考虑实现,而不是直接使用数据映射器。要了解UoW,你必须阅读,因为它是一门非常广泛的学科
没有“模型”。模型是一个层,而不是一个类或实例。你到底指的是什么?你说的是实例还是?我指的是活动记录的域对象。我想我没有遵循德米特定律?你不能两者兼得。域对象仅包含业务逻辑。活动记录还与存储交互(因此会发生冲突)。而且,如果您使用的是active record,我甚至不确定这个问题是否能够以合理的方式得到解决。如果我理解正确,域对象只包含属性和调用的方法?活动记录具有对所需存储的所有验证和查询?我将您链接到bri的文章