The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

Name

Forward::Guides::Routes::RestfulResources - Rails like resources for Perl Plack web framework developers

Description

Forward::Routes enables web framework developers to build Rails like resources with a single command. The add_resources command automatically generates a bunch of routes to read, create, update or delete a resource or to display a form to perform a create, update or delete action.

    # Routes root object
    my $routes = Forward::Routes->new;

    # Add a resource
    $routes->add_resources('cities');

The following routes are generated:

    HTTP     Path                 Controller  Action        Route name
    request                       parameter   parameter
    method          

    GET      /cities/new          cities      create_form   cities_create_form
    GET      /cities/:id          cities      show          cities_show
    GET      /cities/:id/edit     cities      update_form   cities_update_form
    GET      /cities/:id/delete   cities      delete_form   cities_delete_form
    GET      /cities              cities      index         cities_index
    POST     /cities              cities      create        cities_create
    PUT      /cities/:id          cities      update        cities_update
    DELETE   /cities/:id          cities      delete        cities_delete

Use of routes:

    Route name            Used to

    cities_create_form    display a form to create a new item
    cities_show           display an individual item
    cities_update_form    display a form to update an existing item
    cities_delete_form    display a form to confirm the deletion of an existing item
    cities_index          list all items
    cities_create         create a new item
    cities_update         update an existing item
    cities_delete         delete an existing item

The internal code to generate a resource makes use of nested routes:

    my $resource = $routes->add_route('cities');

    # get => /cities
    $resource->add_route
      ->via('get')
      ->to("cities#index")
      ->name('cities_index');

    # post => /cities
    $resource->add_route
      ->via('post')
      ->to("cities#create")
      ->name('cities_create');

    # get => /cities/new
    $resource->add_route('/new')
      ->via('get')
      ->to("cities#create_form")
      ->name('cities_create_form');

    # nested route with id placeholder, placeholder can contain everything
    # but dots and slashed (constraint)
    my $nested = $resource->add_route(':id')
      ->constraints('id' => qr/[^.\/]+/);

    # get => /cities/paris
    $nested->add_route
      ->via('get')
      ->to("cities#show")
      ->name('cities_show');

    # put => /cities/paris
    $nested->add_route
      ->via('put')
      ->to("cities#update")
      ->name('cities_update');

    # delete => /cities/paris
    $nested->add_route
      ->via('delete')
      ->to("cities#delete")
      ->name('cities_delete');

    # get => /cities/paris/edit
    $nested->add_route('edit')
      ->via('get')
      ->to("cities#update_form")
      ->name('cities_update_form');

    # get => /cities/paris/delete
    $nested->add_route('delete')
      ->via('get')
      ->to("cities#delete_form")
      ->name('cities_delete_form');