On 03/03/16 15:36, Rick Westerman wrote:
Still looking for an answer as to the scope of a 'hook before'.  Does it affect all of the routes or just the routes within a 'prefix'.   My understanding is that Dancer2 does away with the globals found in Dancer thus I would expect that a 'hook before' within a 'prefix' would remain within the scope of the 'prefix' and not flow outside of it into the other routes.  But this is not what I find thus I am curious as to if I am doing something wrong or have my concept wrong.


Scope for hooks is the current app whereas 'prefix' is more a way to group route handlers and save some typing. In your example you load myapp::admin into app 'myapp' so the hook is active for all routes in app 'myapp' including get '/'.

If you want per-app hooks then you need two apps:

<code>

package myapp;
use Dancer2;

get '/' => sub {
    return 'main ' . dancer_version;
};

true;

package myapp::admin;
use Dancer2;

hook 'before' => sub {
    if ( dancer_app->environment ne 'rick' ) {
        return halt;
    }
};

get '/' => sub { return 'admin' };

true;


</code>

You also need a new app.psgi to build both apps:

<code>

#!/usr/bin/env perl

use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/../lib";

use myapp;
use myapp::admin;
use Plack::Builder;

builder {
    mount '/'      => myapp->to_app;
    mount '/admin' => myapp::admin->to_app;
};


</code>

Notice that myapp::admin no longer uses 'prefix' since all of its routes are relative to the mount point of the app.

R.
PeteM

Thanks,
-- Rick

----  Original message ----

Hello.  New Dancer2 user here.  I am having problems with the scope of a 'hook before' while using 'prefix'.  I am not sure if I am doing something dumb or if this is simply not possible or something else is going on.

Using the prefix example from the Cookbook I have two modules

package myapp;
use Dancer2;
use myapp::admin;

prefix undef;
get '/' => sub { return 'main ' . dancer_version };
1;


And

package myapp::admin;
use Dancer2 appname => 'myapp';

prefix '/admin';

hook 'before' => sub {
    if (dancer_app->environment ne 'rick') {
        return halt;
    }
};

get '/' => sub { return 'admin' };
1;


As expected when running with environment 'rick' then the following output is produced:

/        ==> main 0.166001
/admin/  ==> admin

But, unexpectedly to me, using the default 'development' environment has the app just halting as it, I presume, hits the 'hook before'.    I would have expected '/' to return with 'main 0.166001' while '/admin/' to halt.   In other words I would expect that the 'hook before' is kept within the scope of the prefix '/admin' and not bleed over to the undef prefix.

Any ideas on what is happening? 

Thanks,
-- 
Rick Westerman 
westerman@purdue.edu

Bioinformatics specialist at the Genomics Facility.
Phone: (765) 494-0505           FAX: (765) 496-7255
Department of Horticulture and Landscape Architecture
625 Agriculture Mall Drive
West Lafayette, IN 47907-2010
Physically located in room S049, WSLR building


_______________________________________________
dancer-users mailing list
dancer-users@dancer.pm
http://lists.preshweb.co.uk/mailman/listinfo/dancer-users