Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Symfony Shared Laravel Package

drenso/symfony-shared

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation

    composer require drenso/symfony-shared
    

    Ensure your project uses Symfony components (e.g., symfony/http-foundation, symfony/routing, etc.) as dependencies.

  2. 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"
    
  3. 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=1Uri object).
  4. 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.
    }
    

Implementation Patterns

Workflows

  1. 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
    
  2. 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()
    );
    
  3. 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"
    

Integration Tips

  • 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');
    

Gotchas and Tips

Pitfalls

  1. Request Object Mismatch

    • Laravel’s Request and Symfony’s Request have different method names (e.g., Laravel::input() vs. Symfony::request->get()).
    • Fix: Always use SharedRequest methods (e.g., get(), query(), request()) to avoid confusion.
  2. Header Handling

    • Symfony’s Request expects headers in lowercase (e.g., content-type), while Laravel’s $_SERVER may vary.
    • Fix: Normalize headers in SharedRequest constructor:
      $headers = array_change_key_case($_SERVER, CASE_LOWER);
      
  3. File Uploads

    • SharedRequest expects $_FILES array, but Laravel’s Request uses UploadedFile objects.
    • Fix: Convert Laravel’s uploads to Symfony’s UploadedFile:
      $symfonyFiles = [];
      foreach ($request->file() as $key => $file) {
          $symfonyFiles[$key] = new UploadedFile(
              $file->getRealPath(),
              $file->getClientOriginalName(),
              $file->getMimeType(),
              0,
              true
          );
      }
      
  4. Session Integration

    • Symfony’s Request requires a Session object, but Laravel’s session is separate.
    • Fix: Pass a Laravel session to SharedRequest via a custom wrapper or middleware.

Debugging

  • 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');
    

Extension Points

  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);
        }
    }
    
  2. 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']);
        }
    }
    
  3. Symfony Component Aliases Create Laravel facades for Symfony components:

    Facades\Symfony::request(); // Returns SharedRequest instance.
    

Config Quirks

  • 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());
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
comsave/common
alecsammon/php-raml-parser
chrome-php/wrench
lendable/composer-license-checker
typhoon/reflection
mesilov/moneyphp-percentage
mike42/gfx-php
bookdown/themes
aura/view
aura/html
aura/cli
povils/phpmnd
nayjest/manipulator
omnipay/tests
psr-mock/http-message-implementation
psr-mock/http-factory-implementation
psr-mock/http-client-implementation
voku/email-check
voku/urlify
rtheunissen/guzzle-log-middleware