Mastering Laravel HTTP Requests

aravel Laravel Views & Blade Templates – Beginner’s Guide

Laravel makes handling HTTP requests easy and elegant with the Illuminate\Http\Request class. This class lets you interact with everything about the request — like input data, headers, cookies, uploaded files, and even trusted proxies.


Introduction

Whenever a user visits your Laravel application, their browser sends an HTTP request. Laravel wraps this request in an object called Illuminate\Http\Request.

With it, you can:

  • Get form input ($request->input('name'))
  • Read headers, cookies, and IP addresses
  • Work with JSON data
  • Handle uploaded files
  • Configure trusted proxies & hosts

Interacting With the Request

Accessing the Request in Controllers

You can access the request by type-hinting it:

use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

class UserController extends Controller
{
    public function store(Request $request): RedirectResponse
    {
        $name = $request->input('name');
        // Save the user...
        return redirect('/users');
    }
}
Accessing the Request in Routes
use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
    return $request->path(); // returns current path
});

Dependency Injection & Route Parameters

Even if your route has parameters, Laravel still injects the request:

Route::put('/user/{id}', [UserController::class, 'update']);
public function update(Request $request, string $id)
{
    return "User ID: $id";
}

Request Path, Host & Method

Request Path
$request->path(); // "foo/bar"
Match Path
if ($request->is('admin/*')) { ... }
if ($request->routeIs('admin.*')) { ... }
Full URL
$request->url();        // without query string
$request->fullUrl();    // with query string

Add/remove query params:

$request->fullUrlWithQuery(['page' => 2]);
$request->fullUrlWithoutQuery(['token']);
Host & Scheme
$request->host();              // example.com
$request->httpHost();          // example.com:8000
$request->schemeAndHttpHost(); // https://example.com
Method
$request->method(); // GET, POST, PUT...
$request->isMethod('post'); // true/false

Request Headers

$request->header('X-Token');
$request->header('X-Token', 'default'); // fallback
$request->hasHeader('X-Token');
$request->bearerToken(); // Authorization: Bearer <token>

Client IP
$request->ip();   // Single IP
$request->ips();  // All forwarded IPs

⚠️ IPs can’t always be trusted (e.g., behind proxies).


Content Negotiation

$request->getAcceptableContentTypes(); // ['text/html', 'application/json']
$request->accepts(['application/json']); // true/false
$request->prefers(['html','json']); // best match
$request->expectsJson(); // true if AJAX/JSON request

PSR-7 Requests

Laravel supports PSR-7 request/response with extra packages:

composer require symfony/psr-http-message-bridge nyholm/psr7
use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
    return $request->getUri();
});

Working With Input

Retrieve All Input
$request->all(); 
$request->collect(); // returns a Collection
Retrieve Single Values
$request->input('name', 'Default Name');
$request->input('products.0.name'); // array input
Query String Only
$request->query('page', 1);
JSON Input
$request->input('user.name');
Typed Inputs
$request->string('name')->trim();
$request->integer('age', 18);
$request->boolean('active');
$request->array('tags');
$request->date('birthday');
$request->enum('status', Status::class);
Dynamic Properties
$request->name; // same as input('name')
Subsets
$request->only('email', 'username');
$request->except('password');

Input Presence

$request->has('email');
$request->hasAny(['name', 'email']);
$request->filled('name');
$request->isNotFilled('address');
$request->missing('phone');

Execute logic:

$request->whenHas('name', fn($val) => ...);
$request->whenFilled('name', fn($val) => ...);
$request->whenMissing('name', fn() => ...);

Merging Input

$request->merge(['role' => 'user']);
$request->mergeIfMissing(['votes' => 0]);

Old Input (Session Flashing)

Flash to session:

$request->flash();
$request->flashOnly('username');
$request->flashExcept('password');

Redirect with input:

return redirect()->back()->withInput();

Retrieve old input:

old('username'); // Blade helper

Cookies

$request->cookie('name');

(Laravel encrypts and signs cookies automatically.)


Input Normalization

By default, Laravel:
– Trims strings
– Converts empty strings → null

Disable in bootstrap/app.php:

$middleware->remove([
    TrimStrings::class,
    ConvertEmptyStringsToNull::class,
]);

Or conditionally:

$middleware->trimStrings(except: [
    fn ($request) => $request->is('admin/*'),
]);

File Uploads

Retrieve Uploaded File
$file = $request->file('photo');
$file = $request->photo;

Check:

$request->hasFile('photo');
$request->file('photo')->isValid();
File Info
$request->photo->path();
$request->photo->extension();
Store Files
$path = $request->photo->store('images'); // storage/app/images
$path = $request->photo->store('images', 's3'); // cloud
$request->photo->storeAs('images', 'profile.jpg');

Trusted Proxies

If you’re behind a load balancer, configure trusted proxies:

$middleware->trustProxies(at: ['192.168.1.1']);
$middleware->trustProxies(at: '*'); // trust all

For AWS ELB:

$middleware->trustProxies(headers: Request::HEADER_X_FORWARDED_AWS_ELB);

Trusted Hosts

Restrict hostnames your app will respond to:

$middleware->trustHosts(at: ['laravel.test']);
$middleware->trustHosts(at: ['laravel.test'], subdomains: false);

Important

With Laravel’s Request class, you can:

  • Read all request input (form, query, JSON)
  • Work with headers, cookies, and IPs
  • Manage old input and flash data
  • Handle file uploads easily
  • Configure proxies & hosts for secure deployments