я похоже нашел тупняк в рефлекции Optional параметр - тот, который имеет значение по умолчанию (function(string $a, int $b = 0), $a - required, $b - optional) В рефлекции есть 2 метода: isOptional isDefaultValueAvailable и как теперь это понимать?)
Местами покрыл тестами, местами просто матом. Если что, завтра еще пару тестов добавлю там вроде не все кейсы есть. Но в целом все работает как надо. Ленивое создание мидлтварей не делал, оно там не нужно.