PHP职责链模式传递请求吗

wen PHP项目 3

本文目录导读:

PHP职责链模式传递请求吗

  1. 核心概念
  2. 简单 PHP 示例(基础版)
  3. 常见应用场景
  4. 现代 PHP 实现(Laravel Middleware 风格)
  5. 关键特性

是的,PHP 职责链模式(Chain of Responsibility Pattern)的核心目的就是沿着一条链传递请求,直到有某个处理器处理该请求为止。

下面从几个关键点帮你理清它的工作原理和 PHP 实现方式:

核心概念

职责链模式将多个处理者(Handler)连接成一条链,请求沿着这条链依次传递:

  • 每个处理者:决定是否处理请求,或者将其传给下一个处理者
  • 请求最终:要么被某个处理者处理,要么到达链的末尾仍未被处理

简单 PHP 示例(基础版)

<?php
// 抽象处理者
abstract class Handler
{
    protected ?Handler $next = null;
    public function setNext(Handler $handler): Handler
    {
        $this->next = $handler;
        return $handler; // 支持链式调用
    }
    abstract public function handle(string $request): ?string;
}
// 具体处理者 A
class ConcreteHandlerA extends Handler
{
    public function handle(string $request): ?string
    {
        if ($request === 'A') {
            return "Handler A 处理了请求: $request";
        }
        return $this->next?->handle($request); // 传递
    }
}
// 具体处理者 B
class ConcreteHandlerB extends Handler
{
    public function handle(string $request): ?string
    {
        if ($request === 'B') {
            return "Handler B 处理了请求: $request";
        }
        return $this->next?->handle($request);
    }
}
// 使用
$handlerA = new ConcreteHandlerA();
$handlerB = new ConcreteHandlerB();
$handlerA->setNext($handlerB);
echo $handlerA->handle('A'); // Handler A 处理了请求: A
echo $handlerA->handle('B'); // Handler B 处理了请求: B
echo $handlerA->handle('C'); // null (没人处理)

常见应用场景

  • 框架中间件(如 Laravel 的 Middleware):请求经过认证 → 日志 → CSRF 保护...
  • 日志系统:不同级别日志(DEBUG → INFO → ERROR)由不同处理器处理
  • 权限校验:多个校验器依次检查用户权限
  • 表单验证:多个验证规则链式执行

现代 PHP 实现(Laravel Middleware 风格)

<?php
// 使用闭包实现更灵活的链
class Pipeline
{
    private array $pipes = [];
    public function through(array $pipes): self
    {
        $this->pipes = $pipes;
        return $this;
    }
    public function process($passable, callable $destination)
    {
        $pipeline = array_reduce(
            array_reverse($this->pipes),
            function ($next, $pipe) {
                return function ($passable) use ($next, $pipe) {
                    return $pipe->handle($passable, $next);
                };
            },
            $destination
        );
        return $pipeline($passable);
    }
}
// 使用
$pipeline = new Pipeline();
$result = $pipeline
    ->through([new TrimMiddleware(), new UppercaseMiddleware()])
    ->process("  hello world  ", function ($input) {
        return $input;
    });
// 结果: "  HELLO WORLD  "

关键特性

特性 说明
解耦 请求发送者不需要知道谁处理请求
灵活 可以动态增删处理者,调整链顺序
单一职责 每个处理者只负责自己的逻辑
可中断 处理者可以选择终止传递

是的,职责链模式的本质就是传递请求,让多个对象都有机会处理同一个请求,直到有对象处理它为止,PHP 中既可以手动实现链表结构,也可以利用闭包实现更优雅的 Pipeline 模式。

抱歉,评论功能暂时关闭!