Как ответить
Ядро Laravel — это не какая-то одна сущность, а связка из сервис-контейнера, сервис-провайдеров и фасадов. Эти компоненты обеспечивают IoC, загрузку компонентов и удобный синтаксис. Понимание того, как они работают, нужно, чтобы правильно расширять фреймворк и не лезть в дебаг с загадочными «binding resolution».
Первое — сервис-контейнер. Это главный DI-контейнер в приложении. Он хранит маппинг абстракций на конкретные реализации. В простейшем случае вы пишете:
// AppServiceProvider::register()
$this->app->bind('App\Contracts\PaymentGateway', 'App\Services\StripeGateway');
$this->app->singleton('logger', function ($app) {
return new Monolog\Logger('app');
});Контейнер автоматически разрешает зависимости через рефлексию: если в конструкторе класса указан интерфейс, контейнер найдёт его маппинг и создаст нужный объект. Когда я говорю «ядро», я в первую очередь имею в виду этот механизм — из-за него Laravel может гибко подменять компоненты (например, переключить драйвер очереди или кэша без изменения кода).
Второе — сервис-провайдеры. Это классы, которые регистрируют сервисы в контейнере. Каждый провайдер реализует методы register() и boot(). register() только биндится, там нельзя вызывать другие сервисы, потому что они ещё не все зарегистрированы. boot() выполняется после все регистраций — там можно работать с другими провайдерами. Пример из коробки: RouteServiceProvider грузит маршруты, EventServiceProvider — регистрирует слушателей. Провайдеры могут быть отложенными (deferred), если они реализуют DeferrableProvider.
Третье — фасады. Каждый фасад — это статический прокси к сервису, который зарегистрирован в контейнере. Например, Cache::get() — на самом деле это Illuminate\Support\Facades\Cache, который берёт объект cache из контейнера и делегирует вызов. Это просто синтаксический сахар. Из минусов — фасады скрывают реальные зависимости, и в тестах их приходится мокать через Facade::shouldReceive().
Четвёртое — ядро HTTP (Kernel). Когда приходит запрос, public/index.php загружает bootstrap, создаёт контейнер, вызывает основное ядро приложения. Оно прогоняет запрос через цепочку middleware (глобальные, сгруппированные, роутинговые), затем маршрутизатор находит контроллер/замыкание, выполняет его и возвращает ответ. Ядро реализовано в классе Illuminate\Foundation\Http\Kernel. Middleware могут быть до или после обработки — это даёт контроль над фильтрацией, логами, сессиями.
В итоге, если одним абзацем: ядро Laravel — это контейнер, который собирает всё приложение из кусочков, сервис-провайдеры описывают эти кусочки, фасады дают удобный доступ к ним, а Kernel — это диспетчер, который принимает HTTP-реальный запрос, прогоняет через middleware и передаёт контроллеру.