Phoenix
Configuration
Macros, Macros everywhere. One of the most useful one is config (config/2 with environment and opts, and config/3 with environment, key, and opts). It is present in proj_root/config/*.exs.
config :namespace, key_to_be_configured,
key: value,
key: value,
key: value
Refer to Config for documentation. For example
config :learning, App.Repo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "app_dev",
pool_size: 10
This will set config for App.Repo and assuming Ecto.Repo is used to define the repo, it will use adapter Ecto.Adapters.Postgres (by default) and use config values to connect to the database.
Constructor Reducers and Converter in Phoenix
Plug.Conn is useful struct used heavily in Phoenix. It is a struct that holds information about the connection. It is passed around in the pipeline and is used to render the response. It is defined in Plug.Conn module.
Plug has many Reducer functions to modify the connection. Pheonix is giant function with CRC pipeline.
connection_from_request
|> endpoint
|> router
|> custom_application
LiveView
It is closer to react. Router routes to the liveview and then it is mounted and rendered. Events are observed and re-rendered. mount/3 -> render/1 -> handle_event/3
Pheonix LiveView is a set of three main components:
Phoenix.ComponentPhoenix.LiveViewPhoenix.LiveComponent
How?
You use a
live/3function in the router to route to a liveview.
scope "/", NameWeb do
pipe_through :browser
get "/", PageController, :home
live "/live", NameLive
end
Assign a socket to the liveview
def mount(_params, _session, socket) do
{:ok, assign(socket, :message, "Hello World")}
end
Mount either returns {:ok, socket} or {:error, reason}.
Render the liveview
def render(assigns) do
~H"""
Hello <%= @message %>
"""
end
~H is a sigil for HEEx.
Handle events
def handle_event("click", %{"message" => message}, socket) do
{:noreply, assign(socket, :message, "Clicked!")}
end
Same as render it will return {:noreply, socket} or {:reply, {:ok, assigns}, socket} or {:stop, reason, socket}.
Generators
phx.gen provides a bunch of generator functions to generate boilerplate code.
phx.gen.auth Accounts User userswhereAccountsis the context,Useris the schema, andusersis the plural name(bu default also table name). Authentication Service is defined inapp/lib/app_web/user_auth.ex. Almost everything in here is a Plug.