Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 验证外键的最佳方法?_Php_Oop_Model - Fatal编程技术网

Php 验证外键的最佳方法?

Php 验证外键的最佳方法?,php,oop,model,Php,Oop,Model,我在验证引用其他模型的模型时遇到了一个问题 我有一个“用户”模型和一个“个人资料”模型。我想创建配置文件,但我需要检查用户是否确实存在 在我的概要文件模型中,我有一个“validateUser”方法,但我要么必须向数据库中的特定表写入查询,要么必须创建一个用户模型对象并调用exists(id) 这两种选择似乎都有很多缺点。表名可能会更改,我必须检查所有使用它的模型。对于用户模式对象,我必须在概要文件模型中创建一个对象或将其注入 解决这个问题的最佳方法是什么?厄运的领域。。 在现实世界中,验证很少

我在验证引用其他模型的模型时遇到了一个问题

我有一个“用户”模型和一个“个人资料”模型。我想创建配置文件,但我需要检查用户是否确实存在

在我的概要文件模型中,我有一个“validateUser”方法,但我要么必须向数据库中的特定表写入查询,要么必须创建一个用户模型对象并调用exists(id)

这两种选择似乎都有很多缺点。表名可能会更改,我必须检查所有使用它的模型。对于用户模式对象,我必须在概要文件模型中创建一个对象或将其注入

解决这个问题的最佳方法是什么?

厄运的领域。。 在现实世界中,验证很少是一个简单的过程。相反,您有几个不相关的问题:

  • 检查实例中的数据是否与业务规则一致
  • 确保实例的状态不与其他域结构冲突
  • 根据存储中的现有数据和约束验证信息的完整性
如果您使用活动记录来表示您的(不要与MVC中的M混淆),那么所有这三个方面都将成为单个对象的责任

这就是你现在拥有的

但还是有希望的。。 最好的选择是将所有这些责任分开(全部)。基本上,您要做的是将当前设置划分为不同的结构组:

  • 域对象:用于处理域实体的特定规则

  • 数据映射器:用于存储抽象

  • 服务:用于域对象和映射器(或其他域对象)之间的交互

由于您的问题有些混乱(用户和配置文件、保存和验证,然后是一些不存在的内容),我不确定我是否理解正确,但这里有一个小示例:

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,你必须阅读,因为它是一门非常广泛的学科

厄运的领域。。 在现实世界中,验证很少是一个简单的过程。相反,您有几个不相关的问题:

  • 检查实例中的数据是否与业务规则一致
  • 确保实例的状态不与其他域结构冲突
  • 根据存储中的现有数据和约束验证信息的完整性
如果您使用活动记录来表示您的(不要与MVC中的M混淆),那么所有这三个方面都将成为单个对象的责任

这就是你现在拥有的

但还是有希望的。。 最好的选择是将所有这些责任分开(全部)。基本上,您要做的是将当前设置划分为不同的结构组:

  • 域对象:用于处理域实体的特定规则

  • 数据映射器:用于存储抽象

  • 服务:用于域对象和映射器(或其他域对象)之间的交互

由于您的问题有些混乱(用户和配置文件、保存和验证,然后是一些不存在的内容),我不确定我是否理解正确,但这里有一个小示例:

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的文章