FW/1 - The Invisible Framework

Framework One and friends...

FW/1 3.1 Released!

| Comments

The “gold” release of FW/1 3.1 (3.1.0) is now available for production use! You can download FW/1 3.1.0 from GitHub.

FW 3.1 is a maintenance release of the 3.x series, containing a number of bug fixes and enhancements. The main new feature of release 3.1 is the addition of AOP/1, thanks to the tireless work of Daniel Budde.


AOP/1 brings Aspect-Oriented Programming to FW/1 applications by extending the capabilities of DI/1 with “interceptors” that can be automatically woven into your beans to allow you to call additional methods before, after, or instead of (“around”) the native methods on your beans. Please read the all new AOP/1 documentation provided by Daniel Budde for more details on how to use this powerful new feature.


  • renderData() now supports both html, rawjson and jsonp data types.
  • redirect() now supports a header argument to allow for custom redirect-like behavior such as might be needed in a Single-Page-Application or heavy ajax usage.
  • Routes:
    • Regex support for ^ to anchor the match to the start of the request string.
    • Placeholders can now have matches restricted by regex patterns (e.g., to match numeric-only portions of the request string).
    • Regex matching can now be made case-sensitive via the new routesCaseSensitive option.
  • Per-subsystem configuration now supports diEngine, diComponent, diLocations, and diConfig.
  • Per-environment configuration is now merged recursively, including appropriate parts of diConfig.

Bug Fixes

  • Route matching for placeholders was too eager. Placeholder names are now restricted to alphanumeric plus _ and - characters only. This is potentially a breaking change if you have used unusual characters in placeholder variable names that are legal in CFML identifiers!
  • If the first request to an application was also a reload request, initialization was sometimes attempted twice if an exception was thrown during initialization.
  • Framework reloads were not always thread safe and could produce strange behavior if an application was reloaded under load.
  • DI/1’s isConstant() method could fail for manually created and managed beans.
  • Application.cfc was not always correctly autowired as a Controller.
  • If content had been produced in a request that used renderData(), that content could corrupt the result. A content reset is now performed in such cases.
  • DI/1 no longer attempts to instantiate interfaces that it discovers in the model.

Platform Support

  • ColdFusion 9.0.1 and Railo 4.0 are no longer officially supported by FW/1. FW/1 3.1 applications will probably still run on them but there are some bugs in both engine versions that can impact some of the new functionality in this release. FW/1 3.1 officially supports ColdFusion 9.0.2 or later, Railo 4.1 or later, and Lucee or later.

Code of Conduct

As part of my commitment to diversity in IT, Framework One now has a Code of Conduct that encompasses all aspects of interaction with the project: on GitHub, on the mailing list, and in presentations given by community members to promote the framework. This brings Framework in line with a number of progressive open source projects that have adopted a Code of Conduct as a way to make the open source software community more welcoming and more inclusive.


The star contributor for this release is Daniel Budde for rewriting AOP/1 (twice!) so it is ready for inclusion with FW/1! Thank you!

Other contributors, in alphabetical order of GitHub name:

  • atuttle - Adam Tuttle
  • cybersonic - Mark Drew
  • GiancarloGomez - Giancarlo Gomez
  • guillaume-boivin - Guillaume Boivin
  • jcberquist - John Berquist
  • jochemd - Jochem van Dieten
  • Ronner
  • ryanguill - Ryan Guill

And, yeah, I did a bit too, but FW/1 wouldn’t be where it is today without contributions from the open source CFML community - thank you everyone!

Additional Information

For a complete list of changes since 3.0:

Release 3.5 Alpha 1 will follow shortly, with a focus on language integration, bringing automatic support for Clojure code in the Model and Controllers, as well as first class support for the Lucee Language in the Model, the Views, and the Controllers.