[dancer-users] Dancer2::Handler:: issues
Steven Humphrey
catchdancerusers at 33k.co.uk
Tue Mar 26 13:30:13 GMT 2013
Hello all,
Apologies if this has been raised before.
I reckon there is an issue with the way Dancer2::Handler:: objects get
incorporated into apps.
The current process is:
Dancer2::Core::App object is instantiated and its BUILD method gets
called. This calls init_route_handlers.
init_route_handlers loops through the config route_handlers section and
creates an appropriate route handler for each app.
This means, for example, the Dancer2::Handler::File object that handles
requests to files in the public folder gets added to every app.
The effect of this for a non-existent url request
1) Loop through apps (pm files)
2) Find megasplat route for file handler
3) Call before hooks defined in that app!
4) Call Dancer2::Handler::File route
5) Dancer2::Handler::File doesn’t find file, so it ‘passes’ on to the
next route.
6) Go to next app.
Whilst this is certainly inefficient, my primary concern is that the
before hooks gets called for every single app when you expect before
hooks to only apply to the routes that you defined in the same app/perl
module as the before hook. Having before hooks apply to routes that you
did not define is very confusing.
I’d suggest that the Dancer2 Handlers either get added to their own
private Dancer2::Core::App object or to a single ‘handler app’.
Dancer2::Runner would therefore loop through the (default) handlers and
add them to specific app objects.
I can’t currently see a use case where you’d want the same route
handler to appear in every app, although potentially the route handler
could define the route based off something in the config, which in
theory could be different for each app/pm file.
2-3 questions then arise:
1) How does Dancer2::Runner handle these. A separate app for each
handler?
2) If you do want a before hook to apply, how do you apply one.
3) If for some reason that I can’t see, you do want a handler to create
a route in each app, how do you declare that? (some sort of
app_route_handler config key?)
I am happy to implement these changes and raise a github issue/pull
request if the core developers agree with me.
You can of course avoid before hooks firing by turning off the default
route_handlers with a “route_handler: {}” line in config.yml, but that
is super confusing and causes other issues.
- shumphrey
More information about the dancer-users
mailing list