How to Use Controllers in Laravel Updated on August 21, 2024 by Derrell 4 Minutes, 33 Seconds to Read Laravel is a powerful PHP framework that offers a clean and expressive syntax for web development. Controllers play a critical role in Laravel by handling the logic of your application, responding to user actions, and returning appropriate responses. In this guide, we’ll explore how to effectively use controllers in Laravel, from creating them to using them in your routes. What are Controllers in Laravel? Creating a Controller Defining Methods in a Controller Routing to Controller Methods Resource Controllers Middleware in Controllers Dependency Injection in Controllers Handling Form Requests Returning Responses Using API Controllers Best Practices Conclusion What are Controllers in Laravel Controllers in Laravel are classes that handle the logic behind incoming requests and provide the necessary responses. They are typically stored in the app/Http/Controllers directory. Controllers can group related request-handling logic into a single class, making your code more organized and easier to maintain. Creating a Controller Laravel provides a simple way to generate controllers using the Artisan command-line tool. To create a new controller, use the following command: php artisan make:controller MyController This command creates a new file named MyController.php in the app/Http/Controllers directory. The new controller file will look something like this: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MyController extends Controller { // } You can now add methods to this class to handle various routes Defining Methods in a Controller Each method in a controller corresponds to a specific route or action in your application. For instance, if you want to handle a GET request to show a list of products, you could define a method like this: public function index() { $products = Product::all(); return view('products.index', compact('products')); } This index method fetches all products from the database and returns a view named products.index. Routing to Controller Methods To direct traffic to a specific controller method, you need to define it in your routes/web.php file: use App\Http\Controllers\MyController; Route::get('/products', [MyController::class, 'index']); This route definition means that when a user visits /products, the index method of MyController will be executed. Resource Controllers Laravel also offers a convenient way to handle CRUD (Create, Read, Update, Delete) operations through resource controllers. You can create a resource controller using the following command: php artisan make:controller ProductController --resource A resource controller comes with predefined methods for the common CRUD actions: index – Show all items create – Show form to create a new item store – Handle the saving of a new item show – Show a single item edit – Show form to edit an existing item update – Handle the updating of an item destroy – Delete an item You can register all routes for these actions with a single line in your routes/web.php file: Route::resource('products', ProductController::class); This automatically creates routes for all CRUD operations associated with the ProductController. Middleware in Controllers Middleware in Laravel provides a way to filter HTTP requests before they reach your controllers. You can assign middleware to a controller method or the entire controller: class MyController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { // This method is protected by the 'auth' middleware } } This ensures that only authenticated users can access the index method. Dependency Injection in Controllers Laravel’s service container makes it easy to manage dependencies and inject them into your controller methods: public function show(ProductRepository $repository, $id) { $product = $repository->find($id); return view('products.show', compact('product')); } In this example, ProductRepository is automatically resolved by the service container and injected into the show method. Handling Form Requests Laravel also allows you to validate and process form requests using custom FormRequest classes. You can create a form request class using Artisan: php artisan make:request StoreProductRequest This class can be used in a controller method to handle validation: use App\Http\Requests\StoreProductRequest; public function store(StoreProductRequest $request) { // Validation is already done by StoreProductRequest $validated = $request->validated(); Product::create($validated); return redirect()->route('products.index'); } Returning Responses Laravel controllers allow you to return various types of responses: Views: Render a Blade template using the view helper. JSON: Return a JSON response using the response()->json() method. Redirects: Redirect users to a different page using redirect()->route() or redirect()->back(). Example: public function store(StoreProductRequest $request) { // Save the product Product::create($request->validated()); // Return a JSON response return response()->json(['message' => 'Product created successfully']); } Using API Controllers Laravel provides a simple way to build API controllers using the apiResource method, which is similar to resource but optimized for APIs: Route::apiResource('products', ProductController::class); API controllers don’t include routes for create or edit, as these operations typically involve forms and are irrelevant in API contexts. Best Practices Single Responsibility: Ensure each controller method has a single responsibility, making your code easier to maintain. RESTful Structure: Follow RESTful conventions for method names and routes. Use Resource Controllers: Use resource controllers to minimize repetitive code for CRUD operations. Validation: Leverage form requests for validation to keep controller methods clean. Conclusion Controllers in Laravel are potent tools that help organize your application’s logic. By following best practices and utilizing Laravel’s built-in features, such as resource controllers and middleware, you can easily create robust, maintainable applications. Whether handling web requests or building APIs, Laravel controllers are vital in delivering a seamless user experience. Boost your Laravel apps with our specialized Laravel Hosting. Experience faster speeds for your Laravel applications and websites thanks to NVMe storage, server protection, dedicated resources, and optimization tools. 99.99% Uptime Free SSL Dedicated IP Address Developer Tools Laravel Hosting Share this Article Derrell Willis Manager, Developer Relations More Articles by Derrell Related Articles How to Check the Laravel Version of Your Project Laravel Blade Basics Troubleshooting 500 Error in Laravel Database Seeding in Laravel Understanding the Laravel env File How to Use Controllers in Laravel Form Validation in Laravel Understanding CSRF Protection in Laravel Creating Laravel Database Model Factories Mastering Laravel Pagination