Routing

URLs

Public-facing urls must use kebab-case.

WEB
https://www.interaction-design.org/about/people-behind
https://www.interaction-design.org/my-private-profile

Names

Routes MUST have names, please use route() helper to generate URLs from named routes. Route names MUST use camelCase.

PHP
Route::get('about', [AboutPageController::class, 'index'])->name('about.index');

Blade

Blade
<a href="{{ route('about.index') }}">About</a>

Route names SHOULD include the plural form of the resource name and the action: articles.show, articles.delete.

route()

There are few valid options on how to use route() helper for named routes:

Single parameter

PHP
// route: '/meetups/{meetupId}'
$meetup = \App\Modules\LocalGroup\Models\Meetup::query()->find($meetupId);

route('meetups.show', $meetup); // GOOD (RECOMMENDED) for routes with a single parameter
route('meetups.show', $meetupId); // GOOD for cases when you don’t have Meetup object but have an ID/key
route('meetups.show', [$meetup]); // BAD, please don’t use array syntax for a single param routes or use array keys
route('meetups.show', ['id' => $meetup]); // GOOD (RECOMMENDED)
route('meetups.show', ['id' => $meetupId]); // GOOD
route('meetups.show', ['meetupId' => $meetup->id]); // ERROR: Missing required parameter "id"

2+ required parameters

PHP
// route: '/master-classes/{masterclass}/registrations/{registration}'
$registration = \App\Modules\Masterclass\Models\Registration::query()->first();

route('masterclasses.registrations.show', [$registration->masterclass, $registration]);
route('masterclasses.registrations.show', ['masterclass' => $registration->masterclass, 'registration' => $registration]); // GOOD, RECOMMENDED
route('masterclasses.registrations.show', ['registration' => $registration, 'masterclass' => $registration->masterclass]); // BAD, params mixed up (but still working as expected)
route('masterclasses.registrations.show', [$registration->masterclass, 'registration' => $registration]); // BAD: missing first key (Inconsistency)
route('masterclasses.registrations.show', ['masterclass' => $registration->masterclass, $registration]); // BAD: missing second key (Inconsistency)

Method Chaining

When defining routes, use method chaining instead of array of params:

PHP
// GOOD:
Route::get('about', [AboutPageController::class, 'index'])->name('about.index')->middleware(['cache:1day']);

// BAD:
Route::get('about', ['as' => 'about.index', 'uses' => [AboutPageController::class, 'index']])->middleware(['cache:1day']);

Middleware

Use array syntax for Route::middleware()

PHP
// GOOD
Route::get('about', [AboutPageController::class, 'index'])->middleware(['cache:1day']);
Route::get('about', [AboutPageController::class, 'index'])->middleware(['cache:1day', 'CORS']);

// BAD
Route::get('about', [AboutPageController::class, 'index'])->middleware('cache:1day', 'CORS');
Route::get('about', [AboutPageController::class, 'index'])->middleware('cache:1day');

Action notation

Controller + action notation

PHP
// GOOD
Route::get('about', [AboutPageController::class, 'index']);

// BAD
Route::get('about', 'AboutPageController@index');

Route Parameters

Route parameters SHOULD use camelCase.

PHP
Route::get('members/{memberId}', [MembersController::class, 'show']);

Verbs

All routes have a http verb, that’s why we put the verb first when defining a route. It makes a group of routes very readable. Any other route options MUST come after it.

PHP
// GOOD: all http verbs come first
Route::get('/', [HomeController::class, 'index'])->name('home');

// BAD: http verbs not easily scannable
Route::name('home')->get('/', [HomeController::class, 'index']);