Controllers

Naming Controllers

Controller classes should use PascalCase and end with "Controller". Each controller should represent a single resource or logical grouping of actions.

// Good
class UserController extends Controller
{
    // methods
}
class InvoiceController extends Controller
{
    // methods
}

// Bad
class user_controller extends Controller
{
    // methods
}
class users extends Controller
{
    // methods
}

Controller Actions

Controller methods should be public and use descriptive names. For RESTful controllers, use standard method names: index, show, store, update, destroy.

// Good
public function index()
{
    // Return a list of users
}

public function show($id)
{
    // Show a single user
}

public function store(Request $request)
{
    // Create a new user
}

public function update(Request $request, $id)
{
    // Update user
}

public function destroy($id)
{
    // Delete user
}

// Bad
public function get_users()
{
    // logic
}
public function save_user(Request $request)
{
    // logic
}

Resource Controllers

Use Laravel's resource controllers to automatically map RESTful routes to controller actions. This improves consistency and reduces boilerplate code.

// Good
Route::resource('users', UserController::class);
// This creates routes for index, create, store, show, edit, update, destroy

// Bad
Route::get('users', [UserController::class, 'index']);
Route::post('users', [UserController::class, 'store']); // other routes

Best Practices

  • Keep controllers thin: move business logic to service classes, action class or models.
  • Validate requests using Form Request classes, not directly in controllers.
  • Use dependency injection for services and repositories.
  • Return appropriate HTTP responses (JSON for APIs, views for web).
  • Document controller methods with PHPDoc comments.

Example: RESTful Controller

/**
 * Handles user management actions.
 */
class UserController extends Controller
{
    /**
     * Display a listing of users.
     */
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }

    /**
     * Store a newly created user.
     */
    public function store(StoreUserRequest $request)
    {
        $user = User::create($request->validated());
        return redirect()->route('users.index')->with('success', 'User created!');
    }

    // ...other RESTful methods...
}