2016-12-01 3 views
1

나는 사용자 액세스 수준을 확인하는 몇 가지 under 경로를 Mojolicious::Plugin::RESTRoutes 또한Mojolicous에서`find`를 사용하여 전체 경로를 가져 오는 방법은 무엇입니까?

my $r = $self->routes; 
$r->add_shortcut(resource => \&resource); 

같은 REST 경로를 등록 바로 가기 한 :

my $guest = $r->under->to("auth#check_level"); 
my $user = $r->under->to("auth#check_level", { required_level => 100 }); 
my $admin = $r->under->to("auth#check_level", { required_level => 200 }); 

나는 자원을 만들 때 :

my $uResource = $user->resource('users'); 

I을 다음 경로 찾기 :

당신이 경로의 마지막 부분을 볼 수 있듯이 user에서 이동

$ myapp.pl routes 
/    *      # under for guest 
    +/create  GET  "create_user" 
/    *      # under for user 
    +/users  *  users 
    +/   POST "store_user" 
    +/:id  GET  "show_user" 
    +/:id/edit GET  "edit_user" 
    +/:id  PUT  "update_user" 
/    *      # under for admin 
    +/   GET  "list_users"  
    +/:id   DELETE "delete_user" 

:

$guest->add_child($user->find('create_user')); 
$admin->add_child($user->find('list_users' )); 
$admin->add_child($user->find('delete_user')); 

이 지금은이 경로를 얻을 :

$ myapp.pl routes 
/    *     # under for guest 
/    *     # under for user 
    +/users  *  users 
    +/   GET  "list_users" 
    +/create GET  "create_user" 
    +/   POST "store_user" 
    +/:id  GET  "show_user" 
    +/:id/edit GET  "edit_user" 
    +/:id  PUT  "update_user" 
    +/:id  DELETE "delete_user" 
/    *      # under for admin 

아니 내가 액세스를 제한하기 위해 그 중 일부를 조정하려면 guest/admin 앞에 추가 할 수있는 방법이 있나요

$guest->any("/users")->add_child($user->find('create_user')); 
$admin->any("/users")->add_child($user->find('list_users' )); 
$admin->any("/users")->add_child($user->find('delete_user')); 

:

$ myapp.pl routes 
/    *      # under for guest 
    +/users  *  users 
    +/create GET  "create_user" 
/    *      # under for user 
    +/users  *  users 
    +/   POST "store_user" 
    +/:id  GET  "show_user" 
    +/:id/edit GET  "edit_user" 
    +/:id  PUT  "update_user" 
/    *      # under for admin 
    +/users  *  users 
    +/   GET  "list_users"  
    +/:id  DELETE "delete_user" 

이 같이 정확 : 때문에 I의
내가 경로 +/users을 일치 기대 $user 대신 $uResource
의 여기에 사용 /users?

답변

0

그냥 다른 바로 가기를 만듭니다. 출처 :

my $r = $self->routes; 
$r->add_shortcut(resource => \&resource ); 
$r->add_shortcut(privileged => \&privileged); 


# Each time someone make query we setup cookie and check his access level 
my $guest = $r->under->to("auth#check_level"); 
my $user = $r->under->to("auth#check_level", { required_level => 100 }); 
my $admin = $r->under->to("auth#check_level", { required_level => 200 }); 

$user->privileged('users', CS => $guest, LD => $admin); 


sub privileged { 
    my($r, $name, %restriction) = @_; 
    my $singular = Lingua::EN::Inflect::PL($name); 

    # Prefix for resource 
    $r = $r->any("/$name")->to("$singular#"); 

    my %api = (() 
     # Order definition has not matter each part of resource has unique path 
     # type  #method  #path  #action #route name 
     ,L => [ $r, [ "GET" ], "/",   '#index', "list_$name"  ] 
     ,C => [ $r, [ "GET" ], '/create', '#create', "create_$singular" ] 
     ,S => [ $r, [ "POST" ], '/',   '#store', "store_$singular" ] 
     ,R => [ $r, [ "GET" ], '/:id',  '#show', "show_$singular" ] 
     ,E => [ $r, [ "GET" ], '/:id/edit', '#edit', "edit_$singular" ] 
     ,U => [ $r, [ "PUT" ], '/:id',  '#update', "update_$singular" ] 
     ,D => [ $r, [ "DELETE" ], '/:id',  '#delete', "delete_$singular" ] 
    ); 

    # CS => $guest, REU => $user, LD => $admin translated into: 
    # $api{ C => [ $guest ...], S => [ $guest ... ], ..., D => [ $admin ... ] } 
    for my $level (keys %restriction) { 
     # Prefix for resource 
     my $r = $restriction{ $level }->any("/$name")->to("$singular#"); 

     for my $resource (split //, $level) { 
      $api{ $resource }[0] = $r; 
     } 
    } 


    # Create route for all resouces: LCSREUD 
    for my $resource (keys %api) { 
     my($guard, $method, $path, $action, $rname) = @{ $api{ $resource } }; 
     $guard->any($method, $path, $rname)->to($action); 
    } 


    return; 
} 

의견이 있으십니까?