ApnaPHP

Documentation

Request Object

ApnaPHP's Request object provides a comprehensive interface for handling HTTP requests. It encapsulates all request data including GET parameters, POST data, files, headers, cookies, and more.

1. Creating a Request Object

The Request object is automatically created and passed to your route handlers:

<?php
// app/api/users/route.apna.php

use ApnaPHP\Routing\Request;
use ApnaPHP\Routing\Response;

function GET(Request $request): Response
{
    // Request object is automatically injected
    $userId = $request->param('id');
    $search = $request->query('search');
    
    return Response::json(['user_id' => $userId, 'search' => $search]);
}

You can also create a Request object manually:

use ApnaPHP\Routing\Request;

$request = Request::createFromGlobals();

2. Request Information

HTTP Method

$method = $request->method(); // GET, POST, PUT, DELETE, etc.
$isGet = $request->isGet();
$isPost = $request->isPost();
$isPut = $request->isPut();
$isDelete = $request->isDelete();
$isPatch = $request->isPatch();

URL Information

$uri = $request->uri(); // Full URI
$path = $request->path(); // Path without query string
$queryString = $request->queryString(); // Query string
$fullUrl = $request->fullUrl(); // Full URL with protocol and host
$url = $request->url(); // URL without query string

Request Headers

$allHeaders = $request->headers(); // All headers as array
$contentType = $request->header('Content-Type');
$userAgent = $request->header('User-Agent');
$authorization = $request->header('Authorization');

// Check if header exists
$hasContentType = $request->hasHeader('Content-Type');

Client Information

$ip = $request->ip(); // Client IP address
$userAgent = $request->userAgent(); // User agent string
$isAjax = $request->isAjax(); // Check if request is AJAX
$isJson = $request->isJson(); // Check if request expects JSON

3. Input Data

GET Parameters

$allQuery = $request->query(); // All GET parameters
$search = $request->query('search'); // Single parameter
$page = $request->query('page', 1); // With default value
$filters = $request->query('filters', []); // Array with default

// Check if parameter exists
$hasSearch = $request->hasQuery('search');

POST Data

$allPost = $request->post(); // All POST data
$name = $request->post('name'); // Single field
$email = $request->post('email', ''); // With default value
$data = $request->post('data', []); // Array with default

// Check if field exists
$hasName = $request->hasPost('name');

All Input Data

$allInput = $request->all(); // All input data (GET + POST)
$name = $request->input('name'); // Single input with default
$email = $request->input('email', ''); // With default value

// Check if input exists
$hasName = $request->hasInput('name');

// Get only specified inputs
$userData = $request->only(['name', 'email', 'password']);
$userData = $request->except(['password', 'password_confirmation']);

JSON Data

$jsonData = $request->json(); // All JSON data
$name = $request->json('name'); // Single JSON field
$email = $request->json('email', ''); // With default value

// Check if JSON data exists
$hasJson = $request->hasJson();

4. Route Parameters

Dynamic Route Parameters

// For route: /api/users/{id}/posts/{postId}
function GET(Request $request): Response
{
    $userId = $request->param('id'); // Get route parameter
    $postId = $request->param('postId'); // Get route parameter
    $allParams = $request->params(); // All route parameters
    
    return Response::json([
        'user_id' => $userId,
        'post_id' => $postId,
        'all_params' => $allParams
    ]);
}

Parameter Validation

$userId = $request->param('id');
if (!$userId || !is_numeric($userId)) {
    return Response::json(['error' => 'Invalid user ID'], 400);
}

5. File Uploads

Single File

$file = $request->file('avatar'); // Get uploaded file
if ($file) {
    $fileName = $file['name'];
    $fileSize = $file['size'];
    $fileType = $file['type'];
    $tempPath = $file['tmp_name'];
}

Multiple Files

$files = $request->files('photos'); // Array of files
foreach ($files as $file) {
    if ($file['error'] === UPLOAD_ERR_OK) {
        // Process file
    }
}

File Validation

$file = $request->file('avatar');
if ($file && $file['error'] === UPLOAD_ERR_OK) {
    // File uploaded successfully
    $isImage = strpos($file['type'], 'image/') === 0;
    $isValidSize = $file['size'] <= 2 * 1024 * 1024; // 2MB
}

6. Cookies

Get Cookies

$allCookies = $request->cookies(); // All cookies
$sessionId = $request->cookie('session_id'); // Single cookie
$theme = $request->cookie('theme', 'light'); // With default value

// Check if cookie exists
$hasSession = $request->hasCookie('session_id');

7. Server Information

Server Variables

$serverInfo = $request->server(); // All server variables
$requestMethod = $request->server('REQUEST_METHOD');
$requestUri = $request->server('REQUEST_URI');
$httpHost = $request->server('HTTP_HOST');

Environment Information

$isHttps = $request->isSecure(); // Check if HTTPS
$isLocalhost = $request->isLocalhost(); // Check if localhost
$host = $request->host(); // Get host
$port = $request->port(); // Get port
$scheme = $request->scheme(); // Get scheme (http/https)

8. Request Validation

Basic Validation

function POST(Request $request): Response
{
    // Validate required fields
    if (!$request->hasInput('name')) {
        return Response::json(['error' => 'Name is required'], 400);
    }
    
    if (!$request->hasInput('email')) {
        return Response::json(['error' => 'Email is required'], 400);
    }
    
    // Get and validate data
    $name = $request->input('name');
    $email = $request->input('email');
    
    if (strlen($name) < 3) {
        return Response::json(['error' => 'Name must be at least 3 characters'], 400);
    }
    
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return Response::json(['error' => 'Invalid email format'], 400);
    }
    
    // Process data
    return Response::json(['message' => 'User created successfully']);
}

Using Validation Helper

use ApnaPHP\Support\Validation;

function POST(Request $request): Response
{
    try {
        $validated = validate($request->all(), [
            'name' => 'required|min:3|max:255',
            'email' => 'required|email',
            'password' => 'required|min:8|confirmed'
        ]);
        
        // Data is valid
        return Response::json(['message' => 'User created successfully']);
        
    } catch (ValidationException $e) {
        return Response::json(['errors' => $e->errors()], 422);
    }
}

9. Request Transformation

Data Sanitization

function POST(Request $request): Response
{
    $data = $request->all();
    
    // Sanitize input data
    $data['name'] = trim($data['name']);
    $data['email'] = strtolower(trim($data['email']));
    $data['description'] = strip_tags($data['description']);
    
    // Process sanitized data
    return Response::json(['message' => 'Data processed']);
}

Data Filtering

function POST(Request $request): Response
{
    // Get only allowed fields
    $allowedFields = ['name', 'email', 'phone', 'bio'];
    $userData = $request->only($allowedFields);
    
    // Remove sensitive fields
    $safeData = $request->except(['password', 'password_confirmation', 'admin_token']);
    
    return Response::json(['data' => $safeData]);
}

10. API Request Handling

JSON API Requests

function POST(Request $request): Response
{
    // Check if request expects JSON
    if (!$request->isJson()) {
        return Response::json(['error' => 'Content-Type must be application/json'], 415);
    }
    
    // Get JSON data
    $data = $request->json();
    
    if (!$data) {
        return Response::json(['error' => 'Invalid JSON data'], 400);
    }
    
    // Process JSON data
    return Response::json(['message' => 'JSON data processed']);
}

Form Data Requests

function POST(Request $request): Response
{
    // Check if request is form data
    if ($request->isJson()) {
        return Response::json(['error' => 'Form data expected'], 400);
    }
    
    // Get form data
    $data = $request->post();
    
    // Process form data
    return Response::json(['message' => 'Form data processed']);
}

11. File Upload Handling

Single File Upload

function POST(Request $request): Response
{
    $file = $request->file('avatar');
    
    if (!$file) {
        return Response::json(['error' => 'No file uploaded'], 400);
    }
    
    if ($file['error'] !== UPLOAD_ERR_OK) {
        return Response::json(['error' => 'File upload failed'], 400);
    }
    
    // Validate file type
    $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
    if (!in_array($file['type'], $allowedTypes)) {
        return Response::json(['error' => 'Invalid file type'], 400);
    }
    
    // Validate file size (2MB)
    if ($file['size'] > 2 * 1024 * 1024) {
        return Response::json(['error' => 'File too large'], 400);
    }
    
    // Process file
    $uploadPath = 'uploads/' . uniqid() . '.' . pathinfo($file['name'], PATHINFO_EXTENSION);
    move_uploaded_file($file['tmp_name'], $uploadPath);
    
    return Response::json(['message' => 'File uploaded successfully', 'path' => $uploadPath]);
}

Multiple File Upload

function POST(Request $request): Response
{
    $files = $request->files('photos');
    
    if (!$files || !is_array($files)) {
        return Response::json(['error' => 'No files uploaded'], 400);
    }
    
    $uploadedFiles = [];
    
    foreach ($files as $file) {
        if ($file['error'] === UPLOAD_ERR_OK) {
            $uploadPath = 'uploads/' . uniqid() . '.' . pathinfo($file['name'], PATHINFO_EXTENSION);
            move_uploaded_file($file['tmp_name'], $uploadPath);
            $uploadedFiles[] = $uploadPath;
        }
    }
    
    return Response::json(['message' => 'Files uploaded successfully', 'files' => $uploadedFiles]);
}

12. Request Middleware

Authentication Middleware

function POST(Request $request): Response
{
    // Check authentication
    $token = $request->header('Authorization');
    if (!$token) {
        return Response::json(['error' => 'Authorization header required'], 401);
    }
    
    // Validate token
    if (!validateToken($token)) {
        return Response::json(['error' => 'Invalid token'], 401);
    }
    
    // Process authenticated request
    return Response::json(['message' => 'Request processed']);
}

Rate Limiting

function POST(Request $request): Response
{
    $ip = $request->ip();
    $rateLimitKey = "rate_limit:{$ip}";
    
    // Check rate limit
    $currentRequests = cache()->get($rateLimitKey, 0);
    if ($currentRequests >= 100) { // 100 requests per hour
        return Response::json(['error' => 'Rate limit exceeded'], 429);
    }
    
    // Increment rate limit counter
    cache()->put($rateLimitKey, $currentRequests + 1, 3600);
    
    // Process request
    return Response::json(['message' => 'Request processed']);
}

13. Best Practices

  • Always Validate Input: Never trust user input. Always validate and sanitize data.
  • Use Type Hints: Use proper type hints for request parameters.
  • Handle Errors Gracefully: Always handle potential errors and provide meaningful error messages.
  • Sanitize Data: Sanitize input data to prevent XSS and other security issues.
  • Use HTTPS: Always use HTTPS in production to protect sensitive data.
  • Implement Rate Limiting: Implement rate limiting to prevent abuse.
  • Log Requests: Log important requests for debugging and monitoring.

The Request object provides a comprehensive interface for handling all aspects of HTTP requests in ApnaPHP applications.