Запрос передается по цепочке обработчиков; каждый решает, обработать самому или передать дальше.
interface Handler {
public function setNext(Handler $h): Handler;
public function handle(Request $request): ?Response;
}
class AuthMiddleware implements Handler {
private ?Handler $next = null;
public function setNext(Handler $h): Handler { $this->next = $h; return $h; }
public function handle(Request $r): ?Response {
if (!$this->auth->check($r)) return $this->unauthorized();
return $this->next?->handle($r);
}
}Примеры: middleware, валидация по цепочке, логирование/кэш по цепочке.