Troubleshooting SOAP: requesting multiple elements

I’m integrating the Whistl shipping carrier in our custom framework through SOAP protocol.

The fastest way is to build an array with all the required elements and send it to Whistl API.

Working with SOAP in php is very simple. Especially when you use the array as a container to pass to SOAP.

Example of SOAP initialisation and the method to be called with the array:

// initiate the soap request
$client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1));

// Building the array 
$DespatchParcel = array(
 ...
);

// my method was DespatchParcel
// and the array was build into 
$result = $client->DespatchParcel($DespatchParcel);

But later, going a bit closer through documentation spotted this bit of requirement for the request:

<ifor1:ParcelProducts>
  <ifor1:parcelProduct>
    <ifor1:Code>30205958</ifor1:Code>
    <ifor1:Quantity>1</ifor1:Quantity>
  </ifor1:parcelProduct> 
  <ifor1:parcelProduct>
    <ifor1:Code>30205959</ifor1:Code>
    <ifor1:Quantity>2</ifor1:Quantity>
  </ifor1:parcelProduct> 
</ifor1:ParcelProducts>

And at that moment I realised, there’s no way I could pass multiple elements with the same tag (<parcelProduct> ) using the array.

Overcome the multiple elements restriction

Tried multiple approaches and the best solution (the one and only one)  was to use the empty generic php Object.
It allows you to pass a request with same multiple elements, for example the upper XML request would look like:

// new object 
$DespatchParcel = new stdClass();

$parcelProduct1 = new stdClass();
// assign property 
$parcelProduct1->Code = "30205958";
$parcelProduct1->Quantity = "1";

$parcelProduct2 = new stdClass();
$parcelProduct2->Code = "30205959";
$parcelProduct2->Quantity = "2";

$ParcelProducts = new stdClass();
$ParcelProducts->parcelProduct = $parcelProduct1;
$ParcelProducts->parcelProduct = $parcelProduct2;

$DespatchParcel->ParcelProducts = $ParcelProducts;

After the object is properly build and is passed to the method as in the following example:

// Make the SOAP call 
$result = $client->DespatchParcel($DespatchParcel);

That’s what I’m calling a neat solution 😀 !

P.S. Don’t forget to pass every bit of code through GIT, that’s a life saver.

M2 Defining a plugin

A plugin is used to extend or modify a public method’s behaviour by applying code before, after, or around that observed method.

The first argument for the before, after, and around methods is an object that provides access to all public methods of the observed method’s class.

Note: The rest of the parameters for these functions are depending on the function type (before, after, around) – they are having a dynamic number of parameters.

Read more “M2 Defining a plugin”