bmatovu / laravel-xml
Laravel XML Support
Installs: 168 430
Dependents: 0
Suggesters: 0
Security: 0
Stars: 85
Watchers: 2
Forks: 9
Open Issues: 6
Requires
- php: ^8.1
- illuminate/database: ^10.0|^11.0
- illuminate/http: ^10.0|^11.0
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- laravel/framework: ^10.0|^11.0
- orchestra/testbench: ^8.0|^9.0
- phpunit/phpunit: ^9.0|^10.0|^11.0
README
This package comes with the much desired xml support for you Laravel project.
Supports: Laravel versions v5.3 and above
Installation
composer require bmatovu/laravel-xml
Requests
Get the request content (body).
$request->xml();
* Returns Bmatovu\LaravelXml\Support\XMLElement
object.
Determine if the request content type is XML.
$request->sentXml();
Determine if the current request is accepting XML.
$request->wantsXml();
Validate XML content
$isValid = Xml::is_valid($request->xml()); if (! $isValid) { return response()->xml(['message' => 'The given data was malformed.'], 400); }
Validation - Against XML Schema Definition
$errors = Xml::validate($request->xml(), 'path_to/sample.xsd'); if ($errors) { return response()->xml([ 'message' => 'The given data was invalid.', 'errors' => $errors, ], 422); }
Responses
Route::get('/users/{user}', function (Request $request, int $userId) { $user = User::findOrFail($userId); return response()->xml($user); });
<?xml version="1.0" encoding="UTF-8"?> <document> <id>1</id> <name>jdoe</name> <email>jdoe@example.com</email> </document>
Route::get('/users/{user}', function (Request $request, int $userId) { $user = User::findOrFail($userId); return response()->xml(['user' => $user->toArray()]); });
<?xml version="1.0" encoding="UTF-8"?> <document> <user> <id>1</id> <name>jdoe</name> <email>jdoe@example.com</email> </user> </document>
Route::get('/users/{user}', function (Request $request, int $userId) { $user = User::findOrFail($userId); return response()->xml($user, 200, [], ['root' => 'user']); });
<?xml version="1.0" encoding="UTF-8"?> <user> <id>1</id> <name>jdoe</name> <email>jdoe@example.com</email> </user>
Route::get('/users', function () { $users = User::get(); return response()->xml(['users' => $users->toArray()]); });
<?xml version="1.0" encoding="UTF-8"?> <document> <users> <id>1</id> <name>John Doe</name> <email>jdoe@example.com</email> </users> <users> <id>2</id> <name>Gary Plant</name> <email>gplant@example.com</email> </users> </document>
And will automatically set the content type to xml
Content-Type → text/xml; charset=UTF-8
Middleware
First register the middleware in app\Http\Kernel.php
protected $routeMiddleware = [ // ... 'xml' => \Bmatovu\LaravelXml\Http\Middleware\RequireXml::class, ];
Then use the middleware on your routes, or in the controllers.
Route::post('/users', function (Request, $request) { // do something... })->middleware('xml');
This middleware only checks the Content-Type
by defaul;
[415
- Unsupported Media Type]
<?xml version="1.0" encoding="UTF-8"?> <document> <message>Only accepting content of type XML.</message> </document>
To check is the passed content is valid XML, pass a bool to the middleware
Route::post('/users', function (Request, $request) { // do something... })->middleware('xml:1');
[400
- Bad Request]
<?xml version="1.0" encoding="UTF-8"?> <document> <message>The given data was malformed.</message> </document>
Utilities
Encode: Array to Xml
Xml::encode(['key' => 'value']);
Or
xml_encode(['key' => 'value']);
Decode: Xml to Array
Xml::decode('<?xml version="1.0" encoding="UTF-8"?><document><key>value</key></document>');
Or
xml_decode('<?xml version="1.0" encoding="UTF-8"?><document><key>value</key></document>');
Credits
Under the hood, I'm using;
Spatie's array to XML convernsion
Hakre's XML to JSON conversion
Reporting bugs
If you've stumbled across a bug, please help us by leaving as much information about the bug as possible, e.g.
- Steps to reproduce
- Expected result
- Actual result
This will help us to fix the bug as quickly as possible, and if you do wish to fix it yourself; feel free to fork the package on GitHub and submit a pull request!