ilavista
Все статьи

Вопросы на собеседовании - Laravel

Laravel - один из самых популярных PHP-фреймворков, который широко используется для разработки веб-приложений. Если вы готовитесь к собеседованию на должность Laravel-разработчика, то, вероятно, ищете полезную информацию и советы для подготовки. В этой статье мы представляем несколько вопросов, которые могут быть заданы на собеседовании, и рассматриваем ответы на них. Мы покроем такие темы, как архитектура фреймворка, маршрутизация, ORM, миграции, тестирование и безопасность. Надеемся, что эта статья поможет вам подготовиться к собеседованию и получить работу, о которой вы мечтаете.

Вопросы на собеседовании - Laravel

Что такое Contract'ы в экосистеме Laravel?

«Контракты» Laravel – это набор интерфейсов, которые определяют основные службы фреймворка. Например, контракт Illuminate\Contracts\Queue\Queue определяет методы, необходимые для постановки заданий в очередь, а контракт Illuminate\Contracts\Mail\Mailer – для отправки электронной почты.

Каждый контракт имеет соответствующую реализацию, предусмотренную структурой. Например, Laravel предлагает реализацию очереди с множеством драйверов и реализацию почтовой программы, которая работает на SwiftMailer.

Все контракты Laravel находятся в их собственном репозитории GitHub. Это обеспечивает быстрый доступ к списку всех доступных контрактов, а также единый, отдельный пакет, который используется разработчиками пакетов, взаимодействующих со службами Laravel.

Фасады и глобальные помощники Laravel обеспечивают простой способ использования служб Laravel без объявления типов зависимости и извлечения их реализаций из контейнера служб. В большинстве случаев каждый фасад имеет эквивалентный контракт.

В отличие от фасадов, которые не требуют, чтобы они находились в конструкторе вашего класса, контракты позволяют вам определять явные зависимости для ваших классов. Некоторые разработчики предпочитают явно определять свои зависимости таким образом и поэтому предпочитают использовать контракты, в то время как другие разработчики пользуются удобством фасадов. В общем, большинство приложений могут без проблем использовать фасады во время разработки.

Что такое Facade'ы в экосистеме Laravel?

В документации Laravel вы увидите примеры кода, демонстрирующего взаимодействия с функционалом Laravel через «фасады». Фасады предоставляют «статический» интерфейс для классов, доступных в контейнере служб приложения. Laravel из коробки включает множество фасадов, обеспечивающих доступ почти ко всему функционалу Laravel.

Фасады Laravel служат «статическими прокси» для базовых классов в контейнере служб, обеспечивая преимущества краткого, выразительного синтаксиса при сохранении большей тестируемости и гибкости, чем традиционные статические методы.

Все фасады Laravel определены в пространстве имён Illuminate\Support\Facades. Таким образом, мы можем легко получить доступ к такому фасаду:

use Illuminate\Support\Facades\Cache;

use Illuminate\Support\Facades\Route;

Route::get('/cache', function () {
   return Cache::get('key');
});

В документации Laravel во многих примерах будут использоваться фасады для демонстрации различного функционала фреймворка.

Что такое Глобальные помощники в экосистеме Laravel?

В дополнении к фасадам, Laravel предлагает множество глобальных «вспомогательных функций», которые упрощают взаимодействие с общими функциями Laravel. Вот некоторые из глобальных помощников, с которыми вы можете взаимодействовать – это view, response, url, config и т.д. Каждый помощник, предлагаемый Laravel, задокументирован с соответствующей функцией;

Например, вместо использования фасада Illuminate\Support\Facades\Response для генерации ответа JSON, мы можем просто использовать функцию response. Поскольку помощники доступны глобально, то вам не нужно импортировать какие-либо классы, чтобы использовать их:

use Illuminate\Support\Facades\Response;

Route::get('/users', function () {
   return Response::json([
      // ...
   ]);
});

Route::get('/users', function () {
   return response()->json([
      // ...
   ]);
});

Жизненный цикл запроса

index.php

Точкой входа для всех запросов к приложению Laravel является файл public/index.php. Все запросы направляются в этот файл конфигурацией вашего веб-сервера (Apache / Nginx). Файл index.php не содержит большого количества кода. Скорее, это отправная точка для загрузки остальной части фреймворка.

Файл index.php загружает автозагрузчик, созданный менеджером пакетов Composer, а затем извлекает экземпляр приложения Laravel из bootstrap/app.php. Первым действием, предпринимаемым самим Laravel, является создание экземпляра приложения / контейнера служб.

HTTP-ядро и ядро консоли

Затем входящий запрос отправляется либо HTTP-ядру, либо ядру консоли, в зависимости от типа запроса, поступающего в приложение. Эти два ядра служат центральным местом, через которое проходят все запросы. А пока давайте сосредоточимся на ядре HTTP, которое находится в app/Http/Kernel.php.

HTTP-ядро расширяет класс Illuminate\Foundation\Http\Kernel, который определяет массив загрузчиков (bootstrappers), запускающихся до выполнения запроса. Эти загрузчики настраивают обработку ошибок, логирование, определяют среду приложения и выполняют другие задачи, которые необходимо выполнить до фактической обработки запроса.

Ядро HTTP также определяет список HTTP-посредников, через которые должны пройти все запросы, прежде чем они будут обработаны приложением. Эти посредники обрабатывают чтение и запись HTTP-сессий, определяют, находится ли приложение в режиме обслуживания, проверяют токен CSRF и многое другое.

Сигнатура метода handle HTTP-ядра довольно проста: он получает запрос (Request) и возвращает ответ (Response). Думайте о ядре как о большом черном ящике, который представляет все ваше приложение. Дайте ему HTTP-запросы, и он вернет HTTP-ответы.

Одним из наиболее важных действий начальной загрузки ядра является загрузка поставщиков служб вашего приложения. Все поставщики служб приложения настраиваются в массиве providers конфигурационного файла config/app.php.

Laravel будет перебирать этот список поставщиков и создавать экземпляры каждого из них. После создания экземпляров поставщиков, будет вызван метод register всех поставщиков. Затем, как только все поставщики будут зарегистрированы, будет вызван метод boot каждого из них. Это сделано для того, чтобы те поставщики служб, которые имеют зависимости от других поставщиков, могли быть вызваны гарантированно после создания своих зависимостей, вызываемых в методе boot.

Поставщики служб несут ответственность за загрузку всевозможных компонентов инфраструктуры, таких как компоненты БД, очереди, валидации и маршрутизации. По сути, каждая основная функция Laravel загружается и настраивается поставщиком служб. Поскольку они запускают и настраивают так много функций, предлагаемых фреймворком, поставщики служб являются наиболее важным аспектом всего процесса начальной загрузки Laravel.

Маршрутизация

Одним из наиболее важных поставщиков служб в вашем приложении является App\Providers\RouteServiceProvider. Этот поставщик загружает файлы маршрутов, содержащиеся в каталоге routes приложения.

После того как приложение было загружено и все поставщики служб зарегистрированы, Request будет передан маршрутизатору для исполнения. Маршрутизатор отправит запрос на маршрут или контроллер, а также запустит посредник для конкретного маршрута.

Посредники обеспечивают удобный механизм фильтрации или интерпретации HTTP-запросов, поступающих в ваше приложение. Например, Laravel содержит посредника, который проверяет аутентификацию пользователя вашего приложения. Если пользователь не аутентифицирован, посредник перенаправит пользователя, например, на экран входа в систему. Однако, если пользователь аутентифицирован, посредник позволит запросу продолжить работу в приложении. Некоторые посредники назначаются всем маршрутам в приложении, например, определенным в свойстве $middleware вашего ядра HTTP, тогда как некоторые назначаются только для определенных маршрутов или групп маршрутов.

Если запрос проходит через всех посредников, назначенных определенному маршруту, то метод маршрута или контроллера будет выполнен, а ответ, возвращенный методом маршрута или контроллера, будет отправлен обратно через цепочку посредников маршрута.

Окончание

Когда метод маршрута или контроллера вернет ответ, тогда ответ отправится обратно через посредников маршрута, обеспечивая приложению возможность изменения или проверки исходящего ответа.

Наконец, как только ответ проходит через посредников, метод handle ядра HTTP возвращает объект ответа, а файл index.php вызывает метод send для возвращенного ответа. Метод send отправляет содержимое ответа в веб-браузер пользователя. Мы завершили наш путь через весь жизненный цикл запроса Laravel!