Slim Framework 3 — объект ответа

В моем приложении Slim 3 я определил промежуточное программное обеспечение, которое добавляет к моему ответу собственный заголовок. ПО промежуточного слоя вызывается до вызова функции маршрутизации индекса. Если возникает исключение, вызывается функция обработчика ошибок, но кажется, что объект $response, переданный этой функции, является новым объектом Response, а не тем, который настроен в моем промежуточном программном обеспечении. Другими словами, в моем ответе нет моего пользовательского заголовка.

Правильно ли это поведение?

# Middleware
$app->add(function ($request, $response, $next) {
  $response = $response->withHeader('MyCustomHeader', 'MyCustomValue');
  return $next($request, $response);
});

# Error handling
$container['errorHandler'] = function ($container) {
  return function ($request, $response, $exception) use ($container) {
    return $response->write('ERROR');
  };
};

# Index
$app->get('/index', function(Request $request, Response $response) {
  throw new exception();
  return $response->write('OK');
});

person c.bear    schedule 12.08.2017    source источник


Ответы (1)


Да, это правильно, потому что:

Объекты Request и Response неизменяемы, поэтому их нужно передавать через все функции. При выдаче исключения эта цепочка разрывается и вновь созданный объект Response (по withHeader-методу) не может быть передан в errorHandler.

Вы можете решить эту проблему, выдав \Slim\Exception\SlimException, это исключение принимает 2 параметра. Запрос и ответ. При этом Slim использует запрос и ответ, указанные в исключении внутри обработчика ошибок.

$app->get('/index', function(Request $request, Response $response) {
    throw new \Slim\Exception\SlimException($request, $response);
    return $response->write('OK');
});
person jmattheis    schedule 12.08.2017