On Oct 23, 2015, at 2:38 PM, Sawyer X <[email protected]> wrote:
> 
> email back to the list (or to me) your suggestions.

The generated dancer -a code and the examples mostly show simple cases which 
are fine starting points, but they don’t tell you how to scale the app if it 
starts getting large.  General Perl-in-the-large principles help, but there are 
aspects of how that interacts with Dancer that aren’t obvious.

If you start with the generated code and extend it in the most straightforward 
manner, you end up with all your code in lib/App.pm, with a flat route 
definition set.  This is bad, and it is the problem I want to address.

When you write a program with thousands of lines and a deep URL hierarchy, you 
start to want to break it up, but the current docs don’t really tell you how to 
do that sensibly.  Dancer is not a policy-free framework, which means that it 
not only doesn’t force you to do it the right way, it doesn’t even give hints 
about what the right way might be.

It may be too much for a single article, but I would like to cover topics such 
as:

1. Nested route definitions:

        # User management pages
        prefix ‘/user’ => sub {
            get  ‘/login’ => …
            post ‘/logout’ => …
        };
         
        # Major user-visible web app feature for logged-in users
        prefix ‘/feature’ => sub {
            prefix ‘/record’ => sub {
                # Define RESTful CRUD API for /feature/record objects
                del  ‘/:id’ => …
                get  ‘/:id’ => …
                post ‘/’ => …
                put  ‘/’ => …
            };
        };

        # An API for use by the site’s JS code and possibly third parties
        prefix ‘/api’ => sub {
            prefix ‘/something’ => …
        };

Not only does defining your URL hierarchy this way instead of in the flat way 
that is most obvious avoid a lot of redundancy (‘/feature/record/:id’), 
defining things this way often makes patterns jump out at you, allowing an 
improvement in the way you design your URL scheme.

2. Moving almost all code out of the generated lib/App.pm into other *.pm files 
in that directory, possibly nested into a directory hierarchy. 
(lib/App/Module.pm, etc.)  Naming schemes, how to call between modules, etc.

3. Given 1 and 2, how to shard the route definitions among lib/App/*.pm, so 
that each Perl module includes only the routes that it defines code to handle, 
rather than dumping the whole route definition into the main lib/App.pm file 
generated by dancer -a.

4. Given 1 and 2, how to name the content of the views directory.  (e.g. 
views/app/feature.tx or views/app/feature/page-fragment.tx)  Policy-heavy 
frameworks use the calling URL to work out where the template files are, but 
Dancer doesn’t enforce that.  Working out a good naming scheme is essential for 
maintainability.

5. Your ideas here!
_______________________________________________
dancer-users mailing list
[email protected]
http://lists.preshweb.co.uk/mailman/listinfo/dancer-users

Reply via email to