Laravel XML Support Package
, (*1)
, (*2)
This package comes with the much desired xml support for you Laravel project., (*3)
Supports: Laravel versions v5.3 and above, (*4)
Installation
composer require bmatovu/laravel-xml
Requests
Get the request content (body)., (*5)
$request->xml();
* Returns Bmatovu\LaravelXml\Support\XMLElement object., (*6)
Determine if the request content type is XML., (*7)
$request->sentXml();
Determine if the current request is accepting XML., (*8)
$request->wantsXml();
Validate XML content, (*9)
$isValid = Xml::is_valid($request->xml());
if (! $isValid) {
return response()->xml(['message' => 'The given data was malformed.'], 400);
}
Validation - Against XML Schema Definition, (*10)
$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, (*11)
Content-Type → text/xml; charset=UTF-8, (*12)
Middleware
First register the middleware in app\Http\Kernel.php, (*13)
protected $routeMiddleware = [
// ...
'xml' => \Bmatovu\LaravelXml\Http\Middleware\RequireXml::class,
];
Then use the middleware on your routes, or in the controllers., (*14)
Route::post('/users', function (Request, $request) {
// do something...
})->middleware('xml');
This middleware only checks the Content-Type by defaul;, (*15)
[415 - Unsupported Media Type], (*16)
<?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, (*17)
Route::post('/users', function (Request, $request) {
// do something...
})->middleware('xml:1');
[400 - Bad Request], (*18)
<?xml version="1.0" encoding="UTF-8"?>
<document>
<message>The given data was malformed.</message>
</document>
Utilities
Encode: Array to Xml, (*19)
Xml::encode(['key' => 'value']);
Or, (*20)
xml_encode(['key' => 'value']);
Decode: Xml to Array, (*21)
Xml::decode('<?xml version="1.0" encoding="UTF-8"?><document><key>value</key></document>');
Or, (*22)
xml_decode('<?xml version="1.0" encoding="UTF-8"?><document><key>value</key></document>');
Credits
Under the hood, I'm using;, (*23)
Spatie's array to XML convernsion, (*24)
Hakre's XML to JSON conversion, (*25)
Akande's XML validation, (*26)
Reporting bugs
If you've stumbled across a bug, please help us by leaving as much information about the bug as possible, e.g., (*27)
- 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!, (*28)