update EntityParse parameters type

This commit is contained in:
2025-12-11 16:38:29 +08:00
parent a09dc352c1
commit b8e3b12316
2 changed files with 36 additions and 13 deletions
+34 -11
View File
@@ -9,6 +9,7 @@ use App\Model\Company;
use App\Model\Platform; use App\Model\Platform;
use App\Model\Store; use App\Model\Store;
use App\Entity\Parse\Traits\EntityParseHelper; use App\Entity\Parse\Traits\EntityParseHelper;
use Hyperf\Amqp\Message\ConsumerMessageInterface;
use Hyperf\Collection\LazyCollection; use Hyperf\Collection\LazyCollection;
use InvalidArgumentException; use InvalidArgumentException;
@@ -18,13 +19,14 @@ use InvalidArgumentException;
* 使用工厂方法模式 + 延迟初始化 * 使用工厂方法模式 + 延迟初始化
* 提供消息解析的通用框架和默认实现 * 提供消息解析的通用框架和默认实现
* *
* @method static static create(array $data) * @method static static create(array $data, ConsumerMessageInterface $message)
*/ */
abstract class EntityParse implements EntityParseInterface abstract class EntityParse implements EntityParseInterface
{ {
use EntityParseHelper; use EntityParseHelper;
protected array $data; protected array $data;
protected ConsumerMessageInterface $message;
protected ?Platform $platform = null; protected ?Platform $platform = null;
protected ?Company $company = null; protected ?Company $company = null;
protected ?Store $store = null; protected ?Store $store = null;
@@ -42,13 +44,15 @@ abstract class EntityParse implements EntityParseInterface
* 工厂方法:创建解析器实例 * 工厂方法:创建解析器实例
* *
* @param array $data * @param array $data
* @param ConsumerMessageInterface $message
* @return static * @return static
* @throws InvalidArgumentException * @throws InvalidArgumentException
*/ */
public static function create(array $data): static public static function create(array $data, ConsumerMessageInterface $message): static
{ {
$instance = new static(); $instance = new static();
$instance->data = $data; $instance->data = $data;
$instance->message = $message;
// 在初始化前先验证数据 // 在初始化前先验证数据
if (!$instance->messageValidate($data)) { if (!$instance->messageValidate($data)) {
@@ -130,7 +134,7 @@ abstract class EntityParse implements EntityParseInterface
/** /**
* 平台作用域匹配 - 提供默认实现 * 平台作用域匹配 - 提供默认实现
* *
* 从 metadata 中提取平台信息 * 从 exchange 中提取平台信息
* 子类可以覆盖此方法以实现自定义逻辑 * 子类可以覆盖此方法以实现自定义逻辑
* *
* @param array $metadata * @param array $metadata
@@ -139,13 +143,13 @@ abstract class EntityParse implements EntityParseInterface
*/ */
public function platformScopeMatch(array $metadata): Platform public function platformScopeMatch(array $metadata): Platform
{ {
return $this->extractPlatformFromMetadata($metadata); return $this->extractPlatformFromExchange($this->message);
} }
/** /**
* 实体匹配 - 提供默认实现 * 实体匹配 - 提供默认实现
* *
* 从 metadata 中提取实体类型 * 从 routing key 中提取实体类型
* 子类可以覆盖此方法以实现自定义逻辑 * 子类可以覆盖此方法以实现自定义逻辑
* *
* @param array $metadata * @param array $metadata
@@ -154,22 +158,31 @@ abstract class EntityParse implements EntityParseInterface
*/ */
public function entityMatch(array $metadata): Entity public function entityMatch(array $metadata): Entity
{ {
return $this->extractEntityFromMetadata($metadata); return $this->extractEntityFromRoutingKey($this->message);
} }
/** /**
* 唯一标识符提取 - 提供默认实现 * 唯一标识符提取 - 提供默认实现
* *
* 默认从 metadata 中提取 unique_id * 子类需要覆盖此方法以实现自定义逻辑
* 子类可以覆盖此方法以实现自定义逻辑
* *
* @param array $metadata * @param array $metadata
* @return string|int * @return array
* @throws InvalidArgumentException * @throws InvalidArgumentException
*/ */
public function entityUniqueIdentifierExtract(array $metadata): string|int public function entityUniqueIdentifierExtract(array $metadata): array
{ {
return $metadata['unique_id'] ?? throw new InvalidArgumentException('unique_id not found in metadata'); // 举例说明,当 Order Entity 实体需要根据 平台 ID 和 平台订单 ID 来确定唯一性时
// 确认仓库中 Order 模型 对应的数据库字段约束条件为
// CONSTRAINT "orders_store_platform_order_unique" UNIQUE ("store_id", "platform_order_id")
// 可以从 $metadata 中分别提取 store_id 和 platform_order_id 的值
// 返回构造后的结果即可
// return ['store_id' => 123, 'platform_order_id' => 123123]
$className = static::class;
throw new InvalidArgumentException(
"Method entityUniqueIdentifierExtract() must be implemented in class '{$className}'"
);
} }
/** /**
@@ -214,6 +227,16 @@ abstract class EntityParse implements EntityParseInterface
return $this->data; return $this->data;
} }
/**
* 获取消息对象
*
* @return ConsumerMessageInterface
*/
public function getMessage(): ConsumerMessageInterface
{
return $this->message;
}
/** /**
* 获取平台对象 * 获取平台对象
* *
@@ -130,8 +130,8 @@ class EntityParseFactory
// 4. 获取对应的 Parser 类 // 4. 获取对应的 Parser 类
$parserClass = self::resolveParserClass($platformName, $entityType); $parserClass = self::resolveParserClass($platformName, $entityType);
// 5. 创建并返回 Parser 实例,传递解析后的数据 // 5. 创建并返回 Parser 实例,传递解析后的数据和消息对象
return $parserClass::create($data); return $parserClass::create($data, $message);
} }
/** /**