Laravel дивний.

pic

Фото від Kasia Derenda на Unsplash

Серед розробників, з якими я працював, Laravel ніколи не був популярним, основні причини - ActiveRecord та те, що він не вважається "серйозним фреймворком", якщо так можна виразитися.

Як продукт мого середовища, я повинен сказати, що я не великий фанат Laravel.

Як більшість людей у галузі, які мають досить тверді думки про мову програмування, фреймворк чи інструмент, я кажу це з великою впевненістю, не дійсно працюючи з ним, останнім часом або взагалі ніколи.

Не через ActiveRecord це, скоріше через те, що він не вважається "серйозним фреймворком", і за все те, що я бачив в Laravel коді, який потрапляє в інтернет через статичні виклики.

Нещодавно я дізнався, що ці статичні виклики не є насправді статичними викликами.
Ну вони є, але не зовсім. Це магія, яку ми залишимо на інший раз, але якщо ви невитримані, зверніться до цього.

Інтернет обожнює Laravel. Вперше я працюю з розробником, який дуже зацікавлений у Laravel. Великі компанії-виробники, такі як Personio чи About You використовують/використовували Laravel.

Все це переконало мене, що настав час уважно розглянути Laravel.

Кожного разу, коли я хочу вивчити новий інструмент, я зазвичай починаю з читання документації, поєднуючи це з уважним розглядом того, як речі, представлені в документації, реалізовані.

Саме так я натрапив на це:

pic

Рис. I. Налаштування маршрутів та групування за Контролером в Laravel

Цей код виглядає для мене ненатуральним.

Додання нових маршрутів за допомогою замикань в Laravel

Ми додаємо два нових Маршрути, передаючи Замикання, які викликають методи класу Маршруту, до підгрупи (повернення методу контролера).

Як може підгрупа RouteRegistrar зареєструвати Маршрути лише з Замиканням, яке нічого не повертає? (Підказка: це не можливо)

Коли мені не зрозуміло, як щось працює, я дивлюся на реалізацію, як це роблять інші.

По суті, Route - це просто Фасад до класу Маршруту. Ось краткий курс по фасадам в Laravel, вони є просто "статичними" обгортками над Сервісом, в нашому випадку - над Маршрутизатором.

pic

Рисунок 2. Витяг з визначення класу Route

Метод Route::controller повертає екземпляр класу RouteRegistrar, який в разі методу підгрупи RouteRegistrar::group є просто Адаптером для Маршрутизатора, того самого Маршрутизатора, на який вказує Фасад Route.

pic

Рисунок 3. Метод RouteRegistrar::group

Підемо далі в метод Маршрутизатор::group.

pic

Рисунок 4. Метод Маршрутизатор::group.

Тут речі стають дивними, тому й потрібний трьохрядковий коментар, настільки ж кілька рядків коду міститься всередині цього foreach.

$attributes, які в нашому випадку порожні, а в інших випадках ні, потрібно потрапити в Маршрут якимось чином. Це досягається тимчасовим додаванням їх до властивості groupStack класу Маршрутизатор для використання їх у методі loadRoutes Маршрутизатора, після чого ми викидаємо їх.

Це дивно, і найкращий доказ того, що це дивно - це трьохрядковий коментар, який пояснює чому потрібно щось кудись помістити і чому ми можемо просто викинути це після цього.

Пояснення процесу додавання маршрутів в Laravel

Пам'ятаєте, як все почалося? Я б не пам'ятав також, тому дозвольте згадати:

Я хотів зрозуміти, як метод RouterRegistrar::group (тепер відомий як Router::group в образі) додає два маршрути, отримуючи метод, який нічого не повертає.

Перейдемо до Router::loadRoutes

pic

FIG V. Router::loadRoutes

У нашому випадку $routes дійсно є замиканням, яке буде виконане.

Його точно це замикання.

pic

FIG VI. Замикання, яке буде виконане в Router::loadRoutes

Далі до Router::get і Router::post. Я кажу _Router і не Route, оскільки тепер ми знаємо, що Route це лише "фасад" для Router.

pic

FIG VII. Router::get

Як Router::get, так і Router::post - це всього лише адаптери для Router::addRoute.

Далі до Router::addRoute.

pic

FIG VIII. Router::addRoute

Хоча це може бути не зовсім очевидно, ми знайшли відповідь на наше питання.

RouteRegistrar насправді не реєструє жодного Route (принаймні не безпосередньо), що, разом з тим, що вміст замикання фактично реєструє Route, означає, що замикання не повинне повертати нічого.

Для додаткових балів ми зайдемо ще на один рівень глибше в Router::createRoute, щоб побачити, де використовуються атрибути, додані до Router::groupStack в Router::group (декілька часу тому).

pic

FIG IX. Router::createRoute()

pic

_FIG X.

Витримка з Router::createRoute()_

Деякі думки про те, через що ми пройшли:

Назви Route та Router змушують думати про дві різні концепції, але в Laravel «Фасад» для Router називається Route, що вводить зайву плутанину спочатку.

У нашому прикладі Router робить багато роботи, а RouterRegistrar робить майже нічого. Я б очікував, що Router буде маршрутизувати, а RouterRegistrar фактично реєструвати Routes.

Спосіб обробки $attributes заставляє мене думати про такі речі, як часова зв'язність та слабка методична згуртованість. Мій аргумент/доказ на цю тему - кількість коментарів в Router::group та Router::createRoute, які майже відповідають кількості рядків коду.

Передача Замикань, які викликають методи класу, в методи того самого класу через оболонку класу також виглядає як непотрібний складний витвір.

Мені важко написати висновок до цієї статті.

Наразі я зацікавлений. Я хочу дізнатися більше. Я точно продовжу свій пошук відкриття Laravel.

Проте інколи, як у цьому випадку, мені здається, що Laravel виглядає дивно.

Ось і все. Дякую за увагу.

Відомості: Вважайте цей документ живим, що означає, що він підлягає недокументованим змінам і навіть може зникнути у майбутньому.

Перекладено з: Laravel is weird

Leave a Reply

Your email address will not be published. Required fields are marked *