Каков наилучший способ использования функций контроллера и Conn в подключаемом модуле? - PullRequest
1 голос
/ 03 октября 2019

Я хочу написать свой собственный плагин в моем приложении Phoenix. Плагин должен проверять куки и отображать страницу с ошибкой, если куки не существуют. Похоже на ошибку 404. Исходя из логики, могут быть вызваны следующие функции:

  • put_status: установить код состояния ответа, я установил 422.
  • put_view: страница моей ошибкинаходится в templates/error/422.html.eex, поэтому следует включить ErrorView.
  • render: отрисовать HTML-страницу.
  • halt: прервать соединение.
conn
|> put_status(422)
|> put_view(ErrorView)
|> render("422.html")
|> halt()

put_status и halt в Plug.Conn. put_view и render находятся в Phoenix.Controller. Я знаю, что могу использовать полное пространство имен для вызова этих функций, но это выглядит избыточно. Поэтому я рассматриваю также функции import/use/alias.

Для Plug.Conn Книга программирования Phoenix 1.4 использует import​ Plug.Conn, некоторые официальные плагины используют alias Plug.Conn.

Для Phoenix.ControllerЯ не нашел ни одного примера, но import может сработать. Не рекомендуется ли использовать функции контроллера в Plug?

Я рассматриваю как упрощение кода, удобочитаемость и производительность. Кто-нибудь знает, что лучше для этого?

Cheers

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Что касается псевдонима / импорта, ни один из них не приводит к снижению производительности.

В документе import он говорит:

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

И псевдоним тоже делает это с включенным пространством имен.

Следовательно, и alias Plug.Conn, и import Plug.Conn хорошо использовать в модуле штекера.

0 голосов
/ 03 октября 2019

Вы можете импортировать Phoenix.Controller и Plug.conn в ваш плагин и импортировать этот плагин в контроллер.

defmodule DubberConnectWeb.CheckCookie do
  import Plug.Conn
  import Phoenix.Controller

  def check_cookie(conn, _opts) do
    if <check cookie existence condition..> do
     conn
     |> put_status(422)
     |> put_view(DubberConnectWeb.ErrorView)
     |> render("422.html")
     |> halt()
    else
     conn
    end
  end
end 

Затем в вашем контроллере вы просто выполните

import DubberConnectWeb.CheckCookie
plug(:check_cookie)
...