Skip to content

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>
Clone this wiki locally