Files
hyperf_test/document/proxy.md
2025-09-07 14:23:44 +08:00

2.9 KiB
Raw Permalink Blame History

代理模式 (Proxy Pattern) 详解

代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理可以在不修改原始对象的情况下,增强或控制对它的访问。

核心概念

装饰器模式主要解决以下问题:

  • 控制访问:代理可以决定是否允许客户端访问目标对象(如权限控制)。
  • 增强功能:代理可以在调用目标对象前后添加额外逻辑(如缓存、日志、延迟加载)。
  • 远程访问代理可以代表远程对象如RPC、数据库访问
  • 虚拟代理:代理可以延迟创建开销大的对象(如图片懒加载)。

常见应用场景

  • Spring AOP通过动态代理实现切面编程
  • MyBatisMapper接口的代理实现
  • RPC框架远程服务调用的本地代理
  • 图片懒加载:先显示缩略图代理,点击再加载原图
//error remote service
<?php

// 订单服务接口
interface OrderService {
    public function createOrder(array $data): array;
}

// 本地服务实现
class LocalOrderService implements OrderService {
    public function createOrder(array $data): array {
        // 本地创建订单逻辑
        return ['order_id' => uniqid(), 'status' => 'created'];
    }
}

// 远程服务代理
class RemoteOrderServiceProxy implements OrderService {
    private $rpcClient;
    
    public function __construct() {
        $this->rpcClient = ApplicationContext::getContainer()
            ->get(\Hyperf\RpcClient\Proxy\AbstractProxyService::class);
    }
    
    public function createOrder(array $data): array {
        // 添加额外的元数据
        $data['request_id'] = uniqid();
        $data['timestamp'] = time();
        
        // 记录请求日志
        $logger = ApplicationContext::getContainer()
            ->get(\Hyperf\Logger\LoggerFactory::class)
            ->get('rpc');
        $logger->info('Sending order creation request', $data);
        
        // 调用远程服务
        try {
            $response = $this->rpcClient->__call('OrderService.createOrder', [$data]);
            $logger->info('Order created successfully', ['response' => $response]);
            return $response;
        } catch (\Throwable $e) {
            $logger->error('Order creation failed', ['error' => $e->getMessage()]);
            throw $e;
        }
    }
}

// 配置依赖
// config/autoload/dependencies.php
return [
    OrderService::class => RemoteOrderServiceProxy::class, // 使用远程代理
    // 或者
    // OrderService::class => LocalOrderService::class, // 使用本地服务
];

// 在控制器中使用
class OrderController extends AbstractController
{
    /**
     * @Inject
     * @var OrderService
     */
    private $orderService;
    
    public function create()
    {
        $data = $this->request->all();
        $result = $this->orderService->createOrder($data);
        return $this->response->json($result);
    }
}