© 2021 WebHive

Новый Phoenix - опять всё переделали

Некоторое время назад в процессе расширения своих познаний в области веб разработки окунулся в прекрасный мир программирования на elixir и в частности использования фреймворка Phoenix. Не так давно он (Phoenix) обновился до версии 1.3 и как я обнаружил все мои познания пошли прахом — всё перевернуто с ног на голову и в общем весь опыт в этой области можно смело выбросить на помойку. Ситуация в мире ИТ не нова, а вариант решения всего один — разобраться со всем этими нововведениями и начать жить заново.

Итак первое, что бросилось в глаза — mix-овые задачи сменили префикс с phoenix на phx. В общем-то неплохо и я даже этому скорее рад ибо люблю лаконизм во всех его проявлениях.

Второй момент, который насторожил, это исчезнувшая директория web, но её содержимое быстро нашлось. Не вполне понял смысл этого действа, но пишут, что типа стало меньше неоднозначности куда складывать код — типа раньше были две папки lib и web, а сейчас осталась только lib. Ну ладно — проглотим. Собственно ничего деструктивного тут не вижу.

Теперь проблемы посерьёзнее — как оказалось теперь phoenix не рекомендует создавать модели, а предлагает создать вместо модели схему. Ну ок — пробуем. Ну да теперь вместо модели, теста и миграции создаётся только файл схемы и миграция. Хммм … ну что — вполне логично. Собственно и раньше модели были довольно странными и нифига не были похожи на те модели к которым мы привыкли. Скорее это была концепция объектов и репозитариев, где данные и способы их хранения фактически были разными сущностями. Похоже решили пока не поздно назвать таки вещи своими именами во избежание путаницы. Ладно — годное изменение.

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

Модели похоже вообще исчезли как класс. Вся логика похоже переезжает как раз в эти самые контексты. Как-то придётся переосмыслить подходы к построению приложений. Походу один контекст сейчас может объединять несколько схем. Остаётся вопрос как быть если схема нужна сразу нескольким контекстам. Есть повод подумать и порыть информацию.

Ха! Я тут порыл немного по теме — контексты это просто отличная идея. Теперь не нужен весь этот код в контроллерах для сохранения моделей — changeset-ы, репозитарии — все это уехало как раз в контексты. И если раньше код контроллеры выглядел как-то так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
def create(conn, %{"entity" => entity_params}) do
changeset = Entity.changeset(%Entity{}, entity_params)

case Repo.insert(changeset) do
{:ok, entity} ->
conn
|> put_status(:created)
|> put_resp_header("location", entity_path(conn, :show, entity))
|> render("show.json", entity: entity)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(MyFilamentApi.ChangesetView, "error.json", changeset: changeset)
end
end
...

То теперь вс выглядит как-то так:

1
2
3
4
5
6
7
8
9
10
...
def create(conn, %{"entity" => entity_params}) do
with {:ok, %Entity{} = entity} <- Parts.create_entity(entity_params) do
conn
|> put_status(:created)
|> put_resp_header("location", entity_path(conn, :show, entity))
|> render("show.json", entity: entity)
end
end
...

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

Похудели контроллеры — навскидку стало меньше кода. Это не может не радовать — в старом phoenix-е херова гора лишнего кода изрядно раздражала.

Добавился fallback контроллер, теперь все ошибки можно тупо ловить и обрабатывать в нём, а не писать оромные case-ы в каждом котроллере. Ну да — они пишутся генераторами автоматически, но потом это гуано разгребать довольно утомительно. В rails такая тема есть уже давно и как-то даже странно слышать об этом как о каком-то значимом улучшении, но тем не менее появление такого функционала в phoenix определённо шаг вперёд, хотя и говорит о том, что phoenix-у ещё расти и расти.

Источники вдохновения

Комментарии