Controllers

Controllers are the heart of your application. They handle HTTP requests, process data, and return responses. Controllers keep your routes clean and organize your application logic.

Creating Controllers

Using CLI (Recommended)

The fastest way to create a controller is using the CLI tool:

php mini make:controller UserController

This creates a new controller file at:

app/Controllers/UserController.php

Manual Creation

You can also create controllers manually. All controllers must:

  • Extend the Core\Controller class
  • Be in the App\Controllers namespace
  • Be placed in app/Controllers/ directory
  • Use PascalCase with "Controller" suffix
<?php

namespace App\Controllers;

use Core\Controller;
use Core\Request;

class UserController extends Controller
{
    public function index(Request $request)
    {
        // Handle GET /users
        return $this->view('users.index');
    }
}

Controller Methods

Controller methods receive the Request object as the first parameter, followed by any route parameters.

Basic Method

public function index(Request $request)
{
    // Handle the request
    return $this->view('users.index');
}

Method with Route Parameters

// Route: Route::get('/user/{id}', 'UserController@show');

public function show(Request $request, $id)
{
    // $id contains the route parameter
    $user = User::find($id);
    return $this->view('users.show', ['user' => $user]);
}

Multiple Parameters

// Route: Route::get('/user/{userId}/post/{postId}', 'PostController@show');

public function show(Request $request, $userId, $postId)
{
    // Parameters are passed in order
    $user = User::find($userId);
    $post = Post::find($postId);
    
    return $this->view('posts.show', [
        'user' => $user,
        'post' => $post
    ]);
}

Returning Responses

Controllers can return different types of responses using helper methods from the base Controller class.

Return a View

public function index(Request $request)
{
    // Return a view with data
    return $this->view('users.index', [
        'users' => User::all(),
        'title' => 'All Users'
    ]);
}

Return JSON

public function api(Request $request)
{
    // Return JSON response
    return $this->json([
        'status' => 'success',
        'data' => User::all()
    ], 200);
}

Return Text

public function simple(Request $request)
{
    // Return plain text
    return $this->text('Hello, World!', 200);
}

Redirect

public function store(Request $request)
{
    // Process form data
    $data = $request->post();
    User::create($data);
    
    // Redirect after successful creation
    return $this->redirect('/users');
}

Complete Controller Example

<?php

namespace App\Controllers;

use Core\Controller;
use Core\Request;
use App\Models\User;

class UserController extends Controller
{
    /**
     * Display a listing of users
     */
    public function index(Request $request)
    {
        $users = User::all();
        return $this->view('users.index', [
            'users' => $users,
            'title' => 'All Users'
        ]);
    }

    /**
     * Show a specific user
     */
    public function show(Request $request, $id)
    {
        $user = User::find($id);
        
        if (!$user) {
            return $this->text('User not found', 404);
        }
        
        return $this->view('users.show', [
            'user' => $user
        ]);
    }

    /**
     * Show form to create a new user
     */
    public function create(Request $request)
    {
        return $this->view('users.create');
    }

    /**
     * Store a new user
     */
    public function store(Request $request)
    {
        $data = $request->post();
        
        // Validate data (add your validation logic)
        if (empty($data['name']) || empty($data['email'])) {
            return $this->redirect('/users/create');
        }
        
        // Create user
        $user = new User();
        $user->create($data);
        
        // Redirect to user list
        return $this->redirect('/users');
    }

    /**
     * Update a user
     */
    public function update(Request $request, $id)
    {
        $data = $request->post();
        $user = new User();
        $user->update($id, $data);
        
        return $this->redirect('/users/' . $id);
    }

    /**
     * Delete a user
     */
    public function delete(Request $request, $id)
    {
        $user = new User();
        $user->delete($id);
        
        return $this->json(['message' => 'User deleted'], 200);
    }
}

Accessing Request Data

The Request object provides access to GET, POST, headers, and more.

public function store(Request $request)
{
    // Get POST data
    $name = $request->post('name');
    $email = $request->post('email');
    
    // Get all POST data
    $allData = $request->post();
    
    // Get GET parameters
    $page = $request->get('page', 1); // with default value
    
    // Get input (checks both GET and POST)
    $search = $request->input('search');
    
    // Get headers
    $token = $request->header('Authorization');
    
    // Get request method
    $method = $request->method(); // GET, POST, etc.
    
    // Get request path
    $path = $request->path(); // /users/123
}
💡 Tip: See the Request & Response documentation for complete details on working with requests.

Best Practices

  • Keep controllers thin: Move business logic to models or service classes.
  • Use descriptive method names: index, show, create, store, update, delete.
  • Return appropriate responses: Views for HTML, JSON for APIs, redirects for form submissions.
  • Validate input: Always validate and sanitize user input before processing.
  • Handle errors gracefully: Return appropriate error responses (404, 500, etc.).

Next Steps

Now that you understand controllers, learn about: