marwa-framework

Requests

Requests represent incoming HTTP requests in your application. Marwa Framework uses PSR-7 standard for request handling.

Accessing the Request

Using the Helper

<?php

use Marwa\Framework\Facades\Router;
use Marwa\Router\Response;

// In a route handler
Router::get('/users/{id}', function($id) {
    $request = request();

    // Get user ID from route parameter
    $userId = $id;

    return Response::json(['user_id' => $userId]);
})->register();

Via Dependency Injection

<?php

namespace App\Controllers;

use Psr\Http\Message\ServerRequestInterface;

class UserController
{
    public function show(ServerRequestInterface $request, int $id)
    {
        return Response::json(['user_id' => $id]);
    }
}

Getting Input

Get Single Value

// From query string: /search?q=keyword
$query = request('q'); // "keyword"

// From POST data
$name = request('name');

// With default value
$theme = request('theme', 'light');

Get All Input

// All input as array
$all = request()->all();

// Only specific keys
$specific = request()->only(['name', 'email']);

Check if Input Exists

if (request()->has('name')) {
    // Input exists
}

if (request()->filled('email')) {
    // Input exists and is not empty
}

Route Parameters

// Route: /users/{id}/posts/{post}
Router::get('/users/{id}/posts/{post}', function($id, $post) {
    $request = request();

    // Get from route
    $userId = $request->getAttribute('id');
    $postId = $request->getAttribute('post');

    return Response::json([
        'user_id' => $userId,
        'post_id' => $postId
    ]);
})->register();

Query Parameters

// URL: /search?category=books&sort=price&order=asc

$category = request()->query('category');
$sort = request()->query('sort', 'name');
$order = request()->query('order', 'asc');

// Get all query parameters
$queryParams = request()->getQueryParams();

POST Data

// HTML form with POST
$name = request()->post('name');
$email = request()->post('email');

// All POST data
$postData = request()->getParsedBody();

JSON Data

For API requests with JSON body:

// Content-Type: application/json
// Body: {"name": "John", "email": "john@example.com"}

$data = request()->all(); // Automatically parses JSON
$name = $data['name'];
$email = $data['email'];

File Uploads

// HTML: <input type="file" name="avatar">
$file = request()->getUploadedFiles()['avatar'];

if ($file && $file->getError() === UPLOAD_ERR_OK) {
    $filename = $file->getClientFilename();
    $size = $file->getSize();
    $tmpName = $file->getStream()->getMetadata('uri');

    // Move to storage
    move_uploaded_file($tmpName, storage_path('app/' . $filename));
}

Headers

// Get single header
$contentType = request()->getHeaderLine('Content-Type');

// Check if header exists
if (request()->hasHeader('Authorization')) {
    $token = request()->getHeaderLine('Authorization');
}

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

Request Information

$request = request();

// HTTP method
$method = $request->getMethod(); // GET, POST, PUT, etc.

// Is this an AJAX request?
$isAjax = $request->getHeaderLine('X-Requested-With') === 'XMLHttpRequest';

// Request URI
$uri = (string) $request->getUri(); // /users/123

// Client IP
$ip = $request->getServerParams()['REMOTE_ADDR'] ?? '';

// User Agent
$userAgent = $request->getHeaderLine('User-Agent');

// Referer
$referer = $request->getHeaderLine('Referer');

Request Attributes

Middleware can add attributes to requests:

// In middleware
$request = $request->withAttribute('user_id', 123);

// In controller
$userId = request()->getAttribute('user_id');

Content Type

// Check request content type
$contentType = $request->getHeaderLine('Content-Type');

// Common types
if (str_contains($contentType, 'application/json')) {
    // JSON request
}

if (str_contains($contentType, 'multipart/form-data')) {
    // Form with files
}

Request Validation

<?php

use Marwa\Framework\Facades\Router;
use Marwa\Router\Response;
use Marwa\Support\Validation\ValidationException;

Router::post('/register', function() {
    try {
        $data = validate_request([
            'name' => 'required|string|min:2',
            'email' => 'required|email',
            'password' => 'required|string|min:8',
        ]);

        // Validation passed
        return Response::json(['success' => true, 'data' => $data]);

    } catch (ValidationException $e) {
        return Response::json([
            'success' => false,
            'errors' => $e->errors()->all()
        ], 422);
    }
})->register();

Custom Rule Example

use App\Validation\Rules\StrongPasswordRule;
use Marwa\Framework\Validation\RequestValidator;
use Marwa\Support\Validation\RuleRegistry;

$registry = app(RuleRegistry::class);
$registry->register('strong_password', StrongPasswordRule::class);

$validator = app(RequestValidator::class);

$data = $validator->validateInputWithCustomRules(
    [
        'password' => 'Secret123!@#',
        'password_confirmation' => 'Secret123!@#',
    ],
    [
        'password' => 'required|strong_password|confirmed',
    ],
    [],
    [],
    [
        'strong_password' => StrongPasswordRule::class,
    ]
);

Helper Functions

Function Description
request() Get current request
request('key') Get input value
request()->all() Get all input
request()->query('key') Get query param
request()->post('key') Get POST value

Next Steps