Request & Response

The Request and Response classes handle all HTTP interactions in your application. Understanding these classes is essential for building robust web applications.

Request Object

The Request object provides access to all incoming HTTP request data. It's automatically passed to your controller methods.

Accessing Request in Controllers

<?php

namespace App\Controllers;

use Core\Controller;
use Core\Request;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // Access request data
        $data = $request->post();
        
        // Process the request...
    }
}
?>

GET Parameters

Get Single Parameter

// URL: /users?page=2&limit=10

// Get a single GET parameter
$page = $request->get('page');        // Returns '2' or null
$limit = $request->get('limit', 20); // Returns '10' or default 20

// Check if parameter exists
if ($request->get('search')) {
    $search = $request->get('search');
}

Get All GET Parameters

// Get all GET parameters as array
$allParams = $request->get();

// Example: ['page' => '2', 'limit' => '10', 'search' => 'john']

POST Data

Get Single POST Field

// Get a single POST field
$name = $request->post('name');
$email = $request->post('email', 'default@example.com'); // with default

// Check if field exists
if ($request->post('password')) {
    $password = $request->post('password');
}

Get All POST Data

// Get all POST data as array
$data = $request->post();

// Example: ['name' => 'John', 'email' => 'john@example.com', 'password' => 'secret']

// Use in controller
public function store(Request $request)
{
    $data = $request->post();
    
    // Validate and process
    $user = new User();
    $user->create($data);
}

Input Method (GET or POST)

// Get input from either GET or POST
$value = $request->input('name');
$value = $request->input('name', 'default');

// Get all input (merges GET and POST)
$allInput = $request->input();

Headers

Get Header

// Get a specific header
$token = $request->header('Authorization');
$contentType = $request->header('Content-Type', 'application/json'); // with default

// Common headers
$userAgent = $request->header('User-Agent');
$referer = $request->header('Referer');

Get All Headers

// Get all headers as array
$headers = $request->headers();

// Example: ['Authorization' => 'Bearer token123', 'Content-Type' => 'application/json']

Request Methods

// Get HTTP method
$method = $request->method(); // Returns: 'GET', 'POST', 'PUT', 'DELETE', etc.

// Check method
if ($request->method() === 'POST') {
    // Handle POST request
}

// Get request path
$path = $request->path(); // Returns: '/users/123' (without query string)

// Get full URI
$uri = $request->uri(); // Returns: '/users/123?page=2'

Response Object

The Response class handles all HTTP responses. Use helper methods in controllers or create responses directly.

Text Response

// In controller
return $this->text('Hello, World!', 200);

// Or directly
use Core\Response;
return Response::text('Not Found', 404);

JSON Response

// In controller
return $this->json([
    'status' => 'success',
    'data' => User::all()
], 200);

// Or directly
use Core\Response;
return Response::json(['error' => 'Not found'], 404);

Redirect Response

// In controller
return $this->redirect('/users');

// With status code
return $this->redirect('/login', 301); // Permanent redirect

// Or directly
use Core\Response;
return Response::redirect('/dashboard', 302);

View Response

// In controller (most common)
return $this->view('users.index', ['users' => $users]);

// Automatically returns a Response object with HTML content

HTTP Status Codes

Common HTTP status codes you can use:

Code Meaning Usage
200 OK Successful request
201 Created Resource created
301 Moved Permanently Permanent redirect
302 Found Temporary redirect
400 Bad Request Invalid request
401 Unauthorized Authentication required
403 Forbidden Access denied
404 Not Found Resource not found
500 Internal Server Error Server error

Complete Example

<?php

namespace App\Controllers;

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

class UserController extends Controller
{
    public function index(Request $request)
    {
        // Get pagination from GET parameters
        $page = $request->get('page', 1);
        $limit = $request->get('limit', 10);
        
        // Get search query
        $search = $request->get('search');
        
        // Fetch users (simplified)
        $users = User::all();
        
        // Return view
        return $this->view('users.index', [
            'users' => $users,
            'page' => $page,
            'search' => $search
        ]);
    }

    public function store(Request $request)
    {
        // Get POST data
        $data = $request->post();
        
        // Validate
        if (empty($data['name']) || empty($data['email'])) {
            return $this->json(['error' => 'Name and email required'], 400);
        }
        
        // Create user
        $user = new User();
        $userId = $user->create($data);
        
        // Return success response
        return $this->json([
            'status' => 'success',
            'message' => 'User created',
            'id' => $userId
        ], 201);
    }

    public function show(Request $request, $id)
    {
        $user = User::find($id);
        
        if (!$user) {
            return $this->text('User not found', 404);
        }
        
        // Check if API request (via header)
        if ($request->header('Accept') === 'application/json') {
            return $this->json($user);
        }
        
        // Return HTML view
        return $this->view('users.show', ['user' => $user]);
    }
}
?>

Next Steps

Now that you understand Request & Response, learn about: