Front-end routing is honestly my favourite feature in Runway. It lets you setup front-end routes for your Eloquent models - behind the scenes, it works pretty much the exact same way as it does for entries.
Before getting started, ensure you’ve run
php artisan migrate
. Runway comes with arunway_uris
table which will be used to store all of the front-end URIs.
First things first, add a route
key to your resource config, with the URI structure you want to use. Feel free to use Antlers in there for anything dynamic, like a slug or a date.
// config/runway.php'route' => '/products/{{ slug }}',
// config/runway.php'route' => '/products/{{ slug }}',
Next, add the RunwayRoutes
trait to your Eloquent model.
// app/Models/Product.phpuse StatamicRadPack\Runway\Routing\Traits\RunwayRoutes;class Product extends Model{use RunwayRoutes;
// app/Models/Product.phpuse StatamicRadPack\Runway\Routing\Traits\RunwayRoutes;class Product extends Model{use RunwayRoutes;
If you have any existing models, make sure you run php please runway:rebuild-uris
to build the "URIs cache" Runway uses to map models to URIs.
Runway will assume you want to use the default
template and the layout
layout for resources.
However, most of the time, you’ll want to change this. To change it, just specify what you want to change them to.
// config/runway.php'template' => 'products.index','layout' => 'layouts.shop',
// config/runway.php'template' => 'products.index','layout' => 'layouts.shop',
Instead your show/detail view of your model, you’ll have access to a bunch of variables:
created_at
, updated_at
.If you're taking advantage of Statamic's Static Caching functionality, Runway will automatically invalidate the URI of your models on save.
You may also configure additional URIs to be invalidated on save.
// config/statamic/static_caching.php'invalidation' => ['class' => null,'rules' => ['runway' => ['product' => ['urls' => ['/products','/products/*',],],],],],
// config/statamic/static_caching.php'invalidation' => ['class' => null,'rules' => ['runway' => ['product' => ['urls' => ['/products','/products/*',],],],],],
Since Runway allows you to define your routes using Antlers, much like collections, Runway needs to index all the possible URIs so it can efficiently find the related Eloquent model.
Runway uses the runway_uris
table to do this. Unless disabled, your application will have a runway_uris
table, which is responsible for mapping URIs to Eloquent models.
Anytime you create, update or delete an Eloquent model, Runway will update its mappings in the runway_uris
table.
When configuring front-end routing in an application with existing models, you should run the php please runway:rebuild-uris
command to build the Runway's "URI Cache".
If you wish to limit the models being "cached" by the runway:rebuild-uris
command, you may add the runwayRoutes
query scope to your model:
class Product extends Model{public function scopeRunwayRoutes($query){return $query->where('is_public', true);}}
class Product extends Model{public function scopeRunwayRoutes($query){return $query->where('is_public', true);}}
By default, Runway will use the runway_uris
table to store the "URI Cache". If you wish to change the name of the table, you may do so in the runway.php
configuration file:
/*|--------------------------------------------------------------------------| Runway URIs Table|--------------------------------------------------------------------------|| When using Runway's front-end routing functionality, Runway will store model| URIs in a table to enable easy "URI -> model" lookups. If needed, you can| customize the table name here.|*/'uris_table' => 'runway_uris',
/*|--------------------------------------------------------------------------| Runway URIs Table|--------------------------------------------------------------------------|| When using Runway's front-end routing functionality, Runway will store model| URIs in a table to enable easy "URI -> model" lookups. If needed, you can| customize the table name here.|*/'uris_table' => 'runway_uris',