Lessons → Laravel → Lesson 3

Controllers

Laravel
⏱ 20 min read📖 IntermediateNot completed

Controllers organize request handling logic into classes. Instead of putting all logic in route closures, controllers keep code organized and reusable.

Creating a Controller

Terminal
php artisan make:controller UserController
app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        return view('users.index');
    }

    public function show($id)
    {
        return view('users.show', ['id' => $id]);
    }

    public function store(Request $request)
    {
        // Handle form submission
        $name = $request->input('name');
        return redirect()->route('users.index');
    }
}
?>

Connecting Routes to Controllers

routes/web.php
<?php
use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);
Route::post('/users', [UserController::class, 'store']);
?>

Resource Controllers

Resource controllers provide all CRUD routes automatically:

Terminal + PHP
# Create resource controller
php artisan make:controller PostController --resource

# One line in routes creates 7 routes!
Route::resource('posts', PostController::class);

# Generated routes:
# GET    /posts           → index()   (list all)
# GET    /posts/create    → create()  (show form)
# POST   /posts           → store()   (save new)
# GET    /posts/{id}      → show()    (show one)
# GET    /posts/{id}/edit → edit()    (show edit form)
# PUT    /posts/{id}      → update()  (save changes)
# DELETE /posts/{id}      → destroy() (delete)
?>

Request Object

PHP
<?php
public function store(Request $request)
{
    // Get input
    $name  = $request->input('name');
    $email = $request->input('email', 'default@email.com');

    // All input
    $all = $request->all();

    // Only specific fields
    $data = $request->only(['name', 'email']);

    // Exclude fields
    $data = $request->except(['_token']);

    // Check if field exists
    if ($request->has('name')) { ... }

    // Validate
    $validated = $request->validate([
        'name'  => 'required|min:2|max:50',
        'email' => 'required|email|unique:users',
    ]);

    // Files
    $file = $request->file('photo');
}
?>
💡
Always validate in controllers! Use $request->validate() — Laravel automatically redirects back with errors if validation fails, and shows them in your Blade templates with @error.
← Previous Lesson Next Lesson →
🧠

Test your knowledge!

Take a quiz to reinforce what you learned.

Take Quiz →