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

97 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 代理模式 (Proxy Pattern) 详解
> 代理模式是一种结构型设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理可以在不修改原始对象的情况下,增强或控制对它的访问。
#### 核心概念
装饰器模式主要解决以下问题:
- 控制访问:代理可以决定是否允许客户端访问目标对象(如权限控制)。
- 增强功能:代理可以在调用目标对象前后添加额外逻辑(如缓存、日志、延迟加载)。
- 远程访问代理可以代表远程对象如RPC、数据库访问
- 虚拟代理:代理可以延迟创建开销大的对象(如图片懒加载)。
#### 常见应用场景
- Spring AOP通过动态代理实现切面编程
- MyBatisMapper接口的代理实现
- RPC框架远程服务调用的本地代理
- 图片懒加载:先显示缩略图代理,点击再加载原图
```php
//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);
}
}
```