Во-первых, вы создаете экземпляр класса Slim\App. Во время инициализации Slim регистрирует сервисы по умолчанию для каждой своей зависимости.
Во-вторых, вы определяете маршруты, используя методы get(), post(), put(), delete(), patch(), head() и options() инстанса приложения.
Эти методы регистрируют маршрут с помощью объекта Router. Каждый из этих методов возвращает экземпляр класса Route. Это дает возможность назначит маршруту имя или добавить промежуточное ПО.
В-третьих, вы вызываете метод run() вашего приложения. Этот метод запускает следующий процесс:
Метод run() начинает проходить через стек промежуточного ПО. Это концентрическая структура уровней промежуточного ПО, которые получают (а при необходимости и манипулируют) объекты Environment, Request и Response до (и после) запуска приложения Slim. Приложение Slim - это самый внутренний слой концентрической структуры промежуточного программного обеспечения. Каждый промежуточный уровень вызывается внутри, начиная с самого верхнего уровня.
После того, как метод run () достигнет последнего уровня промежуточного ПО, он вызывает экземпляр приложения и отправляет текущий HTTP-запрос соответствующему объекту маршрута приложения. Если маршрут соответствует методу HTTP и URI, вызывается стек промежуточного ПО данного маршрута и затем обработчик маршрута. Если соответствующий маршрут не найден, вызывается обработчик Not Found (если URI не совпадает ни с одним из маршрутов) или Not Allowed (если совпадает URI, но не совпадает метод).
Результат выполнения обработчика передается в последний уровень стека промежуточного ПО. Каждый уровень при необходимости манипулирует результатом и передает его в предыдущий уровень.
После того, как самый первый уровень промежуточного ПО возвращает ответ, экземпляр приложения подготавливает, сериализует и возвращает HTTP-ответ. Заголовки HTTP-ответа устанавливаются с помощью встроенного в PHP метода header (), а тело HTTP-ответа выводится в текущий буфер вывода.