Автор: Віктор Морщ, Developer/PHP support
Матеріали статті підготовлені в рамках внутрішньої програми менторства і навчання фахівців команди Evergreen.
Фреймворки Laravel і Django — це два великих "комбайни" для розробки веб-додатків. Вони мають потужний функціонал в частині бекенду, власні системи роутингу, ORM-системи, адмінку, широке ком'юніті. У Laravel при цьому ще є маса сторонніх сервісів для збірки фронту і бібліотека додатків, які постійно розвиваються і підтримуються авторами. Давайте поговоримо про деякі можливості цих програмних платформ.
Останніми роками на Laravel і Django припадає по 10-15% запитів на Stack Overflow, що стосуються веб-фреймворків. На Github Ларавел має більше переглядів і більше зірок:
Джерело: github.com
"Дерево" пов'язаних технологій на Stack Overflow виглядає доволі цікаво: Laravel знаходиться в самому низу і близько до блоку фронтенд-технологій (React, Angular тощо), поруч з MySQL і Node.js. Django бачимо вгорі схеми, через Python веде зв'язок в сторону Linux, Docker, Kubernetes, AWS та інших. Ці зв'язки будуються на базі пошукових запитів користувачів, і можна припустити, що аудиторія Джанго і Ларавел не вельми перетинається. Але така статистика не означає автоматично, що користувачі Laravel активно взаємодіють з JS і фронтом, а ті хто пишуть на Django, не мають з ними справи. Адже, наприклад, для односторінкового застосунку байдуже, що на бекенді: Django, Laravel чи щось інше.
Джерело: stackoverflow.com
Підходи до моделей в Laravel і Django відрізняються. У Laravel модель — це певна "інструкція" як працювати з таблицями в базі.
Бачимо, що у сутності Account є зв'язок belongsToMany з сутністю loyalty_action. Моделі в Ларавел можуть бути як прості, так і великі і містити приховані поля, прослуховування подій. Структура тут декларується окремими міграціями. Лежать моделі в папці App.
В Django модель декларує структуру бази даних: описуються поля, їхні характеристики, типи даних, обмеження по довжині, задається читабельна назва. Перевагою Django є те, що інформація щодо сутностей зберігається в одному місці.
Тут описуються поля і стандартні функції, які допомагають взаємодіяти з базою. Також інформація з фрагмента коду вище використовується при валідації запитів до методів API сутності Project. У структурі проекту також знайдемо папку migrations — міграції генеруються з моделей.
У Laravel модель фактично складається тільки з функцій, а самі поля не описує.
Вам буде цікаво: Low-Code і Zero-Code: як ви можете створювати кастомні додатки без програмістів
ORM-система Laravel називається Eloquent ORM. Синтаксис у Eloquent ORM SQL-подібний:
Ми отримуємо примірник QueryBuilder викликаючи статичний метод whereHas (а також where (), query () або інший метод у будь-якої моделі). Далі умови сюди додаються через чейнінг. Where () передбачає декілька варіантів аргументів: або 2 змінні (першою йде назва поля, другим очікуване значення — вважається, що між ними стоїть "дорівнює"), 3 змінні (тоді передається ще оператор '>' або '<', '=' , like тощо). Як аргумент може передаватися також функція для групування умов. Такий підхід має плюси:
ORM система Django спирається на два методи: filter і exclude. Як можна здогадатися з назви, перший залишає у вибірці тільки те, що потрапляє під умови в нього передані, другий навпаки "виключає". Для методів filter і exclude використовується свій синтаксис іменованих аргументів (не схожий на SQL-запити), який дозволяє взаємодіяти з полями моделі просто по їх назві, а для переходу до вкладених сутностей використовується подвійне нижнє підкреслення, наприклад, timetable_ _schedule_ _code = self.userprofile .education_form.code
Це означає, що у GradeBook є поле timetable, яке містить сутність з полем schedule, яке в свою чергу містить сутність з полем type, а вже воно містить поле code.
Також для нерівностей є можливість додавати на кінець назви аргументу через подвійне нижнє підкреслення isnull, gte, lte тощо. Підхід відрізняється від підходу в Laravel, але який з них складніший — відповісти важко, швидше, це справа звички і уподобань розробника.
Рекомендуємо: Моделі життєвого циклу, принципи і методології розробки програмного забезпечення
В Ларавел контролери лежать у папці http/Controllers/Api. В контролерах Ларавел немає нічого надзвичайного, все просто і зрозуміло.
У Django підхід відрізняється, контролери називаються views. Тут прийнято використовувати вбудовані дженерики (generic views), що містять набір певних готових рішень, приклад нижче:
Бачимо, що клас успадковується від TemplateView — це джангівський дженерик, який вміє рендерити шаблон і передавати в контекст цього шаблону змінні, отримані з запиту. Також цей клас успадковується від BaseView. BaseView — об'єкт, який домішує до відповіді стандартні речі, в нашому випадку — meta-теги і так далі. Дженерики дозволяють імперативно домогтися потрібного результату на противагу більш декларативному підходу у Ларавел.
У Ларавел маршрути визначені файлами в папці routes, що лежить в корені проекту: api.php, channels.php, console.php, web.php. У web потрапляють звичайні роути, які мають повертати шаблони. Channels.php потрібен для realtime-з'єднань, наприклад, веб-сокетів. Через console.php можна створювати консольні команди для Artisan — інтерфейсу командного рядка, що входить до складу Ларавел.
Найпростіший маршрут в Laravel складається з URL і функції-замикання. Роути також можна групувати через метод group — задавати префікс шляху для наборів маршрутів, а не вказувати для кожного окремо. Сюди спочатку передається якийсь масив з настройками, префікс для URL'а, namespace, тип запиту (get, post) тощо. В контролери також можна передавати аргументи {id}, шаблонні шляхи.
Зручно, що роути лежать в одному файлі — сильно не заплутаєшся.
У Джанго в кожної програми в головній папці є файл urls.py, в якому задані шляхи:
Також деякі дженерики дозволяють генерувати набір URL'ів для себе:
Можемо підключити сюди інший файл urls або роут, згенерований дженериком. Підхід до маршрутизації тут схожий, але адреси розкидані по різних файлах, що на практиці може не завжди бути зручно.
Django має дуже зручний вбудований інтерфейс адміністратора, який автоматично генерується під час створення програми. У Laravel немає вбудованої адмінки, але для неї існують готові консолі, наприклад, Laravel Nova від розробників платформи. Nova — це single page application, і встановлюється вона буквально однією командою. Nova платна, проте ви знайдете безліч безкоштовних адміністративних панелей або можна зібрати власну, як це зробили ми.
Джерело: nova.laravel.com
Спеціально для вас: Celery & Flower: побудова і налаштування черг
На це питання однозначно відповісти складно. Обидва інструменти потужні і по суті роблять те ж саме. Кожен з підходів, що використовуються в цих фреймворках, для одних розробників виявиться комфортним, а для інших — ні.
Порівняно з Ларавел, який зручний і інтуїтивний, Джанго спочатку мені здавався незрозумілим і заплутаним. Але якщо втягнутися в дженерики і деякі інші особливості, то і з ним працювати буде комфортно. Плюс в тому, що компоненти не потрібно писати з нуля — просто імпортуй і використовуй.
Laravel дуже гнучкий в тому плані, що під нього є багато інструментів, заточених під ті чи інші потреби, наприклад, Telescope — помічник для налагодження додатків, а також велике ком'юніті. Django більш монолітний, вважається, що він не дуже підходить для невеликих проектів. У будь-якому разі вибір кращого інструменту буде залежати від ваших завдань і вимог.
Якщо вам потрібна допомога в розробці або реалізації ідеї, звертайтеся до нас.