What's New With 6.6.0
February 02, 2022
We have created a shortcut approach to creating RESTFul API resources in your ColdBox Routers via the new method
apiResources()
. This method will create all the routes for your API service with no HTML views.apiResources( "users" );
apiResources( "photos" );
Verb | Route | Event | Purpose |
---|---|---|---|
GET | /photos | photos.index | Get all photos |
POST | /photos | photos.create | Create a photo |
GET | /photos/:id | photos.show | Show a photo by id |
PUT/PATCH | /photos/:id | photos.update | Update a photo by id |
DELETE | /photos/:id | photos.delete | Delete a photo by id |
We have made several enhancements with modules:
- Performance optimizations when registering and activating modules
- Modules now track their own registration and activation load times (Which are now visible in cbdebugger)
- Better logging of modules when they activate and register
We have been working on a new directory structure for ColdBox applications where the web root is not just dumped with everything on it. We have made several internal tickets to allow for this to work and we have a very early alpha available in github:
There are so many tickets that helped resolved issues with the ColdBox schedulers and scheduled tasks. We have also solidifying our Adobe scope issues and brought many new helpers for developers when building task objects.
If you are building multi-tenant applications with ColdBox and are leveraging domain and subdomain routing, then you can easily use the
domain
argument in all of our request(), execute()
and HTTP Verb methods to simulate the domain in play for THAT specific spec execution.describe( "subdomain routing", function(){
beforeEach( function(){
setup();
} );
it( "can match on a specific domain", function(){
var event = execute( route: "/", domain: "subdomain-routing.dev" );
var rc = event.getCollection();
expect( rc ).toHaveKey( "event" );
expect( rc.event ).toBe( "subdomain.index" );
} );
it( "skips if the domain is not matched", function(){
var event = execute( route: "/", domain: "not-the-correct-domain.dev" );
var rc = event.getCollection();
expect( rc ).toHaveKey( "event" );
expect( rc.event ).toBe( "main.index" );
} );
it( "can match on a domain with wildcards", function(){
var event = execute( route: "/", domain: "luis.forgebox.dev" );
var rc = event.getCollection();
expect( rc ).toHaveKey( "event" );
expect( rc.event ).toBe( "subdomain.show" );
} );
it( "provides any matched values in the domain in the rc", function(){
var event = execute( route: "/", domain: "luis.forgebox.dev" );
var rc = event.getCollection();
expect( rc ).toHaveKey( "username" );
expect( rc.username ).toBe( "luis" );
} );
} );
ColdBox has always had its internal way of figuring out what identifier to use for each user's request based on the way ColdFusion works. However, now you can influence and provide your own approach instead of relying on the core CFML approach. You will do this by adding a
coldbox.identifierProvider
closure/lambda into your config/Coldbox.cfc
.coldbox : {
identifierProvider : function(){
if( isNull( cookie.mytracker ) ){
cookie.myTracker = createUUID();
}
return cookie.myTracker;
}
}

WireBox Injector Hierarchy
Welcome to the world of hierarchical dependency injection. We had the ability before to add a parent injector to WireBox, but now you can not only add a parent, but also many children to the hierarchy.
Every injector has the capability to store an ordered collection (
ordered struct
) of child injectors via the childInjectors
property. Child injectors are used internally in many instances to provide a hierarchical approach to DI where instances can be searched for locally, in the parent and in the children. Here are some of the new methods to assist with child injectors:hasChildInjector( name )
- Verify if a child injector has been registeredregisterChildInjector( name, child )
- Register a child injector by nameremoveChildInjector( name )
- Remove a child injector by namegetChildInjector( name )
- Get a child injector by namegetChildInjectors()
- Get all the child injectors registeredgetChildInjectorNames()
- Get an array of all the registered child injectors
getInstance()
- The
getInstance()
method now has aninjector
argument so you can EXPLICITLY request an instance from a child injector by namegetInstance( name : "service", injector : "childInjector" )
- Apart from the explicit lookup it can also do implicit hierarchical lookups using the following order:
- Locally
- Parent
- All Children (in order of registration)
containsInstance( name )
- This method now also searches in the child collection for the specificname
instance. The lookup searches in the following order:- 1.Locally
- 2.Parent
- 3.Children
shutdown()
- The shutdown method has been enhanced to issue shutdown method calls to all child injectors registered.
The
getInstance()
has been modified to have an injector
argument that you can use to specifically ask for an instance from that child injector. If the child injector has not been registered you will get a InvalidChildInjector
Exception.getInstance( name: "CategoryService", injector : "ChildInjector" )
The following is the DSL you can use to explicitly target a child injector for a dependency. You will prefix it with
wirebox:child:{name}
and the name of the injector:// Use the property name as the instance name
property name="categoryService" inject="wirebox:child:childInjector"
// Use a specific instance name
property name="categoryService" inject="wirebox:child:childInjector:CategoryService"
// Use any DSL
property name="categoryService" inject="wirebox:child:childInjector:{DSL}"
The
coldbox.system.ioc.IInjector
interface's getInstance()
method has been modified to include support for child injector retrievals:/**
* Locates, Creates, Injects and Configures an object model instance
*
* @name The mapping name or CFC instance path to try to build up
* @initArguments The constructor structure of arguments to passthrough when initializing the instance
* @dsl The dsl string to use to retrieve the instance model object, mutually exclusive with 'name'
* @targetObject The object requesting the dependency, usually only used by DSL lookups
* @injector The child injector name to use when retrieving the instance
*/
function getInstance(
name,
struct initArguments,
dsl,
targetObject = "",
injector
);
ColdBox HMVC
CacheBox
WireBox
Bug
Improvement
- COLDBOX-1061 Change default template cache from concurrentSoftReference to ConcurrentReference to avoid auto cleanups
- COLDBOX-1050 New router method:
apiResources()
to allow you to define resources without the new and edit actions - COLDBOX-1049 Update elixirPath to allow for many permutations of filenames and arguments to avoid cache collisions
- COLDBOX-1037 Move
onRequestCapture
after default event capture to allow for consistency on the capture - COLDBOX-676 Improve routing DSL to allow for different HTTP verbs on the the same route to point to different events or actions
New Feature
- COLDBOX-1080 experimental web mapping support to allow for modern app templates with assets outside of the webroot
- COLDBOX-1064 Schedulers can now get the current thread and thread name:
getCurrentThread(), getThreadName()
as private helpers - COLDBOX-1033 New controller method:
getUserSessionIdentifier
() which gives you the unique request tracking identifier according to our algorithms - COLDBOX-1032 New coldbox setting
identifierProvider
which can be a closure/udf/lambda that provides a unique tracking identifier for user requests
Bug
- CACHEBOX-76 Fixed method return value + SQL compatibility on jdbc metadata indexer thanks to @homestar9
Improvement
Bug
- WIREBOX-124 Killing
IInjector
interface usages due to many issues across cfml engines, leaving them for docs only
Improvement
- WIREBOX-120 DSLs process method now receives the caller
targetID
alongside thetargetObject
and thetarget
definition
New Feature
- WIREBOX-122 New wirebox DSL to inject the target's metadata that's cached in the target's binder:
wirebox:objectMetadata
- WIREBOX-121 New WireBoxDSL:
wirebox:targetID
to give you back the target ID used when injecting the object - WIREBOX-117 HDI - Ability for injectors to have a collection of child injectors to delegate lookups to, basically Hierarchical DI
Task
Last modified 9mo ago