| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
|
|
2
|
|
|
|
|
|
|
use Moose::Role; |
|
3
|
1
|
|
|
1
|
|
3179
|
use Scalar::Util; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
7
|
|
|
4
|
1
|
|
|
1
|
|
5081
|
|
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
228
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
4
|
|
|
4
|
1
|
3424
|
my ($self, $obj) = @_; |
|
7
|
1
|
|
|
1
|
1
|
788
|
return 0 unless Scalar::Util::blessed($obj); |
|
8
|
2
|
|
|
2
|
1
|
64496
|
return $obj->isa('Catalyst::Exception::StructuredParameter') ? 1:0; |
|
9
|
|
|
|
|
|
|
} |
|
10
|
|
|
|
|
|
|
|
|
11
|
0
|
|
|
0
|
1
|
|
around request_class_traits => sub { |
|
12
|
0
|
0
|
|
|
|
|
my ($orig, $self, @args) = @_; |
|
13
|
0
|
0
|
|
|
|
|
my $traits = $self->$orig(@args); |
|
14
|
|
|
|
|
|
|
return [ @{$traits||[]}, 'Catalyst::TraitFor::Request::StructuredParameters' ]; |
|
15
|
|
|
|
|
|
|
}; |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
1; |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 NAME |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
Catalyst::Plugin::StructuredParameters - Plug to add the structured parameter request trait plus proxy methods |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
package MyApp; |
|
26
|
|
|
|
|
|
|
use Catalyst 'StructuredParameters'; |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
MyApp->setup; |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
package MyApp::Controller::Root; |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
sub body :Local { |
|
33
|
|
|
|
|
|
|
my ($self, $c) = @_; |
|
34
|
|
|
|
|
|
|
my %clean = $c->structured_body |
|
35
|
|
|
|
|
|
|
->permitted(['person'], +{'email' => []}) |
|
36
|
|
|
|
|
|
|
->namespace(['person']) |
|
37
|
|
|
|
|
|
|
->permitted( |
|
38
|
|
|
|
|
|
|
'name', |
|
39
|
|
|
|
|
|
|
'age', |
|
40
|
|
|
|
|
|
|
'address' => ['street' => ['number', 'zip'], |
|
41
|
|
|
|
|
|
|
+{'credit_cards' => [ |
|
42
|
|
|
|
|
|
|
'number', |
|
43
|
|
|
|
|
|
|
'exp' => [qw/year month day/], |
|
44
|
|
|
|
|
|
|
]}, |
|
45
|
|
|
|
|
|
|
)->to_hash; |
|
46
|
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
## Do something with the sanitized body parameters |
|
48
|
|
|
|
|
|
|
} |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
## Don't forget to add code to handle any exceptions |
|
51
|
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub end :Action { |
|
53
|
|
|
|
|
|
|
my ($self, $c) = @_; |
|
54
|
|
|
|
|
|
|
if(my $error = $c->last_error) { |
|
55
|
|
|
|
|
|
|
$c->clear_errors; ## Clear the error stack unless you want the default Catalyst error |
|
56
|
|
|
|
|
|
|
if($c->isa_strong_parameter_exception($error)) { |
|
57
|
|
|
|
|
|
|
## Something here like return a Bad Request 4xx view or similar. |
|
58
|
|
|
|
|
|
|
} |
|
59
|
|
|
|
|
|
|
} |
|
60
|
|
|
|
|
|
|
} |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
## Alternatively handle with L<CatalystX::Errors> (don't forget to add the plugin to your |
|
63
|
|
|
|
|
|
|
## application class.) |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
sub end :Action Does(RenderErrors) { } |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
You should review L<Catalyst::TraitFor::Request::StructuredParameters> for a more detailed SYNOPSIS and |
|
68
|
|
|
|
|
|
|
explanation of how all this works. |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
This plugin will add in the L<Catalyst::TraitFor::Request::StructuredParameters> request class trait |
|
73
|
|
|
|
|
|
|
and proxy some of its methods to the context. You might find this a bit less typing. |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
All the main documentation is in L<Catalyst::TraitFor::Request::StructuredParameters>. |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
NOTE: This plugin only works with For L<Catalyst> v5.90090 or greater. If you must use an older |
|
78
|
|
|
|
|
|
|
version of L<Catalyst> you'll need to use the workaround described in the SYNOPSIS of |
|
79
|
|
|
|
|
|
|
L<Catalyst::TraitFor::Request::StructuredParameters>. |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=head1 METHODS |
|
82
|
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
This role defines the following methods: |
|
84
|
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
=head2 structured_body |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
=head2 structured_data |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
=head2 structured_query |
|
90
|
|
|
|
|
|
|
|
|
91
|
|
|
|
|
|
|
These just proxy to the same methods under the L<Catalyst::Request> object. |
|
92
|
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
=head2 isa_structured_parameter_exception |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
This is just a convenience method that returns true if a possible exception is both a blessed |
|
96
|
|
|
|
|
|
|
object and ISA L<Catalyst::Exception::StructuredParameter>. Since you need to add checking for |
|
97
|
|
|
|
|
|
|
this everytime I added this method to save a bit of trouble. |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=head1 AUTHOR |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
See L<Catalyst::TraitFor::Request::StructuredParameters> |
|
102
|
|
|
|
|
|
|
|
|
103
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
L<Catalyst>, L<Catalyst::TraitFor::Request::StructuredParameters> |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
See L<Catalyst::TraitFor::Request::StructuredParameters> |
|
110
|
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
=cut |