Installation
composer require drenso/symfony-shared
Ensure your project uses Symfony components (e.g., symfony/http-foundation, symfony/routing, etc.) as dependencies.
First Use Case: Shared HTTP Request Handling
Import the SharedRequest class to handle HTTP requests consistently across your Laravel app:
use Drenso\SymfonyShared\SharedRequest;
$request = new SharedRequest($_SERVER, $_GET, $_POST, [], $_COOKIE, $_FILES, $_SERVER['CONTENT_TYPE']);
$method = $request->getMethod(); // "GET", "POST", etc.
$path = $request->getPathInfo(); // "/example/path"
Key Classes to Explore
SharedRequest: Wraps Symfony’s Request for Laravel’s $_SERVER/$_GET/$_POST data.SharedResponse: Mimics Symfony’s Response for Laravel’s response logic.SharedUri: Standardizes URI handling (e.g., /path?query=1 → Uri object).Quick Win
Replace Laravel’s native request handling with SharedRequest in a middleware or service:
public function handle($request, Closure $next) {
$symfonyRequest = new SharedRequest(
$_SERVER,
$request->query->all(),
$request->all(),
[],
$request->cookie(),
[],
$request->header('Content-Type')
);
// Use $symfonyRequest for Symfony-compatible logic.
}
Symfony-Laravel Bridge
Use SharedRequest/SharedResponse to integrate Symfony components (e.g., Symfony\Component\Routing) without rewriting logic:
use Drenso\SymfonyShared\SharedRequest;
use Symfony\Component\Routing\RequestContext;
$context = new RequestContext();
$context->fromRequest(new SharedRequest($_SERVER, $_GET, $_POST, [], $_COOKIE, [], $_SERVER['CONTENT_TYPE']));
$router = new Router($routes, $context);
$path = $router->match($request->getPathInfo())->getPath(); // Symfony routing
Response Standardization
Convert Laravel responses to Symfony’s Response for APIs or third-party integrations:
use Drenso\SymfonyShared\SharedResponse;
$laravelResponse = response()->json(['data' => 'test']);
$symfonyResponse = new SharedResponse(
$laravelResponse->getContent(),
$laravelResponse->getStatusCode(),
$laravelResponse->headers->all()
);
URI Manipulation
Parse/normalize URIs with SharedUri for URL generation or validation:
use Drenso\SymfonyShared\SharedUri;
$uri = new SharedUri('/path/to?query=1');
$scheme = $uri->getScheme(); // "http" or "https"
$query = $uri->getQuery(); // "query=1"
Middleware Integration
Replace Laravel’s request object with SharedRequest in middleware for Symfony-compatible logic:
public function handle($request, Closure $next) {
$symfonyRequest = new SharedRequest(
$_SERVER,
$request->query->all(),
$request->all(),
[],
$request->cookie(),
[],
$request->header('Content-Type')
);
// Use Symfony’s Request methods (e.g., $symfonyRequest->isXmlHttpRequest()).
}
Service Providers Bind Symfony components to Laravel’s container for reuse:
public function register() {
$this->app->singleton('symfony.request', function () {
return new SharedRequest($_SERVER, $_GET, $_POST, [], $_COOKIE, [], $_SERVER['CONTENT_TYPE']);
});
}
Testing
Mock SharedRequest/SharedResponse in PHPUnit tests to simulate Symfony behavior:
$mockRequest = $this->createMock(SharedRequest::class);
$mockRequest->method('getMethod')->willReturn('GET');
Request Object Mismatch
Request and Symfony’s Request have different method names (e.g., Laravel::input() vs. Symfony::request->get()).SharedRequest methods (e.g., get(), query(), request()) to avoid confusion.Header Handling
Request expects headers in lowercase (e.g., content-type), while Laravel’s $_SERVER may vary.SharedRequest constructor:
$headers = array_change_key_case($_SERVER, CASE_LOWER);
File Uploads
SharedRequest expects $_FILES array, but Laravel’s Request uses UploadedFile objects.UploadedFile:
$symfonyFiles = [];
foreach ($request->file() as $key => $file) {
$symfonyFiles[$key] = new UploadedFile(
$file->getRealPath(),
$file->getClientOriginalName(),
$file->getMimeType(),
0,
true
);
}
Session Integration
Request requires a Session object, but Laravel’s session is separate.SharedRequest via a custom wrapper or middleware.Verify Input Data
Dump SharedRequest data to ensure Laravel’s $_SERVER/$_GET/$_POST maps correctly:
dd([
'server' => $_SERVER,
'get' => $_GET,
'post' => $_POST,
]);
Check URI Parsing
Validate SharedUri parsing with edge cases:
$uri = new SharedUri('http://example.com/path?query=1#fragment');
assert($uri->getScheme() === 'http');
assert($uri->getQuery() === 'query=1');
Custom Request Wrapper
Extend SharedRequest to add Laravel-specific methods:
class LaravelSharedRequest extends SharedRequest {
public function laravelInput($key = null, $default = null) {
return $this->request->get($key, $default);
}
}
Response Decorator
Decorate SharedResponse to add Laravel-specific headers or JSON encoding:
class LaravelSharedResponse extends SharedResponse {
public function json($data, $status = 200, array $headers = []) {
$this->setContent(json_encode($data));
$this->setStatusCode($status);
$this->headers->add(['Content-Type' => 'application/json']);
}
}
Symfony Component Aliases Create Laravel facades for Symfony components:
Facades\Symfony::request(); // Returns SharedRequest instance.
No Built-in Config The package has no Laravel-specific config. Override defaults in a service provider:
$this->app->singleton('config', function () {
return [
'symfony_shared' => [
'default_locale' => 'en_US',
'trusted_proxies' => ['192.168.0.1'],
],
];
});
Locale Handling
Symfony’s Request uses RequestContext for locale, but Laravel uses App::setLocale(). Sync them in middleware:
$context = new RequestContext();
$context->setLocale(app()->getLocale());
How can I help you explore Laravel packages today?