Фото від Kasia Derenda на Unsplash
Серед розробників, з якими я працював, Laravel ніколи не був популярним, основні причини - ActiveRecord та те, що він не вважається "серйозним фреймворком", якщо так можна виразитися.
Як продукт мого середовища, я повинен сказати, що я не великий фанат Laravel.
Як більшість людей у галузі, які мають досить тверді думки про мову програмування, фреймворк чи інструмент, я кажу це з великою впевненістю, не дійсно працюючи з ним, останнім часом або взагалі ніколи.
Не через ActiveRecord це, скоріше через те, що він не вважається "серйозним фреймворком", і за все те, що я бачив в Laravel коді, який потрапляє в інтернет через статичні виклики.
Нещодавно я дізнався, що ці статичні виклики не є насправді статичними викликами.
Ну вони є, але не зовсім. Це магія, яку ми залишимо на інший раз, але якщо ви невитримані, зверніться до цього.
Інтернет обожнює Laravel. Вперше я працюю з розробником, який дуже зацікавлений у Laravel. Великі компанії-виробники, такі як Personio чи About You використовують/використовували Laravel.
Все це переконало мене, що настав час уважно розглянути Laravel.
Кожного разу, коли я хочу вивчити новий інструмент, я зазвичай починаю з читання документації, поєднуючи це з уважним розглядом того, як речі, представлені в документації, реалізовані.
Саме так я натрапив на це:
Рис. I. Налаштування маршрутів та групування за Контролером в Laravel
Цей код виглядає для мене ненатуральним.
Додання нових маршрутів за допомогою замикань в Laravel
Ми додаємо два нових Маршрути, передаючи Замикання, які викликають методи класу Маршруту, до підгрупи (повернення методу контролера).
Як може підгрупа RouteRegistrar зареєструвати Маршрути лише з Замиканням, яке нічого не повертає? (Підказка: це не можливо)
Коли мені не зрозуміло, як щось працює, я дивлюся на реалізацію, як це роблять інші.
По суті, Route - це просто Фасад до класу Маршруту. Ось краткий курс по фасадам в Laravel, вони є просто "статичними" обгортками над Сервісом, в нашому випадку - над Маршрутизатором.
Рисунок 2. Витяг з визначення класу Route
Метод Route::controller повертає екземпляр класу RouteRegistrar, який в разі методу підгрупи RouteRegistrar::group є просто Адаптером для Маршрутизатора, того самого Маршрутизатора, на який вказує Фасад Route.
Рисунок 3. Метод RouteRegistrar::group
Підемо далі в метод Маршрутизатор::group.
Рисунок 4. Метод Маршрутизатор::group.
Тут речі стають дивними, тому й потрібний трьохрядковий коментар, настільки ж кілька рядків коду міститься всередині цього foreach.
$attributes, які в нашому випадку порожні, а в інших випадках ні, потрібно потрапити в Маршрут якимось чином. Це досягається тимчасовим додаванням їх до властивості groupStack класу Маршрутизатор для використання їх у методі loadRoutes Маршрутизатора, після чого ми викидаємо їх.
Це дивно, і найкращий доказ того, що це дивно - це трьохрядковий коментар, який пояснює чому потрібно щось кудись помістити і чому ми можемо просто викинути це після цього.
Пояснення процесу додавання маршрутів в Laravel
Пам'ятаєте, як все почалося? Я б не пам'ятав також, тому дозвольте згадати:
Я хотів зрозуміти, як метод RouterRegistrar::group (тепер відомий як Router::group в образі) додає два маршрути, отримуючи метод, який нічого не повертає.
Перейдемо до Router::loadRoutes
FIG V. Router::loadRoutes
У нашому випадку $routes дійсно є замиканням, яке буде виконане.
Його точно це замикання.
FIG VI. Замикання, яке буде виконане в Router::loadRoutes
Далі до Router::get і Router::post. Я кажу _Router і не Route, оскільки тепер ми знаємо, що Route це лише "фасад" для Router.
FIG VII. Router::get
Як Router::get, так і Router::post - це всього лише адаптери для Router::addRoute.
Далі до Router::addRoute.
FIG VIII. Router::addRoute
Хоча це може бути не зовсім очевидно, ми знайшли відповідь на наше питання.
RouteRegistrar насправді не реєструє жодного Route (принаймні не безпосередньо), що, разом з тим, що вміст замикання фактично реєструє Route, означає, що замикання не повинне повертати нічого.
Для додаткових балів ми зайдемо ще на один рівень глибше в Router::createRoute, щоб побачити, де використовуються атрибути, додані до Router::groupStack в Router::group (декілька часу тому).
FIG IX. Router::createRoute()
_FIG X.
Витримка з Router::createRoute()_
Деякі думки про те, через що ми пройшли:
Назви Route та Router змушують думати про дві різні концепції, але в Laravel «Фасад» для Router називається Route, що вводить зайву плутанину спочатку.
У нашому прикладі Router робить багато роботи, а RouterRegistrar робить майже нічого. Я б очікував, що Router буде маршрутизувати, а RouterRegistrar фактично реєструвати Routes.
Спосіб обробки $attributes заставляє мене думати про такі речі, як часова зв'язність та слабка методична згуртованість. Мій аргумент/доказ на цю тему - кількість коментарів в Router::group та Router::createRoute, які майже відповідають кількості рядків коду.
Передача Замикань, які викликають методи класу, в методи того самого класу через оболонку класу також виглядає як непотрібний складний витвір.
Мені важко написати висновок до цієї статті.
Наразі я зацікавлений. Я хочу дізнатися більше. Я точно продовжу свій пошук відкриття Laravel.
Проте інколи, як у цьому випадку, мені здається, що Laravel виглядає дивно.
Ось і все. Дякую за увагу.
Відомості: Вважайте цей документ живим, що означає, що він підлягає недокументованим змінам і навіть може зникнути у майбутньому.
Перекладено з: Laravel is weird