How to Use Controllers in Laravel

How to Use Controllers in Laravel

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

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.

check mark99.99% Uptime check markFree SSL check markDedicated IP Address check markDeveloper Tools

Laravel Hosting

Derrell Willis
Derrell Willis Manager, Developer Relations

More Articles by Derrell

Was this article helpful? Join the conversation!