Controllers

Names

Singular resource name, Controllers that control a resource must use the singular resource name.

PHP
// GOOD
final class CourseController {}

// BAD
final class CoursesController {}

Defaults

Try to keep controllers simple and stick to the default CRUD keywords (index, create, store, show, edit, update and destroy). Extract a new controller if you need other actions. Laravel Documentation

VerbURIActionRoute Name
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}deletephotos.destroy

This is a loose guideline that doesn’t need to be enforced, but keeping to the standards of Laravel is always a good idea.

Method Injection

Use method injection for Request and other dependencies

PHP
// GOOD
public function update(Request $request, Course $course)
{
    $this->validate($request, ['email' => ['email']);
    $name = $request->input('name');
}

// BAD
public function update(Course $course)
{
    $this->validate(request(), ['email' => ['email']);
    $name = request('name');
}

Param Order

Inject route params, then other dependencies

PHP
// GOOD
public function update(Team $team, Request $request, DetachFromTeamToIndividualGracePeriodAction $detachAction)
{
    ...
}

// BAD
public function update(Request $request, Team $team, DetachFromTeamToIndividualGracePeriodAction $detachAction)
{
    ...
}

The same for scalar GET params (good example: public function update(int $teamId, Request $request).