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

Laravel Response Xml Laravel Package

jailtonsc/laravel-response-xml

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:
    composer require jailtonsc/laravel-response-xml
    
  2. Register Provider & Alias: Add to config/app.php:
    'providers' => [
        // ...
        XmlResponse\XmlResponseServiceProvider::class,
    ],
    'aliases' => [
        'Xml' => XmlResponse\Facades\XmlFacade::class,
    ]
    
  3. Publish Config (Optional):
    php artisan vendor:publish --provider="XmlResponse\XmlResponseServiceProvider"
    

First Use Case

Replace a JSON response with XML in a controller or route:

Route::get('/users', function () {
    return response()->xml(User::all()); // Auto-converts Eloquent collection to XML
});

Where to Look First

  • Facade Usage: Xml::asXml($data) for direct XML string conversion.
  • Response Macro: response()->xml($data, $status, $config) for HTTP responses.
  • Published Config: config/xml.php for customizing root tags, row names, and formatting.

Implementation Patterns

Core Workflows

  1. API Responses:

    // Controller
    public function index() {
        return response()->xml(User::paginate(10), 200, [
            'root' => 'users',
            'row'  => 'user'
        ]);
    }
    
  2. Direct XML Generation:

    $xmlString = Xml::asXml(Order::with('items')->find(1));
    
  3. Dynamic Configuration:

    $config = config('xml.defaults');
    $config['rowName'] = 'record';
    return response()->xml(Post::all(), 200, $config);
    

Integration Tips

  • Middleware: Use to enforce XML responses for specific routes:
    public function handle($request, Closure $next) {
        if ($request->wantsXml()) {
            $response = $next($request);
            return response()->xml($response->getContent(), $response->status());
        }
        return $next($request);
    }
    
  • Form Requests: Extend Illuminate\Foundation\Http\FormRequest to support XML:
    public function response(array $data) {
        return response()->xml($data);
    }
    
  • Testing: Mock XML responses in tests:
    $this->get('/api/users')
         ->assertHeader('Content-Type', 'application/xml')
         ->assertSee('<users>');
    

Common Use Cases

Scenario Implementation
Pagination response()->xml(User::paginate(5))
Single Resource response()->xml(User::find(1))
Custom Root Tag response()->xml($data, 200, ['root' => 'custom_root'])
Nested Relationships Auto-handled by package (e.g., User::with('posts')->find(1))

Gotchas and Tips

Pitfalls

  1. Nested Relationships:

    • The package auto-converts relationships, but circular references (e.g., User->posts->author->posts) may cause infinite loops. Use ->with() selectively or exclude problematic relations:
      User::with(['posts' => function($q) {
          $q->where('published', true);
      }])->find(1);
      
  2. Config Overrides:

    • Global config (config/xml.php) may be overridden by inline config, but inline config takes precedence. Test edge cases:
      // Overrides global 'root' and 'row' settings
      response()->xml($data, 200, ['root' => 'override_root']);
      
  3. Non-Eloquent Data:

    • The package is optimized for Eloquent models/collections. For arrays or custom objects:
      // Explicitly define structure
      $config = [
          'template' => '<response><items>{items}</items></response>',
          'rowName'  => 'item'
      ];
      response()->xml(['items' => [1, 2, 3]], 200, $config);
      
  4. Performance:

    • Large datasets may impact performance. For streaming XML, consider:
      $xml = Xml::asXml(User::chunk(100, function($users) {
          // Process chunks
      }));
      

Debugging

  • Validate XML Output: Use Xml::asXml($data) to inspect raw XML before returning a response. Tools like XMLLint can validate the output.
  • Check Headers: Ensure Content-Type: application/xml is set. If missing, manually add:
    return response()->xml($data)->header('Content-Type', 'application/xml');
    
  • Log Config: Dump config to debug overrides:
    \Log::debug('XML Config:', [
        'global' => config('xml'),
        'inline' => $config
    ]);
    

Extension Points

  1. Custom Templates: Extend the package by publishing and modifying the resources/views/xml templates:

    php artisan vendor:publish --tag=xml-views
    

    Then override xml/response.blade.php or xml/collection.blade.php.

  2. Macro Extensions: Add custom macros to the response object in a service provider:

    Response::macro('xmlWithMeta', function ($data, $status = 200) {
        $xml = $this->xml($data, $status);
        return $xml->withMeta(['count' => count($data)]);
    });
    
  3. Event Listeners: Listen for XmlResponseGenerating events to modify XML generation:

    Event::listen('XmlResponseGenerating', function ($event) {
        $event->xml->setAttribute('version', '1.0');
    });
    

Pro Tips

  • Consistent Naming: Use kebab-case for root and rowName in config to match common XML conventions:
    ['root' => 'api-users', 'rowName' => 'user']
    
  • API Versioning: Combine with api-version middleware to support both XML and JSON:
    if ($request->wantsXml()) {
        return response()->xml($data)->header('X-API-Version', 'v1');
    }
    
  • Documentation: Auto-generate XML schemas for your API using tools like Trang on the output of Xml::asXml().
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