1. Введение в контексты
Исходный кодРуководства по Phoenix разделены на несколько основных разделов. Основные строительные блоки описаны в разделе «Основные концепции», где мы изучили жизненный цикл запроса, связали действия контроллеров с помощью маршрутизаторов и узнали, как Ecto позволяет проверять и сохранять данные. Теперь пора связать всё воедино и создать функции, доступные через веб-интерфейс и взаимодействующие с нашим приложением на Elixir.
Создавая проект Phoenix, мы в первую очередь создаём приложение на Elixir. Задача Phoenix — предоставить веб-интерфейс к нашему приложению на Elixir. Разумеется, мы составляем приложения из модулей и функций, но часто поручаем определённые задачи конкретным модулям и даём им названия, например: контроллеры, маршрутизаторы и live-представления.
Однако важнейшая часть веб-приложения часто заключается в том, где мы инкапсулируем доступ к данным и их проверку. Такие модули мы называем контекстами. Они часто взаимодействуют с базой данных с помощью Ecto или с API, используя HTTP-клиент, например Req. Давая этим модулям названия, мы помогаем разработчикам распознавать такие шаблоны и обсуждать их. В конечном счёте контексты — это просто модули, как и контроллеры, представления и прочее.
Если вы использовали mix phx.gen.html, mix phx.gen.json или mix phx.gen.live, значит, вы уже работали с контекстами. Например, запустите следующий генератор в приложении Phoenix:
$ mix phx.gen.live Post posts title body:text
Приведённая выше команда создаст несколько файлов, в том числе схему MyApp.Posts.Post в lib/my_app/posts/post.ex, описывающую представление ресурса в базе данных, и модуль контекста с именем MyApp.Posts, инкапсулирующий весь доступ к базе данных для этой схемы. Модуль MyApp.Posts централизует все функции, связанные с публикациями, вместо того чтобы распределять логику по контроллерам, LiveViews и другим компонентам.
Контексты также полезны для вложенных ресурсов. Например, если вы добавляете комментарии к публикациям, их схемы можно разместить рядом, поскольку комментарии принадлежат публикациям:
$ mix phx.gen.live Posts Comment comments post_id:references:posts body:text
Первый аргумент приведённого выше генератора — это модуль контекста, указывающий Phoenix разместить функциональность комментариев рядом с функциональностью публикаций. Также имеется атрибут post_id, задающий ссылку внешнего ключа на таблицу публикаций. По мере роста приложения контексты помогают группировать связанные схемы, вместо того чтобы иметь несколько десятков схем без понимания того, как они связаны друг с другом.
Разработчики также могут использовать контексты, чтобы намеренно присваивать названия частям приложения. Например, для работы mix phx.gen.auth требуется явно указать имя контекста. Обычно её запускают так:
$ mix phx.gen.auth Accounts User users
или, выбрав любое подходящее имя, например:
$ mix phx.gen.auth Identity Client clients
Сгенерированный контекст Accounts (или Identity) будет инкапсулировать всю функциональность для управления пользователями (или клиентами) и их токенами. При желании контекст можно назвать и Users, но управление учётными записями и идентификацией имеет чётко определённое название и границы в большинстве приложений, поэтому явное имя проясняет его назначение. И в конечном счёте всё это просто обычные модули.
В этом руководстве мы применим эти идеи при создании веб-приложения. Наша цель — создать систему электронной коммерции, в которой можно демонстрировать товары, позволять пользователям добавлять товары в корзину и оформлять заказы. Для этого мы намеренно спроектируем контексты и дадим им названия. В отличие от других руководств по Phoenix, эти руководства предназначены для последовательного чтения.
Наше приложение для электронной коммерции
Начнём с создания приложения для электронной коммерции с нуля с помощью Phoenix Express. Назовём приложение hello.
Для macOS/Ubuntu:
$ curl https://new.phoenixframework.org/hello | sh
Для Windows PowerShell:
curl.exe -fsSO https://new.phoenixframework.org/hello.bat; .\hello.bat
Если эти команды не работают, ознакомьтесь с руководством по установке, а затем выполните mix phx.new:
$ mix phx.new hello
Выполните любой из шагов, указанных на экране, и откройте созданный проект hello в редакторе.
Теперь можно перейти к следующей главе.
© 2014 Chris McCord
Licensed under the MIT License.
https://phoenix.hexdocs.pm/contexts.html