Возможности Laravel и Django: какой фреймворк выбрать 8 Возможности Laravel и Django: какой фреймворк выбрать 9 Возможности Laravel и Django: какой фреймворк выбрать 10

Знакомство с Laravel и Django: что выбрать

#Разработка

Автор: Виктор Морщ, Developer/PHP support

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

Фреймворки Laravel и Django — это два больших “комбайна” для разработки веб-приложений. У них мощный функционал по части бэкенда, собственные системы роутинга, ORM-системы, админка, широкое комьюнити. У Laravel при этом еще есть куча сторонних сервисов для сборки фронта и библиотека приложений, которые постоянно развиваются и поддерживаются авторами. Давайте поговорим о некоторых возможностях этих программных платформ.  

Для начала немного статистики

Последние пару лет на Laravel и Django приходится по 10-15% запросов на Stack Overflow, касающихся веб-фреймворков. На Github у Ларавел больше просмотров и больше звезд: 

оценки на Github

Источник: github.com

 “Дерево” связанных технологий на Stack Overflow выглядит довольно интересно: Laravel находится в самом низу и близко к блоку фронтенд-технологий (React, Angular и т.д.), рядом с MySQL и Node.js. Django видим вверху схемы, через Python ведет связь в сторону Linux, Docker, Kubernetes, AWS и других. Эти связи строятся на базе поисковых запросов пользователей, и можно предположить, что аудитория Джанго и Ларавел не слишком пересекается. Но такая статистика не означает автоматически, что пользователи Laravel активно взаимодействуют с JS и фронтом, а те кто пишут на Django, с ними не соприкасаются. Ведь, например, для одностраничного приложения без разницы, что на бэкенде: Django, Laravel или что-то другое.

дерево связанных технологий Stack Overflow

Источник: stackoverflow.com

Модели: что по коду

Подходы к моделям в Laravel и Django отличаются. В Laravel модель — это некая “инструкция” как работать с таблицами в базе.

представление модели в Ларавел

Видим, что у сущности Account есть связь belongsToMany с сущностью loyalty_action. Модели в Ларавел могут быть как простые, так и обширные и содержать скрытые поля, прослушивание событий. Структура здесь декларируется отдельными миграциями. Лежат модели в папке App. 

В Django модель декларирует структуру базы данных: описываются поля, их характеристики, типы данных, ограничения по длине, задается человекочитаемое название. Преимущество Django — то, что информация касательно сущностей хранится в одном месте.

представление модели в DjangoЗдесь описываются поля и стандартные функции, которые помогают взаимодействовать с базой. Также информация с фрагмента кода выше используется при валидации запросов к методам API сущности Project. В структуре проекта также найдем папку migrations — миграции генерируются из моделей. 

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

Вам будет интересно: Low-Code и Zero-Code: как вы можете создавать кастомные приложения без программистов

ORM-системы

ORM-система Laravel называется Eloquent ORM. Синтаксис у Eloquent ORM SQL-подобный: 

фрагмент синтаксиса Eloquent ORM

Мы получаем экземпляр QueryBuilder вызывая статический метод whereHas (а также where(), query() или другой метод у любой модели). Дальше условия сюда добавляются через чейнинг. Where() предполагает пару вариантов аргументов: либо 2 переменные (первой идет название поля, второй ожидаемое значение — считается, что между ними стоит "равно"), 3 переменные (тогда передается еще оператор ‘>’ или ‘<’, ‘=’, like и т.п.). В качестве аргумента может передаваться также функция для группировки условий. У такого подхода есть плюсы: 

  • синтаксис похож на SQL, в нем проще сориентироваться;
  • благодаря чейнингу можно спрятать часть запроса внутри методов модели;
  • множество фич Laravel, что делают работу с запросами более удобной и лаконичной (к примеру, scope).

Django ORM

ORM система Django опирается на два метода: filter и exclude. Как можно догадаться из названия, первый оставляет в выборке только то, что попадает под условия в него переданные, второй наоборот ”исключает”. Для методов filter и exclude используется свой синтаксис именованных аргументов (не похожий на SQL-запросы), который позволяет взаимодействовать с полями модели просто по их названию, а для перехода к вложенным сущностям используется двойное нижнее подчеркивание, например, timetable_ _schedule_ _code=self.userprofile.education_form.code

Это значит, что у GradeBook есть поле timetable, которое содержит сущность с полем  schedule, которое в свою очередь содержит сущность с полем type, а уже оно содержит поле code.

пример синтаксиса Django ORM

Также для неравенств есть возможность добавлять на конец названия аргумента через двойное нижнее подчеркивание isnull, gte, lte и т.п. Подход отличается от подхода в Laravel, но какой из них сложнее — ответить сложно, скорее, это дело привычки и предпочтений разработчика. 

Рекомендуем: Модели жизненного цикла, принципы и методологии разработки программного обеспечения

Laravel Controllers

В Ларавел контроллеры лежат в папке http/Controllers/Api. В контроллерах Ларавел нет ничего необычного, все просто и понятно. контроллер Laravel

Django Controllers

В Django подход отличается, контроллеры называются views. Здесь принято использовать встроенные дженерики (generic views), содержащие набор неких готовых решений, пример ниже: 

пример дженерика в Django

Видим, что класс наследуется от TemplateView — это джанговский дженерик, который умеет рендерить шаблон и передавать в контекст этого шаблона переменные, полученные из запроса. Также этот класс наследуется от BaseView. BaseView — объект, который примешивает к ответу стандартные вещи, в нашем случае — meta-теги и т.д. Дженерики позволяют императивно добиться нужного результата в противовес более декларативному подходу у Ларавел.

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

В Ларавел маршруты определены файлами в папке routes, лежащей в корне проекта: api.php, channels.php, console.php, web.php. В web попадают обычные роуты, которые должны возвращать шаблоны. Channels.php нужен для realtime-соединений, к примеру, веб-сокетов. Через console.php можно создавать консольные команды для Artisan — интерфейса командной строки, входящей в состав Ларавел. 

Самый простой маршрут в Laravel состоит из URL и функции-замыкания. Роуты также можно группировать через метод group — задавать префикс пути для наборов маршрутов, а не указывать для каждого по отдельности. Сюда сначала передается некий массив с настройками, префикс для ULR’а, namespace, тип запроса (get, post) и т.д. В контроллеры также можно передавать аргументы {id}, шаблонные пути. 

метод group в Laravel

Удобно, что роуты лежат в одном файле — особо не запутаешься.

У Джанго у каждого приложения в главной папке есть файл urls.py, в котором заданы пути:отображение роутов в Джанго

Также некоторые дженерики позволяют генерировать набор URL'ов для себя:

пример urlpatterns в Django

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

Администрирование

У Django очень удобный встроенный интерфейс администратора, который автоматически генерируется при создании приложения. В Laravel нет встроенной админки, но для нее существуют готовые консоли, например, Laravel Nova от разработчиков платформы. Nova — это single page application, и устанавливается она буквально одной командой. Nova платная, но вы найдете много бесплатных административных панелей или можно собрать собственную, как это сделали мы.

интерфейс панели администратора Laravel Nova

Источник: nova.laravel.com

Специально для вас: Celery & Flower: построение и настройка очередей

Что лучше: Django или Laravel?

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

По сравнению с Ларавел, который удобный и интуитивный, Джанго поначалу мне казался непонятным и запутанным. Но если втянуться в дженерики и некоторые другие особенности, то и с ним работать будет комфортно. Плюс в том, что компоненты не нужно писать с нуля — просто импортируй и используй.

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

Если вам нужна помощь в разработке или реализации идеи, обращайтесь к нам.

05.05.2021
Используемые в статье картинки взяты из открытых источников и используются как иллюстрации.
Хотите обсудить ваш проект или заказать разработку?
Отправить
Цей сайт є українською мовою. Ви можете переключити мову у меню, або зробити це зараз.