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']);
