Working with
Phoenix
Framework
Ruben Amortegui
@ramortegui
https://www.rubenamortegui.com
https://github.com/ramortegui
Phoenix
● Web framework
– MVC architectural pattern.
– Fast
– Concurrent
– Reliable
● Fast
– Model of concurrency
– Leverage pattern matching router functions
– Templates are pre-compiled
● Concurrent
– Elixir programming model makes reasoning about
concurrent systems almost as easy as reasoning
about single-threaded ones.
● Reliable
– Based on Processes:
● Linking structure
● Communication
● Supervision trees.
Status
● V 1.4.0 Nov. 7th 2018
– Bug fixes
– Cowboy 2 support
● Http2
– JSON library
● `jason` instead of `poison`
– Ecto 3.0
● ecto_sql / ecto
– Webpack
● Remove brunch
– Formatter integration
● Added on Elixir 1.6
Insights
HTTP Request/Response
– HTTP Request
● Cowboy (Plug adapter)
– Endpoint
– Router
– Controller
– Views
– Template
– HTTP Response
● send_resp function
https://elixir-examples.github.io/examples/phoenix-framework-from-http-request-to-response
Plug
– Plug is a specification for composable modules in
between web applications.
– It is also an abstraction layer for connection
adapters of different web servers.
Plug
– Function
● Specific for the module
– Module
● Shareable functionality
● Load resource on controllers
Plug as a Function
Plug as a Module
Transform a Conn
HTTP Request/Response
– HTTP Request
● Cowboy (Plug adapter)
– Endpoint
– Router
– Controller
– Views
– Template
– HTTP Response
● send_resp function
https://elixir-examples.github.io/examples/phoenix-framework-from-http-request-to-response
Endpoint
– The start and end of the request life cycle
– Handles all aspects of requests up until the point
where the router takes over
– Provides a core set of plugs to apply to all requests
– Dispatches requests into a designated router
Router
– Parses incoming requests and dispatches them to
the correct controller/action, passing parameters as
needed.
– Provides helpers to generate route paths or urls to
resources.
– Defines named pipelines through which we may
pass our requests.
– Pipelines - allow easy application of groups of plugs
to a set of routes.
Controllers
– Provide functions called actions to handle requests
– Actions:
● Prepare data and pass it into views
● Invoke rendering via views
● Perform redirects
Views
– Render templates
– Act as a presentation layer
– Define helper functions, available in templates, to
decorate data for presentation
Templates
– Files containing the contents that will be served in a
response.
– Provide the basic structure for a response, and
allow dynamic data to be substituted in.
– Are pre-compiled and fast.
Channels and PubSub
● Channels
– Manage sockets for easy real time communication
– Are analogous to controllers except that they allow bi-
directional communication with persistent connections
● PubSub
– Underlies the channel layer and allows clients to
subscribe to topics
– Abstracts the underlying PubSub adapter for third-
party PubSub integration
Default Structure and Files
– mix phx.new test_app
Generators – phx.gen.html
mix phx.gen.html Accounts User users
name:string age:integer
Generators – phx.gen.html
– Migration
– Model
– Context
– View
– Template
– Tests
Developer tips
● How to get help?
– mix help
– mix help phx.new
● Inside iex
– h function/arity
– Eg: iex> h IO.puts
Developer tips
● .iex.exs
Developer Tips
● mix format
Developer Tips
● Working in a team
– Migrations
– Javascript dependencies
– Mix dependencies
● Add mix tasks for updates
– mix update
Developer Tips
● Code Analyzer
– https://github.com/rrrene/credo
Credo
● mix credo --all
Credo
● mix credo –strict --all
Credo
Developer Tips
● CircleCI, TravisCI
– Run tests
– Check format
– Analyze code
Libraries
● Authentication
– Guardian (protection and function callbacks for
authentication)
● Implements JSON Web Token
● https://github.com/ueberauth/guardian
Libraries
● Authorization and Resource loads
– Canary
● https://github.com/cpjk/canary
– Bodyguard
● https://github.com/schrockwell/bodyguard
– Policy Wonk(*)
● https://github.com/boydm/policy_wonk
Libraries
● Tests
– ExUnit
– Tags
– Setup
– ex_machina
Libraries
● Deployments
– Server
● Distillery
– Build releases
– https://github.com/bitwalker/distillery
● Edeliver
– Build and deploy elixir apps with hot code upgrade.
– https://github.com/edeliver/edeliver
– Heroku
● https://hexdocs.pm/phoenix/heroku.html
Other Libraries
● Wrappers
– Clamxir: ClamAV wrapper based on Clamby.
Summary
● HTTP Request/Response with phoenix is based
on transformation of the structure of
%Plug.Conn{...}, and is fast, no magic.
● Phoenix is based on Plugs, and understanding
plugs will make your work with Phoenix a
breeze.
References
● https://hexdocs.pm/phoenix/overview.html
● https://hexdocs.pm/phoenix/plug.html
● Programming phoenix 1.4. Chris McCord,
Bruce Tate, José Valim. V Oct 19. 2018
Thanks!
Q & A?
@ramortegui
https://www.rubenamortegui.com
https://github.com/ramortegui