Уведомления
Очистить
☰ МЕНЮ

PHP Паттерн “Цепочка ответственности” (Chain of Responsibility)

Позволяет передавать запрос по цепочке обработчиков, и каждый обработчик может решить, обрабатывать запрос или передать его следующему обработчику.

interface Response {
    function handleRequest();
}

class ErrorResponse implements Response {
    function handleRequest() {
        echo "Error response\n";
    }
}

class SuccessResponse implements Response {
    function handleRequest() {
        echo "Success response\n";
    }
}

class Request {
    private $_response;

    function setResponse(Response $response) {
        $this->_response = $response;
    }

    function sendRequest() {
        $response = $this->_response;
        while ($response) {
            try {
                $response->handleRequest();
                return;
            } catch (\Exception $e) {}

            $response = $response->getNextResponse();
        }

        throw new \Exception('No response handler available.');
    }
}

$request = new Request();
$request->setResponse(new ErrorResponse());
$request->sendRequest();

Когда может пригодиться

Обработка ошибок: можно создать цепочку ответственной обработки ошибок, где каждый следующий элемент цепочки принимает решение, как обрабатывать ошибку, если предыдущий элемент не смог ее обработать.

Маршрутизация запросов: можно использовать цепочку ответственности для определения маршрута запроса к нужному обработчику в зависимости от определенных условий.

Авторизация доступа: можно создать цепочку ответственных объектов, каждый из которых проверяет определенные условия доступа, такие как наличие прав пользователя или уровень доступа.

Логирование: можно создать цепочку объектов-регистраторов, каждый из которых записывает информацию об определенном уровне логирования.

Кэширование результатов запроса: можно создать цепочку кэширующих объектов, каждый из которых отвечает за свой тип кэширования (например, кэш в оперативной памяти, кэш на диске и т.д.).