Skip to main content

Overview

The HomeController is a minimal controller in the Dashboard Laravel application. It extends the base Controller class and is prepared for home page and general application routes. Namespace: App\Http\Controllers Extends: Controller

Controller Structure

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    //
}

Purpose

This controller serves as a placeholder for home-related routes and actions. It can be extended to handle:
  • Dashboard home page rendering
  • Application landing pages
  • General informational routes
  • Public-facing content

Base Controller

The HomeController inherits from Laravel’s base Controller class:
<?php

namespace App\Http\Controllers;

abstract class Controller
{
    //
}
In Laravel 11, the base Controller class is intentionally minimal. Previous versions included traits like AuthorizesRequests, ValidatesRequests, but Laravel 11 simplifies this structure.

Usage Examples

Adding Methods

You can extend this controller with custom methods:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    /**
     * Display the dashboard home page
     */
    public function index()
    {
        return view('dashboard');
    }
    
    /**
     * Display application statistics
     */
    public function stats()
    {
        $users = \App\Models\User::count();
        
        return view('stats', compact('users'));
    }
}

Route Registration

use App\Http\Controllers\HomeController;

Route::get('/dashboard', [HomeController::class, 'index'])
    ->middleware('auth')
    ->name('dashboard');

Route::get('/stats', [HomeController::class, 'stats'])
    ->middleware('auth')
    ->name('stats');

Middleware

Controllers in Laravel 11 can apply middleware in routes or using the middleware() method:

In Routes

Route::get('/dashboard', [HomeController::class, 'index'])
    ->middleware(['auth', 'verified']);

In Constructor

class HomeController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('verified')->only('stats');
    }
    
    public function index()
    {
        return view('dashboard');
    }
    
    public function stats()
    {
        // Only verified users can access
        return view('stats');
    }
}

Common Patterns

Dependency Injection

Inject services or repositories through the constructor:
class HomeController extends Controller
{
    protected $userRepository;
    
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }
    
    public function index()
    {
        $users = $this->userRepository->getActive();
        return view('dashboard', compact('users'));
    }
}

Resource Methods

Implement RESTful resource methods:
class HomeController extends Controller
{
    // Display a listing
    public function index()
    {
        return view('home.index');
    }
    
    // Show the form for creating a new resource
    public function create()
    {
        return view('home.create');
    }
    
    // Store a newly created resource
    public function store(Request $request)
    {
        // Validation and storage logic
    }
    
    // Display the specified resource
    public function show($id)
    {
        return view('home.show', compact('id'));
    }
}

Returning JSON Responses

class HomeController extends Controller
{
    public function apiStats()
    {
        return response()->json([
            'users' => User::count(),
            'posts' => Post::count(),
            'status' => 'active'
        ]);
    }
}

Available Methods (Inherited)

While the base Controller class is minimal, you have access to all helper methods provided by Laravel:

Response Helpers

// Return view
return view('home');

// Return JSON
return response()->json(['status' => 'success']);

// Return redirect
return redirect('/dashboard');

// Return with data
return response()->view('home', $data, 200);

Validation

public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|max:255',
        'content' => 'required',
    ]);
    
    // Use validated data
}

Authorization

public function edit($id)
{
    $post = Post::findOrFail($id);
    
    $this->authorize('update', $post);
    
    return view('posts.edit', compact('post'));
}

Best Practices

Keep controllers thin by moving business logic to service classes, repositories, or actions. Controllers should primarily handle HTTP concerns.

Good Example (Thin Controller)

class HomeController extends Controller
{
    public function __construct(
        protected DashboardService $dashboardService
    ) {}
    
    public function index()
    {
        $data = $this->dashboardService->getDashboardData();
        return view('dashboard', $data);
    }
}

Avoid (Fat Controller)

class HomeController extends Controller
{
    public function index()
    {
        // Don't put complex business logic here
        $users = User::where('active', true)
            ->whereHas('posts', function($q) {
                $q->where('published', true);
            })
            ->with('profile', 'settings')
            ->get()
            ->map(function($user) {
                // Complex transformations
            });
            
        return view('dashboard', compact('users'));
    }
}

Build docs developers (and LLMs) love