PHP:
class UserService{
public function getUserById($id, $for_update=false){
return $this->mapper->getById($id, $for_update);
}
}
function before(Request $request){
return $this->service->getUserById($request->attributes->get('id'), $request->isMethod(Request::METHOD_POST));
}
Что ты будешь делать, если в другом middleware есть какой-нибудь логгер, пишущий в базу, используя тот же connection? Что ты будешь делать, если у тебя есть событие, по которому синхронно выполняется другой обработчик, который тоже попадёт под действие транзакции (письмо отправится, а потом выяснится, что транзакцию нужно откатывать)? Что ты будешь делать, если соответствие «метод HTTP-API <-> бизнес-действие» перестанет быть взаимно однозначным (один вызов API -> несколько команд)?
Зачем вообще так завязываться на HTTP-контекст? Как ты собираешься переиспользовать то же бизнес-действие в CLI, в сценариях автотестов, в другом API (иметь одновременно несколько API разных форматов и версий в долгосрочных проектах — не редкость, ибо BC), в админке (админка может иметь свой API на другом хосте)? Я просто вызову $this->bus->handle(new RenameUser(42, 'Alice')), зная, что либо действие выполнится транзакционно, либо упадёт с ошибкой. А как вызывать твой «экшн», размазанный по куче классов? Делать sub/slave HTTP-request из CLI?