Controllers

Instead of defining all request handling logic as callback functions in routes, you might prefer to organize this behavior using 'controller' classes. Controllers can group the logic for handling related requests into a single class.

Writing Controllers

Basic Controllers

To quickly generate a new controller, you can run the make:controller command. By default, all controllers generated by this command are stored in the src/http/controllers directory:

php line make:controller UserController

A controller can have any number of public methods that will respond to incoming HTTP requests:

namespace App\Http\Controllers;

use App\Models\User;

class UserController
{
    /**
     * Show the profile of a specific user.
     */
    public static function show($req, $res)
    {
        $id = $req->param('id');
        
        return $res->view('user.profile', [
            'user' => User::findOrFail($id)
        ]);
    }
}

After writing a controller class and its method, you can define a route for the controller method as follows:

use App\Http\Controllers\UserController;
 
$app->get('/user/:id', [UserController::class, 'show']);

When an incoming request matches the specified route URI, the show method of the App\Http\Controllers\UserController class will be invoked, and the route parameters will be passed to the method.

Middleware in Controllers

Middlewares can also be defined directly in controllers to apply pre-processing or post-processing logic to all routes or to a specific group of routes. This allows you to centralize the middleware logic directly within the controller structure.

namespace App\Http\Controllers;

class UserController
{
    // ... Other methods

    /**
     * Middleware to check authentication.
     */
    public static function loggedIn($req, $res, $next)
    {
        $authenticated = false; // Your authentication logic

        if (!$authenticated) {
            $res->redirect('/login');
        }

        $next();
    }
}

In this example, the loggedIn method acts as middleware to check authentication before any route is executed. This ensures that only authenticated users can access routes that use this middleware.

After writing your middleware, you can apply it to a route as follows:

use App\Http\Controllers\UserController;

$loggedIn = [UserController::class, 'loggedIn'];
 
$app->get('/user/:id', $loggedIn, [UserController::class, 'show']);

This ensures that the loggedIn middleware is executed before the show method is called for any request on the /user/:id route.


Controllers in Lithe provide an organized and efficient way to manage HTTP request handling. By centralizing the logic related to your resources, you gain code reusability and simplify the maintenance of your application.