wpmind/includes/Routing/AbstractStrategy.php
LinuxJoy adb6c49301 style: phpcbf 自动格式化 — 全量 WPCS 3.x 规范对齐
135 文件 19,211 处自动修复:空格→Tab 缩进、括号间距、
函数声明空格、前置自增、尾逗号等纯格式化改动。
零逻辑变更,php -l + token 级对比验证通过。

新增 phpcs.xml.dist / phpstan.neon.dist 项目配置。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 00:48:46 +08:00

88 lines
2.1 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;
}
}