Building a Laravel Resource Controller for a Book Library
📖 Scenario: You are creating a simple web app to manage a library of books. You want to use Laravel's resource controller to handle common actions like listing books, showing details, creating, updating, and deleting books.
🎯 Goal: Build a Laravel resource controller named BookController with all standard resource methods and set up the routes to use this controller.
📋 What You'll Learn
Create a resource controller named BookController
Define a route resource for books that uses BookController
Implement the index method to return a view named books.index
Implement the show method to return a view named books.show with the book data
Implement the create method to return a view named books.create
💡 Why This Matters
🌍 Real World
Resource controllers are used in Laravel apps to handle common actions for data models like books, users, or products in a clean and organized way.
💼 Career
Understanding resource controllers is essential for Laravel developers to build maintainable and scalable web applications following best practices.
Progress0 / 4 steps
1
Create the BookController resource controller
Use the Artisan command php artisan make:controller BookController --resource to create a resource controller named BookController.
Laravel
Hint
Use the Laravel Artisan command line tool to generate a resource controller with all standard methods.
2
Add a resource route for books
In the routes/web.php file, add a resource route for books that uses the BookController.
Laravel
Hint
Use Route::resource with the exact controller class path.
3
Implement the index and show methods
In BookController, implement the index method to return the view books.index. Implement the show method to return the view books.show passing the $book variable.
Laravel
Hint
Use return view('view.name') and pass data as an array for the show method.
4
Implement the create method
In BookController, implement the create method to return the view books.create.
Laravel
Hint
Return the view books.create in the create method.
Practice
(1/5)
1. What is the main purpose of a resource controller in Laravel?
easy
A. To create views without a controller
B. To handle database migrations automatically
C. To group all CRUD actions for a resource in one controller
D. To manage user authentication only
Solution
Step 1: Understand what resource controllers do
Resource controllers in Laravel group related actions like create, read, update, and delete (CRUD) for a resource in one controller class.
Step 2: Compare options with this definition
Only To group all CRUD actions for a resource in one controller correctly describes this grouping of CRUD actions. Other options describe unrelated features.
Final Answer:
To group all CRUD actions for a resource in one controller -> Option C
Quick Check:
Resource controller = CRUD grouping [OK]
Hint: Resource controllers group CRUD actions in one place [OK]
Hint: Use Route::resource('uri', Controller::class) to register resource routes [OK]
Common Mistakes:
Using Route::controller instead of Route::resource
Swapping URI and controller parameters
Calling resource() as a method on controller instance
3. Given this resource controller route registration: Route::resource('photos', PhotoController::class); Which URL and HTTP method will call the destroy method in PhotoController for photo with ID 5?
medium
A. PUT /photos/5/destroy
B. GET /photos/5/destroy
C. POST /photos/5/delete
D. DELETE /photos/5
Solution
Step 1: Recall resource route conventions for destroy
The destroy method is called with HTTP DELETE on the resource URI with the ID, e.g., DELETE /photos/{id}.
Step 2: Match options to this pattern
DELETE /photos/5 matches DELETE /photos/5. Other options use wrong HTTP methods or incorrect URLs.
Final Answer:
DELETE /photos/5 -> Option D
Quick Check:
Destroy = DELETE /resource/{id} [OK]
Hint: Destroy uses DELETE method on /resource/{id} URL [OK]
Common Mistakes:
Using GET or POST instead of DELETE for destroy
Adding extra path segments like /destroy or /delete
Confusing PUT with DELETE method
4. Consider this route registration: Route::resource('users', UserController::class); Which of the following code snippets will cause a runtime error when trying to access the show method?
medium
A. public function show() { return 'User not found'; }
B. public function show(User $user) { return $user; }
C. public function show($id) { return view('user.show', compact('id')); }
D. public function show($id) { return User::findOrFail($id); }
Solution
Step 1: Understand show method parameter requirements
The show method expects either an ID parameter or a model instance via route model binding.
Step 2: Analyze each option
public function show() { return 'User not found'; } has no parameter, so Laravel cannot pass the required ID or model, causing a runtime error. Others have correct parameters.
Final Answer:
public function show() { return 'User not found'; } -> Option A
Quick Check:
Show method must accept ID or model parameter [OK]
Hint: Show method needs parameter for ID or model [OK]
Common Mistakes:
Omitting parameters in show method
Using wrong parameter types without binding
Ignoring route model binding requirements
5. You want to create a resource controller for Product but only want to generate routes for index, show, and store methods. Which is the correct way to register this in routes/web.php?
hard
A. Route::resource('products', ProductController::class)->except(['create', 'edit']);
B. Route::resource('products', ProductController::class)->only(['index', 'show', 'store']);
C. Route::resource('products', ProductController::class)->skip(['create', 'edit']);
D. Route::resource('products', ProductController::class)->filter(['index', 'show', 'store']);
Solution
Step 1: Recall how to limit resource routes
Laravel allows limiting routes using the only method with an array of method names.
Step 2: Evaluate each option
A uses except(['create', 'edit']) which excludes only create and edit, leaving index, store, show, update, and destroy. B correctly uses only(['index', 'show', 'store']). C and D use invalid methods skip and filter.
Final Answer:
Route::resource('products', ProductController::class)->only(['index', 'show', 'store']); -> Option B
Quick Check:
Limit resource routes with only([...]) [OK]
Hint: Use ->only([...]) to limit resource controller routes [OK]
Common Mistakes:
Using invalid methods like skip or filter
Confusing only with except
Not passing array to only method
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.