/var/log/messages

Apr 5, 2019 - 3 minute read - Comments - programming

phoenix excersize (6)

昨日のつづきと Controllers は長いので適当なあたりまでについて以下に控えを列挙します。

Using SSL

  • SSL を介するアプリを用意するためには少々の構成と二つの環境変数を追加する必要あり
  • SSL が機能するためには認証局からもらったキーと証明書が必要で、環境変数はこれらのファイルへのパスになる
  • 設定は
    • 値がポート番号のキーワードリスト
    • キーファイルへのパス
    • 証明書へのパス

以下が config/prod.exs の例。

use Mix.Config

config :hello, HelloWeb.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [host: "example.com"],
  cache_static_manifest: "priv/static/cache_manifest.json",
  https: [
    port: 443,
    otp_app: :hello,
    keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
    certfile: System.get_env("SOME_APP_SSL_CERT_PATH"),
    # OPTIONAL Key for intermediate certificates:
    cacertfile: System.get_env("INTERMEDIATE_CERTFILE_PATH")
  ]

細かな設定が可能らしいですが詳細については別途確認の方向で。

SSL in Development

  • mix phohenix.gen.cert (原文では mix phx.gen.cert) で自己証明書の発行が可能
    • Erlant/OTP20 以降が必要
  • config/dev/exs の設定で指定すれば良い
config :my_app, MyApp.Endpoint,
  ...
  https: [
    port: 4001,
    cipher_suite: :strong,
    keyfile: "priv/cert/selfsigned_key.pem",
    certfile: "priv/cert/selfsigned.pem"
  ]

Force SSL

  • Endpoint 設定で http を https にリダイレクトさせることができる
  • Web サイトが自身を https を介してのみアクセス可能であると宣言できるメカニズムも使える

Controllers

  • Phoenix controller は中巻モジュールとして機能
  • アクションと呼ばれる機能は http request に応答して Router から呼び出される
  • アクションはビューレイヤを呼び出してテンプレートをレンダリングしたり JSON レスポンスを戻したりする前に必要なデータを全て収集し、必要な手順を全て実行する
  • Phoenix controller も Plug パケジを基盤としていてそれ自体が Plug

以下が controller の実装例。

defmodule HelloWeb.PageController do
  use HelloWeb, :controller

  def index(conn, _params) do
    render(conn, "index.html")
  end
end
  • 最初の行は __using__/1 マクロの呼び出し
  • index アクションが定義されている

Actions

  • アクションは単なる機能であり、Elixir の命名規約に沿っていれば好きな名前をつけて良い
  • 満たすべき唯一の要件はアクションの名前が Router で定義されている経路と一致すること

例えば以下を

get "/", PageController, :index

test にしたら

get "/", PageController, :test

実装はこうなってれば良い、ということになります。

defmodule HelloWeb.PageController do
  use HelloWeb, :controller

  def test(conn, _params) do
    render(conn, "index.html")
  end
end

アクションには好きな名前を付けることができるが可能な限り従うべき命名規約がある。

  • index
  • show
  • new
  • create
  • edit
  • update
  • delete

これらの各アクションは二点の引数を取りますが、これらは裏で Phoenix が提供する。

  • 最初のパラメータは常に conn
    • ホスト、パス要素、ポート、クエリ文字列などのリクエストに関する情報を保持
    • conn は Elixir の Plug ミドルウェアフレームワークを介して Phoenix に来る
    • conn に関するより詳細な情報は Plug のドキュメントにある (別途確認)
  • 二番目のパラメータは params
    • これは http リクエストで渡されるパラメータを保持する map
    • パラメータでパタンマッチして処理するのがオススメ

以下な例をページの追加ガイドで見ているはず。

defmodule HelloWeb.HelloController do
  ...

  def show(conn, %{"messenger" => messenger}) do
    render(conn, "show.html", messenger: messenger)
  end
end

場合によっては index アクションでよくあるように、手続きがパラメータに依存しないため

  def index(conn, _params) do

このような形で引数を記述すればコンパイラが未使用の変数について文句を言うことを防ぐことができます。

Gathering Data

  • Phoenix には独自のデータアクセスレイヤは同梱されていない
  • Elixir プロジェクトの Ecto は Postgres を使っている人にとって優れたソリューションを提供している
    • Ecto Guide 見ましょう
    • Ecto って MySQL もカバーしてるのかしら (別途確認)

phoenix excersize (5) flutter で WebView

comments powered by Disqus