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