- Backwards incompatible changes
- [Controller]
html/2
,json/2
,text/2
,redirect/2
andrender/3
no longer halt automatically
- [Controller]
- Enhancements
- [Controller] Allow sensitive parameters to be filtered from logs
- [Router] Add ability for routes to be scoped by hostname via the :host option
- [Router] Add
Plug.Debugger
that shows helpful error pages in case of failures - [Router] Add
Phoenix.Router.RenderErrors
which dispatches to a view for rendering in case of crashes - [Router] Log which pipelines were triggered during a request
- [Channel] Allows custom serializers to be configured for WebSocket Transport
See the 0.5.x
to 0.6.0
upgrade instructions for upgrading your
existing applications.
-
Enhancements
- [Controller] Support
put_view/2
to configure which view to use when rendering in the controller - [Controller] Support templates as an atom in
Phoenix.Controller.render/3
as a way to explicitly render templates based on the request format - [Controller] Split paths from external urls in
redirect/2
- [Controller]
json/2
automatically encodes the data to JSON by using the registered:format_encoders
- [Controller]
html/2
,json/2
,text/2
,redirect/2
andrender/3
now halt automatically - [Controller] Add
accepts/2
for content negotiation - [Controller] Add
put_layout_formats/2
andlayout_formats/1
to configure and read which formats have a layout when rendering - [View] Assigns are always guaranteed to be maps
- [View] Add support to
format_encoders
that automatically encodes rendered templates. This means a "user.json" template only needs to return a map (or any structure encodable to JSON) and it will be automatically encoded to JSON by Phoenix - [View] Add a .exs template engine
- [Channel] Add a
Transport
contract for custom Channel backends - [Channel] Add a
LongPoller
transport with automatic LP fallback inphoenix.js
- [phoenix.js] Add long-polling support with automatic LP fallback for older browsers
- [Controller] Support
-
Deprecations
- [Controller]
html/3
,json/3
,text/3
andredirect/3
were deprecated in favor of usingput_status/2
- [Controller]
redirect(conn, url)
was deprecated in favor ofredirect(conn, to: url)
- [Controller]
-
Backwards incompatible changes
- [Controller] Passing a string to render without format in the
controller, as in
render(conn, "show")
no longer works. You should either make the format explicitrender(conn, "show.html")
or use an atomrender(conn, :show)
to dynamically render based on the format - [View] Using
:within
was renamed in favor of:layout
for rendering with layouts - [View] Your application should now directly use Phoenix.View in
its main view and specify further configuration in the
using(...)
section - [View] Template engines now should implement compile and simply return the quoted expression of the function body instead of the quoted expression of the render function
- [Router]
PUT
route generation for the:update
action has been dropped in favor ofPATCH
, butPUT
still matches requests to maintain compatibility with proxies. - [Router] Router no longer defines default :browser and :api pipelines
- [Controller] Passing a string to render without format in the
controller, as in
-
Bug fixes
- [Router] Generate correct route for helper path on root
-
Enhancements
- [Router] Named helpers are now automatically generated for every route based on the controller name
- [Router] Named helpers have been optimized to do as little work as possible at runtime
- [Router] Support multiple pipelines at the router level
- [Channels] The
phoenix.js
channel client now sends a configurable heartbeat every 30s to maintain connections
-
Deprecations
- [Controller]
assign_private
is deprecated in favor ofput_private
- [Controller]
assign_status
is deprecated in favor ofput_status
- [Controller]
-
Backwards incompatible changes
- [Controller] Remove default, injected aliases:
Flash
,JSON
- [Controller] Controllers now require
plug :action
to be explicitly invoked - [Router]
*path
identifiers in routers are now returned as a list - [Router] Named helpers are now defined in a explicit module nested
to your router. For example, if your router is named
MyApp.Router
, the named helpers will be available atMyApp.Router.Helpers
- [Router]
session_secret
configuration is deprecated in favor ofsecret_key_base
- [Router] Plugs can now only be defined inside pipelines. All routers now need to explicitly declare which pipeline they want to use
- [Router] Router configuration was revamped, static configuration
has been moved into
:static
, session configuration into:session
, parsers configuration into:parsers
, the http server configuration has been moved into:http
, the https configuration into:https
and the URI information for generating URIs into:uri
- [CodeReloaer] Code reloading now requires the
:phoenix
compiler to be added to the list of compilers in yourmix.exs
project config, ie:compilers: [:phoenix] ++ Mix.compilers
. Additionally, thePhoenix.CodeReloader.reload!
invocation should be removed from yourtest_helper.exs
for applications generated on0.4.x
. - [Topic]
Phoenix.Topic
has been renamed toPhoenix.PubSub
. If you were calling into the topic layer directly, update your module references.
- [Controller] Remove default, injected aliases:
- Bug fixes
- [Project Generation] Fix project template dependencies pointing to incorrect phoenix and elixir versions
-
Enhancements
- [Controller] Controllers are now Plugs and can be plugged as a "second layer" plug stack from the Router plug stack
- [Controller] Elixir Logger Integration - Improved request logger, durations, params, etc
- [Controller] Custom 404/500 page handling, details
- [Controller] Ability to halt Plug stacks with Plug 0.7.0
halt/1
- [Controller] Add
assign_layout/2
andassign_status/2
- [Controller] Flash messages for one-time message support across redirects
- [View] Internationalization support
- [View] New
Template.Engine
behaviour for third-party template engines. See PhoenixHaml for haml support via Calliope. render/2
can be explicitly plugged for automatic rendering of actions based on action name- [Channel] Assign API for Sockets allows ephemeral state to be stored on the multiplexed socket, similar to conn assigns
- [Config] Add
proxy_port
Router config option for deployments where public facing port differs from local port - [Router] Add nested generated
Helpers
module to Routers for easy imports of named route helpers, ieimport MyApp.Router.Helpers
-
Bug fixes
- Various bug fixes and improvements
-
Backwards incompatible changes
- [Config] ExConf Configuration has been replaced by Mix Config
- Directory and naming conventions have changed. A
web/
directory now lives at root of the project and holds routers, controllers, channels, views & templates, where allweb/
files are recompiled by the code reloader during development. Modules that cannot be simply recompiled in process are placed in lib as normal and require a server restart to take effect. Follow this guide for upgrade steps from 0.3.x. - Naming conventions now use singular form for module names, directory names, and named route helpers
- [Router] Named route helpers have been reworked to use single function name with pattern matched arguments. See the readme examples
- [Controller]
layout: nil
render option has been replaced byassign_layout(conn, :none)
- [Plugs]
Plugs.JSON
now adds parsed params under "_json" key when the JSON object is an array
- Enhancements
- Various performance improvements
-
Enhancements
- Add Precompiled EEx Templating Engine and View layer
- Add JSON Plug parser
- Update Plug to 0.5.2 with Cookie Session support
- URL helpers ie,
Router.page_path
, now properly encode nested query string params
-
Bug fixes
- Auto template compilation has been fixed for Elixir 0.14.2
@external_resource
changes
- Auto template compilation has been fixed for Elixir 0.14.2
-
Backwards incompatible changes
- Controller action arity has changed. All actions now receive the
Plug conn and params as arguments, ie
def show(conn, %{"id" => id})
- Channel and Topic
reply
andbroadcast
functions now require a map instead of an arbitrary dict
- Controller action arity has changed. All actions now receive the
Plug conn and params as arguments, ie