nette/http
Nette HTTP provides a clean, lightweight HTTP layer for PHP apps. It handles requests, responses, headers, cookies, sessions, and URL utilities with a consistent API, making it easy to build frameworks, middleware, or standalone services.
To integrate nette/http into a Laravel project, install via Composer:
composer require nette/http
use Nette\Http\Request;
use Nette\Http\Url;
// In a Laravel controller or middleware
public function handle(Request $request)
{
$url = $request->getUrl();
$query = $url->getQueryParameters();
// Access POST data
$postData = $request->getPost();
// Access GET parameters
$getData = $request->getQueryParameters();
return response()->json([
'query' => $query,
'post' => $postData,
'get' => $getData,
]);
}
// app/Providers/NetteHttpServiceProvider.php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Nette\Http\RequestFactory;
class NetteHttpServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton(RequestFactory::class, function () {
$factory = new RequestFactory();
$factory->setForceHttps(true); // Force HTTPS behind proxies
return $factory;
});
}
}
// In a controller or middleware
public function __construct(RequestFactory $requestFactory)
{
$this->request = $requestFactory->createRequest();
}
// Middleware example
public function handle($request, Closure $next)
{
$netteRequest = app(RequestFactory::class)->createRequest();
$url = $netteRequest->getUrl();
// Check for HTTPS behind proxies
if ($netteRequest->isSecure() === false && config('app.force_https')) {
return redirect()->secure($url);
}
return $next($request);
}
// Generate absolute URLs
$url = new Url('https://example.com');
$absoluteUrl = $url->setPath('/products')->setQuery(['id' => 123]);
// Resolve relative URLs
$baseUrl = new Url('https://example.com/base');
$relativeUrl = new Url('/relative/path');
$resolvedUrl = $baseUrl->resolve($relativeUrl);
// In a Laravel service or controller
public function __construct(Session $session)
{
$this->session = $session;
}
// Store data
$this->session->set('user', ['name' => 'John']);
// Retrieve data
$user = $this->session->get('user');
// Section-based storage
$cart = $this->session->getSection('cart');
$cart->addItem('product1');
// Handle file uploads in a controller
public function upload(Request $request)
{
$file = $request->getFile('document');
if ($file->isOk()) {
$path = $file->getSanitizedName();
$file->moveTo($path, false);
return response()->json(['success' => true]);
}
return response()->json(['error' => 'Upload failed'], 400);
}
// Custom response headers
$response = new Response();
$response->setHeader('X-Custom-Header', 'value');
$response->setCookie('theme', 'dark', ['expire' => time() + 3600]);
// Send file
$response->sendAsFile('/path/to/file.pdf', 'document.pdf');
// app/Http/Middleware/NetteRequestMiddleware.php
public function handle($request, Closure $next)
{
$netteRequest = app(RequestFactory::class)->createRequest();
// Attach Nette request to Laravel request
$request->merge([
'nette_request' => $netteRequest,
'nette_url' => $netteRequest->getUrl(),
]);
return $next($request);
}
$factory = new RequestFactory();
$factory->setForceHttps(true); // Overrides server environment
$factory->setTrustedProxies(['192.168.1.1', '10.0.0.1']);
// Disable auto-start to avoid session file creation on spoofed IDs
$session->setAutoStart(false);
$session->setReadAndClose(true); // Useful for performance in read-heavy apps
$session->getSection('temp')->clean(); // Manually clean sections
$query = Url::parseQuery('key=value&key2=value2');
// Returns ['key' => 'value', 'key2' => 'value2']
// Use instead of deprecated:
$url->getQueryParameters(); // ✅
// $url->getQuery(); // ❌ Deprecated
$safeName = $file->getSanitizedName(); // Removes unsafe chars
if ($file->isImage()) {
$size = $file->getImageSize(); // Returns [width, height]
}
SameSite attributes:
$response->setCookie('user', '123', [
'expire' => time() + 3600,
'sameSite' => 'Lax', // or 'Strict', 'None'
]);
$response->removeCookie('old_cookie');
dd($request->getHeaders(), $request->getPost(), $request->getFiles());
$url = new Url('https://example.com/path?query=value');
dd($url->getPath(), $url->getQueryParameters());
Request class:
// app/Http/NetteRequest.php
use Nette\Http\Request as NetteRequest;
class NetteRequest extends \Illuminate\Http\Request
{
public function getNetteRequest()
{
return app(\Nette\Http\RequestFactory::class)->createRequest();
}
}
// In AppServiceProvider boot()
$this->app->singleton(\Illuminate\Session\SessionManager::class, function () {
$netteSession = new \Nette\Http\Session();
return new \Illuminate\Session\Store($netteSession);
});
RequestFactory:
// Cache the factory in a singleton
$factory = new RequestFactory();
$factory->setTrustedProxies(config('app.trusted_proxies'));
$session->setAutoStart(false);
$session->start(); // Manually start only when needed
// ❌ Deprecated
$url->getBasePath();
$request->getReferer();
$session->getIterator();
// ✅ Use instead
$url->getPath();
$request->getUrl()->getReferer();
$session->getSectionNames();
| Error | Solution |
|---|---|
session_start(): Cannot send session cookie |
Ensure cookieDomain and cookiePath are correctly set in HttpExtension. |
Url::parseQuery() fails on ; |
Use Url::parseQuery('key=val;key2=val2', ';') to specify custom separator. |
FileUpload returns false for images |
Check getimagesize() permissions or use isImage() first. |
SameSite cookie issues |
Set sameSite to 'Lax', 'Strict', or 'None' explicitly. |
RequestFactory ignores proxies |
Ensure trustedProxies includes all proxy IPs and X-Forwarded-* headers are present. |
How can I help you explore Laravel packages today?