-
Javascript client backward incompatible changes
- The
Socket
instance no long connects automatically. You must explicitly callconnect()
close()
has been renamed todisconnect()
send
has been renamed topush
to unify client and server messaging commands
- The
-
Backwards incompatible changes
-
[Channel]
reply
has been renamed topush
to better signify we are only push a message down the socket, not replying to a specific request. -
use Phoenix.HTML
no longer imports controller functions. You must addimport Phoenix.Controller, only: [get_flash: 2]
manually to your views or yourweb.ex
-
Code reloader must now be configured in your endpoint instead of Phoenix. Therefore, upgrade your
config/dev.exs
replacingconfig :phoenix, :code_reloader, true
by
config :your_app, Your.Endpoint, code_reloader: true
Furthermore, the Phoenix.CodeReloader plug must be plugged only if
code_reloading?
is enabled. So you'll need to wrap it accordingly inlib/your_app/endpoint.ex
:if code_reloading? do use Phoenix.CodeReloader end
-
The
live_reload
configuration has changed to allow a:url
option to be customized for operation with tools like pow in development. By default live reload WebSocket url is "/phoenix". This will causewindow.location
to be used. Aspow
only works with HTTP, you need to set the:url
option accordingly with your localhost config and port.config :your_app, Your.Endpoint, code_reloader: true, live_reload: [ url: "ws://localhost:4000", paths: [Path.expand("priv/static/javascripts/app.js"), Path.expand("priv/static/stylesheets/app.css"), Path.expand("web/templates/**/*.eex")]]]
-
-
Enhancements
- Allow the default format used when rendering errors to be customized in the
render_views
configuration - Add
button/2
function toPhoenix.HTML
- Add
textarea/3
function toPhoenix.HTML.Form
- Allow the default format used when rendering errors to be customized in the
-
Bug fixes
- Fix out of order hours, minutes and days in date/time select
See these 0.9.x
to 0.10.0
upgrade instructions to bring your existing apps up to speed.
-
Enhancements
- [CLI] Make
phoenix.new
in sync withmix new
by making the project diretory optional - [Controller] Add
scrub_params/2
which makes it easy to remove and prune blank string values from parameters (usually sent by forms) - [Endpoint] Runtime evaluation of
:port
configuration is now supported. When given a tuple like{:system, "PORT"}
, the port will be referenced fromSystem.get_env("PORT")
at runtime as a workaround for releases where environment specific information is loaded only at compile-time - [HTML] Provide
tag/2
,content_tag/2
andcontent_tag/3
helpers to make tag generation easier and safer - [Router] Speed up router compilation
- [CLI] Make
-
Backwards incompatible changes
- [Plug] Update to Plug 0.10.0 which moves CSRF tokens from cookies back to sessions. To avoid future bumps on the road, a
get_csrf_token/0
function has been added to controllers - [PubSub] Remove the option
:options
from:pubsub
. Just define the options alongside the pubsub configuration - [Pubsub] Require the
:name
option when configuring a pubsub adapter
- [Plug] Update to Plug 0.10.0 which moves CSRF tokens from cookies back to sessions. To avoid future bumps on the road, a
See these 0.8.x
to 0.9.0
upgrade instructions to bring your existing apps up to speed.
-
Enhancements
- [PubSub/Channels] The PubSub layer now supports Redis, and is opened up to other third party adapters. It still defaults to PG2, but other adapters are convenient for non-distributed deployments or durable messaging.
-
Bug fixes
- [Plug] Ensure session and flash are serializable to JSON
-
Backwards incompatible changes
- [PubSub] The new PubSub system requires the adapter's configuration to be added to your Endpoint's mix config.
- [PubSub] The
Phoenix.PubSub
API now requires a registered server name, iePhoenix.PubSub.broadcast(MyApp.PubSub, "foo:bar", %{baz: :bang})
- [Channel] Channel broadcasts from outside a socket connection now must be called from an Endpoint module directly, ie:
MyApp.Endpoint.broadcast("topic", "event", %{...})
- [Channel] The error return signature has been changed from
{:error, socket, reason}
to{:error, reason, socket}
- [Plug]
Plug.CSRFProtection
now uses a cookie instead of session and expects a"_csrf_token"
parameter instead of"csrf_token"
- [Router/Controller] The
destroy
action has been renamed todelete
, update your controller actions and url builders accordingly
See these 0.7.x
to 0.8.0
upgrade instructions to bring your existing apps up to speed.
-
Enhancements
- [Router]
protect_from_forgery
has been added to the Router for CSRF protection. This is automatically plugged in new projects. See this example for plugging in your existing router pipeline(s) - [Router] New
socket
macro allows scoping channels to different transports and mounting multiple socket endpoints - [Channels] The "topic" abstraction has been refined to be a simple string identifier to provide more direct integration with the
Phoenix.PubSub
layer - [Channels] Channels can now intercept outgoing messages and customize the broadcast for a socket-by-socket customization, message dropping, etc
- [Channels] A channel can be left by returning
{:leave, socket}
from a channel callback to unsubscribe from the channel - [Channels] Channel Serializer can now use binary protocol over websockets instead of just text
- [Endpoint] Allow the reloadable paths to be configured in the endpoint
- [Mix] Allow the code generation namespace to be configured with the
:app_namespace
option - [Mix] Allow
:reloadable_paths
in Endpoint configuration to reload directories other than"web"
in development
- [Router]
-
Bug Fixes
- [Channel] Fix WebSocket heartbeat causing unnecessary
%Phoenix.Socket{}
's to be tracked and leave errors on disconnect - [Mix] Ensure Phoenix can serve and code reload inside umbrella apps
- [Channel] Fix WebSocket heartbeat causing unnecessary
-
Backwards incompatible changes
- [Endpoint] Endpoints should now be explicitly started in your application supervision tree. Just add
supervisor(YourApp.Endpoint, [])
to your supervision tree inlib/your_app.ex
mix phoenix.start
was renamed tomix phoenix.server
- [Endpoint] The
YourApp.Endpoint.start/0
function was removed. You can simply remove it from yourtest/test_helper.ex
file - [Router] Generated named paths now expect a conn arg. For example,
MyApp.Router.Helpers.page_path(conn, :show, "hello")
instead ofMyApp.Router.Helpers.page_path(:show, "hello")
- [Controller]
Phoenix.Controller.Flash
has been removed in favor offetch_flash/2
,get_flash/2
, andput_flash/2
functions onPhoenix.Controller
- [Router]
Phoenix.Router.Socket
has been removed in favor of newPhoenix.Router.socket/2
macro. - [Router] The
channel
macro now requires a topic pattern to be used to match incoming channel messages to a channel handler. SeePhoenix.Router.channel/2
for details. - [Channel] The
event/3
callback has been renamed tohandle_in/3
and the argument order has changed todef handle_in("some:event", msg, socket)
- [Channel] Channel callback return signatures have changed and now require
{:ok, socket} | {:leave, socket| | {:error, socket, reason}
.terminate/2
andhibernate/2
have also been removed.
- [Endpoint] Endpoints should now be explicitly started in your application supervision tree. Just add
-
Enhancements
- [Mix] Update Plug to
0.9.0
. You can now remove the Plug git dep from yourmix.exs
.
- [Mix] Update Plug to
-
Bug fixes
- [Endpoint] Ensure CodeReloader is removed fron Endpoint when disabled
- Bug fixes
- [Phoenix] Include Plug dep in new project generation since it's a github dep until next Plug release.
See these 0.6.x
to 0.7.0
upgrade instructions to bring your existing apps up to speed.
-
Enhancements
- [Endpoint] Introduce the concept of endpoints which removes some of the responsibilities from the router
- [Endpoint] Move configuration from the :phoenix application to the user own OTP app
-
Bug fixes
- [Router] Fix a bug where the error rendering layer was not picking JSON changes
- [CodeReloader] Fix a bug where the code reloader was unable to recompile when the router could not compile
-
Backwards incompatible changes
- [I18n]
Linguist
has been removed as a dependency, and anI18n
module is no longer generated in your project - [View]
ErrorsView
has been renamed toErrorView
, update yourMyApp.ErrorsView
accordingly - [Controller]
html/2
,json/2
,text/2
,redirect/2
andrender/3
no longer halt automatically - [Router] Configuration is no longer stored in the router but in the application endpoint. The before pipeline was also removed and move to the endpoint itself
- [I18n]
- Bug fixes
- [Mix] Fix phoenix dep reference in new project generator
- 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