-
Notifications
You must be signed in to change notification settings - Fork 9
Sample usage
Brian Matovu edited this page Mar 10, 2020
·
2 revisions
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element name="users">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="email"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element ref="users" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?php
namespace App\Http\Controllers\Api;
use App\User;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Bmatovu\LaravelXml\Support\XmlElement;
use Illuminate\Validation\ValidationException;
class UserController extends Controller
{
/**
* Import users.
*
* @param \Illuminate\Http\Request $request
*
* @return \Illuminate\Http\Response
*/
public function import(Request $request)
{
if(!Xml::is_valid($request->getContent())) {
return response()->xml(['error' => 'Invalid XML'], 415);
}
$errors = Xml::validate(
$request->getContent(),
public_path('schemas\users\import.xsd')
);
if ($errors) {
return response()->xml(['error' => $errors], 400);
}
$document = simplexml_load_string($request->getContent(), XmlElement::class);
$imported = 0;
$successful = $failed = [];
foreach($document->get('users', []) as $user)
{
$existing_user = User::where('email', $user->email)->first();
if($existing_user) {
// $failed[] = $existing_user->toArray();
$failed[] = [
'name' => $user->name,
'email' => $user->email,
];
continue;
}
$password = $user->get('password', Str::random(10));
User::create([
'name' => $user->name,
'email' => $user->email,
'password' => Hash::make($password),
]);
$successful[] = [
'name' => $user->name,
'email' => $user->email,
];
$imported++;
}
$message = "Imported {$imported} of {$document->users->count()} users.";
return response()->xml([
'message' => $message,
'successful' => $successful,
'failed' => $failed,
], 201);
}
}
<?php
use Illuminate\Support\Facades\Route;
Route::group(['namespace' => '\App\Http\Controllers\Api'], function () {
Route::pattern('user', '^\d+$');
Route::group(['prefix' => 'users'], function () {
Route::post('/import', 'UserController@import')->middleware('xml');
});
});
curl -X POST 'htdocs.local/laravel/7.x/public/api/users/import' \
-H 'Accept: application/xml' \
-H 'Authorization: Bearer TwJqAXvBDPocKb914F092ZXvEUOrpPrIHcI6QlN6RGSlaQwRC6itQAjGHWXK' \
-H 'Content-Type: application/xml' \
-d '<?xml version="1.0" encoding="UTF-8" ?>
<document>
<users>
<name>John Doe</name>
<email>[email protected]</email>
</users>
<users>
<name>Bruce Alison</name>
<email>[email protected]</email>
</users>
</document>'
<?xml version="1.0" encoding="UTF-8"?>
<document>
<message>Imported 1 of 2 users.</message>
<successful>
<name>John Doe</name>
<email>[email protected]</email>
</successful>
<failed>
<name>Bruce Alison</name>
<email>[email protected]</email>
</failed>
</document>