wpmind/includes/Routing/AbstractStrategy.php
LinuxJoy 74db7a20af refactor: 方法名 camelCase → snake_case (39文件, WordPress 编码规范)
将项目自有代码的方法名从 camelCase 统一为 snake_case,
符合 WordPress PHP 编码规范。涉及 Routing、Failover、Budget、
Analytics、Usage、ErrorHandler 等模块。外部库接口方法和
Image Provider 子系统保持不变。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-07 03:21:31 +08:00

92 lines
2.4 KiB
PHP

<?php
/**
* Abstract Strategy - 路由策略基类
*
* 提供路由策略的通用实现
*
* @package WPMind
* @since 1.9.0
*/
declare(strict_types=1);
namespace WPMind\Routing;
abstract class AbstractStrategy implements RoutingStrategyInterface
{
/**
* 选择最佳 Provider
*
* 默认实现:返回排名第一的 Provider
*/
public function select_provider(RoutingContext $context, array $providers): ?string
{
$ranked = $this->rank_providers($context, $providers);
return $ranked[0] ?? null;
}
/**
* 对 Provider 列表进行排序
*
* 默认实现:按得分降序排列
*/
public function rank_providers(RoutingContext $context, array $providers): array
{
// 过滤掉被排除的 Provider
$available = array_filter(
array_keys($providers),
fn($id) => !$context->is_excluded($id)
);
if (empty($available)) {
return [];
}
// 计算每个 Provider 的得分
$scores = [];
foreach ($available as $providerId) {
$scores[$providerId] = $this->calculate_score($providerId, $context);
}
// 按得分降序排序
arsort($scores);
return array_keys($scores);
}
/**
* 过滤可用的 Provider
*
* @param RoutingContext $context 路由上下文
* @param array<string, array> $providers Provider 列表
* @return array<string> 可用的 Provider ID 列表
*/
protected function filter_available(RoutingContext $context, array $providers): array
{
return array_filter(
array_keys($providers),
fn($id) => !$context->is_excluded($id)
);
}
/**
* 归一化得分到 0-100 范围
*
* @param float $value 原始值
* @param float $min 最小值
* @param float $max 最大值
* @param bool $inverse 是否反转(值越小得分越高)
* @return float 归一化后的得分
*/
protected function normalize_score(float $value, float $min, float $max, bool $inverse = false): float
{
if ($max <= $min) {
return 50.0;
}
$normalized = (($value - $min) / ($max - $min)) * 100;
$normalized = max(0, min(100, $normalized));
return $inverse ? (100 - $normalized) : $normalized;
}
}