Controllers
LaravelControllers 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 UserControllerapp/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.Test your knowledge!
Take a quiz to reinforce what you learned.