-
Notifications
You must be signed in to change notification settings - Fork 276
make explanations a bit more accessible and clear and improve grammar… #1424
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
sdondley
wants to merge
6
commits into
PerlDancer:main
Choose a base branch
from
sdondley:pr/manual
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
a079971
make explanations a bit more accessible and clear and improve grammar…
sdondley 326d6b2
fix typo
sdondley 59fb06f
more improvements to the grammar, clarity and structure of the manual…
sdondley f14a201
fix minor typo
sdondley a2ef1fe
Update Manual.pod
sdondley 820290a
fix list items and file links
sdondley File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,13 +20,16 @@ way, easily. | |
|
||
=head1 INSTALL | ||
|
||
Installation of Dancer2 is simple: | ||
Since Dancer2 is available on the Comprehensive Perl Archive Network (CPAN), | ||
the authoritative repository for Perl modules, Dancer 2 can be installed with | ||
one simple command. If you are familiar with Perl and use it, you probably | ||
already have L<cpan> configured on your machine and can install Dancer 2 with: | ||
|
||
perl -MCPAN -e 'install Dancer2' | ||
|
||
Thanks to the magic of cpanminus, if you do not have CPAN.pm configured, or | ||
just want a quickfire way to get running, the following should work, at | ||
least on Unix-like systems: | ||
But, if you are newer to Perl, you may not have L<cpan> configured. No worries. | ||
Thanks to the magic of the L<cpanminus> module, you can get up and running | ||
quickly on Unix-like systems with the following: | ||
|
||
wget -O - http://cpanmin.us | sudo perl - Dancer2 | ||
|
||
|
@@ -35,9 +38,13 @@ Dancer2 and prereqs into C<~/perl5>.) | |
|
||
=head1 BOOTSTRAPPING A NEW APP | ||
|
||
Create a web application using the dancer script: | ||
The Dancer 2 distribution includes a script called L<dancer2> which you can use | ||
to automatically generate a new web application from the command line, like so: | ||
|
||
$ dancer2 -a MyApp && cd MyApp | ||
|
||
You will then see the following output: | ||
|
||
+ MyApp | ||
+ MyApp/config.yml | ||
+ MyApp/Makefile.PL | ||
|
@@ -73,12 +80,36 @@ Create a web application using the dancer script: | |
+ MyApp/views/layouts | ||
+ MyApp/views/layouts/main.tt | ||
|
||
It creates a directory named after the name of the app, along with a | ||
configuration file, a views directory (where your templates and layouts | ||
will live), an environments directory (where environment-specific | ||
settings live), a module containing the actual guts of your application, and | ||
a script to start it. A default skeleton is used to bootstrap the new | ||
application, but you can use the C<-s> option to provide another skeleton. | ||
The L<dancer2> script creates the following: | ||
|
||
=over | ||
|
||
=item * | ||
a directory named after the name of the app, L<MyApp> in this case | ||
|
||
=item a configuration file, F<MyApp/config.yml>. | ||
|
||
=item a F<views> directory (where your templates and layouts will live), | ||
|
||
=item F<environments> directory (where environment-specific settings live), | ||
|
||
=item F<public> directory (where static assets like css file and javascrpt files can | ||
go) | ||
|
||
=item F<t> directory (where your tests can go) | ||
|
||
=item a variety of files for helping you build your application into a | ||
module for release | ||
|
||
=item a module containing the actual guts of your application in L<lib> | ||
|
||
=item a script to start your appliaction in L<bin>. | ||
|
||
=back | ||
|
||
A default skeleton is used to generate the new application. You can use | ||
the C<-s> option to provide another skeleton. | ||
|
||
For example: | ||
|
||
$ dancer2 -a MyApp -s ~/mydancerskel | ||
|
@@ -95,23 +126,45 @@ C<plackup> tool (provided by L<Plack>) for launching the application: | |
|
||
plackup -p 5000 bin/app.psgi | ||
|
||
View the web application at: | ||
You can then access the web application with your favorite browser at: | ||
|
||
http://localhost:5000 | ||
|
||
=head1 USAGE | ||
|
||
When Dancer2 is imported to a script, that script becomes a webapp, and at | ||
this point, all the script has to do is declare a list of B<routes>. A | ||
route handler is composed by an HTTP method, a path pattern and a code | ||
block. C<strict>, C<warnings> and C<utf8> pragmas are also imported with | ||
Dancer2. | ||
When Dancer2 is imported to a script with L<use Dancer2;>, that script | ||
becomes a Dancer 2 web app. First, the C<strict>, C<warnings> and C<utf8> | ||
pragmas are injected into the script by Dancer 2. The import function of the | ||
script is also modified so that Dancer 2's keywords can be imported and used by | ||
the script. | ||
|
||
Now, all the script needs to do is declare its B<route handlers>. A route | ||
handler is a list of three elements: a Dancer 2 keyword for the HTTP method, | ||
a path pattern, and a block of code. For example, here is a simple route handler: | ||
|
||
get '/' => sub { return 'Hello World!'; }; | ||
|
||
Here, the HTTP method is C<get>, the pattern to match is C</>, which is the root | ||
directory of the website. When a browser visits C</> with a C<GET> request, | ||
the string 'Hello World!' generated by our block of code will be sent back in the | ||
response to the browser. | ||
|
||
The code block given to the route handler has to return a string which will | ||
be used as the content to render to the client. | ||
be used as the content to render for the client. | ||
|
||
Each route handler you create inside of your script is stored in your app so | ||
your app can handle the requests as they come in. | ||
|
||
You can make your route handler dynamic with parameters. As a simple example: | ||
|
||
Routes are defined for a given HTTP method. For each method supported, a | ||
keyword is exported by the module. | ||
get '/hello/:name' => sub { | ||
return "Hi there " . route_parameters->get('name'); | ||
}; | ||
|
||
This will create a page that greets the visitor with the string of text that | ||
follows C</hello/> in the path. More typically, parameters are use to | ||
query a database or determine which page to show. See the | ||
L<Dancer2::Manual/Route Patterns> for more details on route patterns. | ||
|
||
=head2 HTTP Methods | ||
|
||
|
@@ -122,27 +175,30 @@ route handlers. | |
|
||
=item * B<GET> The GET method retrieves information, and is the most common | ||
|
||
GET requests should be used for typical "fetch" requests - retrieving | ||
information. They should not be used for requests which change data on the | ||
server or have other effects. | ||
GET requests are typically used as "fetch" requests to retreive information. | ||
They should not be used for requests which change data on the server or | ||
have other side effects. | ||
|
||
When defining a route handler for the GET method, Dancer2 automatically | ||
defines a route handler for the HEAD method (in order to honour HEAD | ||
requests for each of your GET route handlers). | ||
When defining GET route hander, Dancer2 also automatically | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handler is misspelled here. |
||
defines a route handler for the HEAD method in order to honour HEAD | ||
requests for each of your GET route handlers. | ||
|
||
To define a GET action, use the L<get|Dancer2::Manual/get> keyword. | ||
|
||
=item * B<POST> The POST method is used to create a resource on the server. | ||
|
||
POST requests are typically used to submit data to the web application. The | ||
most common example is by sending data from an HTML form. | ||
|
||
To define a POST action, use the L<post|Dancer2::Manual/post> keyword. | ||
|
||
=item * B<PUT> The PUT method is used to replace an existing resource. | ||
|
||
To define a PUT action, use the L<put|Dancer2::Manual/put> keyword. | ||
|
||
a PUT request should replace the existing resource with that specified - for | ||
instance - if you wanted to just update an email address for a user, you'd | ||
have to specify all attributes of the user again; to make a partial update, | ||
A PUT request should replace the existing resource with that specified. For | ||
instance, if you wanted to just update an email address for a user, you'd | ||
have to specify all attributes of the user again. To make a partial update, | ||
a PATCH request is used. | ||
|
||
=item * B<PATCH> The PATCH method updates some attributes of an existing resource. | ||
|
@@ -172,51 +228,38 @@ The following will match GET or POST requests to C</myaction>: | |
# code | ||
}; | ||
|
||
For convenience, any route which matches GET requests will also match HEAD | ||
requests. | ||
|
||
=head2 Route Handlers | ||
As mentioned previously, any route which matches GET requests will also | ||
match HEAD requests. This is just convenience for web app developers. | ||
|
||
The route action is the code reference declared. It can access parameters | ||
through the specific C<route_parameters>, C<query_parameters>, and | ||
C<body_parameters> keywords, which return a L<Hash::MultiValue> object. | ||
This hashref is a merge of the route pattern matches and the request params. | ||
=head2 Route Patterns | ||
|
||
You can have more details about how params are built and how to access them | ||
in the L<Dancer2::Core::Request> documentation. | ||
After the declaration of the HTTP method, your route handler must supply | ||
a pattern that will be used to match against the path of the incoming request. | ||
|
||
=head3 Declaring Routes | ||
The simplest route patterns provide an exact match to the requested path: | ||
|
||
To control what happens when a web request is received by your webapp, | ||
you'll need to declare C<routes>. A route declaration indicates which HTTP | ||
method(s) it is valid for, the path it matches (e.g. C</foo/bar>), and a | ||
coderef to execute, which returns the response. | ||
|
||
get '/hello/:name' => sub { | ||
return "Hi there " . route_parameters->get('name'); | ||
}; | ||
|
||
The above route specifies that, for GET requests to C</hello/...>, the code | ||
block provided should be executed. | ||
get '/foo/bar' => sub { | ||
return 'You are on page /foo/bar'; | ||
} | ||
|
||
=head3 Retrieving request parameters | ||
This route will be activated when a client requests the C</foo/bar>) path. | ||
|
||
The L<query_parameters|Dancer2::Manual/query_parameters>, | ||
L<route_parameters|Dancer2::Manual/route_parameters>, and | ||
L<body_parameters|Dancer2::Manual/body_parameters> keywords provide | ||
a L<Hash::MultiValue> result from the three different parameters. | ||
cromedome marked this conversation as resolved.
Show resolved
Hide resolved
|
||
Your route patterns can be much more sophisticated and be used to create | ||
parameters to pass data into your action. More advanced types of route | ||
patterns are described below. | ||
|
||
=head3 Named matching | ||
|
||
A route pattern can contain one or more tokens (a word prefixed with ':'). | ||
Each token found in a route pattern is used as a named-pattern match. Any | ||
match will be set in the route parameters. | ||
match will be found in the C<route_parameters> variable and can be retrieved | ||
in the block of code. | ||
|
||
get '/hello/:name' => sub { | ||
"Hey " . route_parameters->get('name') . ", welcome here!"; | ||
}; | ||
|
||
Tokens can be optional, for example: | ||
Tokens can be optional by tacking a question mark to the end of it, for example: | ||
sdondley marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
get '/hello/:name?' => sub { | ||
my $name = route_parameters->get('name') //= 'Whoever you are'; | ||
|
@@ -295,6 +338,29 @@ user_agent, content_length and path_info): | |
'all browsers except songbird' | ||
} | ||
|
||
=head2 Route Action | ||
|
||
The route action is the code reference in the route handler which follows the | ||
HTTP method and the route pattern. As we saw in the previous section, your | ||
action can access parameters through the specific C<route_parameters>, | ||
C<query_parameters>, and C<body_parameters> keywords, which return a | ||
L<Hash::MultiValue> object. This hashref is a merge of the route pattern | ||
matches and the request params. | ||
|
||
=head3 Retrieving request parameters | ||
|
||
As we saw in the previous section, your action can access parameters through | ||
the specific C<route_parameters>, C<query_parameters>, and C<body_parameters> | ||
keywords, which together return a L<Hash::MultiValue> object. This hashref is | ||
a combination of the route pattern matches and the request params. | ||
|
||
For more information on these types of parameters, see the L<query_parameters|Dancer2::Manual/query_parameters>, | ||
L<route_parameters|Dancer2::Manual/route_parameters>, and | ||
L<body_parameters|Dancer2::Manual/body_parameters> documentation. | ||
|
||
More details about how params are built and how to access them are available | ||
in the L<Dancer2::Core::Request> documentation. | ||
|
||
=head2 Prefix | ||
|
||
A prefix can be defined for each route handler, like this: | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.