Классы, которые используются классами, сгенерированными проектом PackageGenerator для облегчения UX SoapClient.
Цель состоит в том, чтобы предоставить общие и полезные классы, которые находятся на вершине классов, сгенерированных проектом PackageGenerator.
Например, он позволяет легко пройти через массивные элементы свойства объекта SOAP, он позволяет легко устанавливать HTTP и заголовки SOAP для запроса SOAP, и он позволяет легко заполнять объект из своего представления состояния массива.
Определенные интерфейсы должны использоваться, чтобы иметь возможность соответствовать требованиям для сгенерированных классов PackageGenerator.
Этот интерфейс должен использоваться для определения нового класса перечисления.
Существует по крайней мере/самый один метод, который должен быть реализован, поэтому он довольно быстро его реализовать, даже если вы не видите цели этого:
$value является действительной. Это может быть сделано с помощью массива строки, возвращаемого методом getValidValues , всегда присутствующим в сгенерированных классах перечисления.Если вы не хотите реализовать этот метод, вы также можете создать свой собственный класс, который наследует от нашего класса AbstractStructenumbase.
Этот интерфейс должен использоваться для определения нового класса структуры.
Существует по крайней мере/самый один метод, который должен быть реализован, поэтому он довольно быстро его реализовать, даже если вы не видите цели этого:
Если вы не хотите реализовать этот метод, вы также можете создать свой собственный класс, который наследует от нашего класса AbstractStructBase.
Этот интерфейс должен использоваться для определения нового класса Arraytype. Цель состоит в том, чтобы предоставить коммунальные методы вокруг массивных структур, определенных WSDL, чтобы облегчить обработку его содержания. Следовательно, этот интерфейс наследует от нашего интерфейса structinterface и нативного Arrayaccess, итератора и исчисляемых интерфейсов PHP
Единственным методом, который должен быть реализован, будет getattributeName, но имейте в виду, что он реализован в каждом сгенерированном классе Arraytype, поэтому не нужно его определять. Это просто напоминание о том, что доступно в классах Arraytype.
Таким образом, в основном, вы должны, по крайней мере, переопределить методы, объявленные интерфейсами PHP, от которых этот интерфейс наследует
Если вы не хотите реализовать все методы, вы также можете создать свой собственный класс, который наследует от нашего класса AbstractStructArrayBase.
Этот интерфейс должен использоваться для определения нового базового класса SoapClient для любого класса ServiceType , сгенерированного PackageGenerator.
Вот константы/параметры, определенные этим интерфейсом и их утилитой:
location )trueWSDL_CACHE_NONE , WSDL_CACHE_DISK , WSDL_CACHE_MEMORY или WSDL_CACHE_BOTHSOAP_1_1 или SOAP_1_2 , чтобы выбрать SOAP 1.1 или 1.2 соответственно. Если опущено, используется SOAP 1.1SOAP_SINGLE_ELEMENT_ARRAYS , SOAP_USE_XSI_ARRAY_TYPE , SOAP_WAIT_ONE_WAY_CALLSSOAP_AUTHENTICATION_BASIC (по умолчанию), либо SOAP_AUTHENTICATION_DIGESTSOAP_SSL_METHOD_TLS , SOAP_SSL_METHOD_SSLv2 , SOAP_SSL_METHOD_SSLv3 или SOAP_SSL_METHOD_SSLv23 Вот методы, которые должны быть реализованы и почему:
Если вы не хотите реализовать все эти методы, вы также можете создать свой собственный класс, который наследует от нашего класса AbstractSoapClientBase.
Этот класс является базовым классом для любого класса EnumType , сгенерированного PackageGenerator. Он реализует наш интерфейс structenumInterface. Он определяет два метода:
getValidValues . Этот класс является базовым классом для любого класса StructType , сгенерированного PackageGenerator. Он реализует наш интерфейс structinterface. Он определяет пять методов:
var_export . Это также позволяет вам облегчить инстанцирацию объекта, который содержит множество свойств, которые было бы трудно осмотреть, используя метод __construct . Вы можете увидеть __set_state как метод гидратации.__set но используется методом __set_state . Кроме того, определение метода __set в использованном классе с помощью параметра ClassMap для SoapClient разрывает правильное увлажнение ваших полученных объектов.__get . Используется нашим классом AbstractStructArrayBase. $ item = Api StructType Item:: __set_state ([
' id ' => 1 ,
' name ' => ' Entity #1 ' ,
' label ' => ' Entity #1 ' ,
' _href ' => ' http://www.entity.com ' ,
]);
// $item is now an ApiStructTypeItem object Этот класс является базовым классом для любого класса ArrayType , сгенерированного PackageGenerator. Он реализует наш интерфейс structarrayinterface.
Как только у вас есть элемент, который станет множеством элементов, таких как:
$ items = Api ArrayType Items:: __set_state ([
' items ' => [
Api StructType Item:: __set_state ([
' id ' => 1 ,
' name ' => ' Entity #1 ' ,
' label ' => ' Entity #1 ' ,
' _href ' => ' http://www.entity-1.com ' ,
]),
Api StructType Item:: __set_state ([
' id ' => 2 ,
' name ' => ' Entity #2 ' ,
' label ' => ' Entity #2 ' ,
' _href ' => ' http://www.entity-2.com ' ,
]),
Api StructType Item:: __set_state ([
' id ' => 3 ,
' name ' => ' Entity #3 ' ,
' label ' => ' Entity #3 ' ,
' _href ' => ' http://www.entity-3.com ' ,
]),
],
]);
// 'items' is the unique property of the object
// Its name is returned by the getAttributeName method
// defined in the generated ApiArrayTypeItems classcount , методы length : дает вам количество элементов, содержащихся в вашем объекте foreach ( $ items as $ item ) {
// $items->current() and $item is an ApiStructTypeItem object
// $items->key() is the current index
} $ items -> first (); $ items -> last (); $ items -> item ( $ index ); $ items -> add ( Api StructType Item:: __set_state ([
' id ' => 4 ,
' name ' => ' Entity #4 ' ,
' label ' => ' Entity #4 ' ,
' _href ' => ' http://www.entity-4.com ' ,
])); Этот класс является базовым классом для любого класса ServiceType , сгенерированного PackageGenerator. Его цель состоит в том, чтобы предоставить коммунальные/кустарные методы путем реализации нашего интерфейса SoapClientInterface. Это в основном шаблон дизайна декоратора, так как класс имеет объект SoapClient в качестве статического свойства, чтобы иметь возможность применять методы. Это статическое свойство, чтобы иметь синглтон между несколькими вызовами (позволяя автоматически отправлять файлы cookie между вызовами). Его можно сбросить, передавая True в качестве второго параметра.
Допустим, у вас есть этот тип Generate ServiceType Class:
namespace Api ServiceType ;
use WsdlToPhp PackageBase AbstractSoapClientBase ;
class ApiUpdate extends AbstractSoapClientBase
{
public function UpdateBulkOrder ( Api StructType ApiUpdateBulkOrder $ parameters )
{
try {
$ this -> setResult ( $ this -> getSoapClient ()-> UpdateBulkOrder ( $ parameters ));
return $ this -> getResult ();
} catch ( SoapFault $ soapFault ) {
$ this -> saveLastError ( __METHOD__ , $ soapFault );
return false ;
}
}
}Вы можете сделать:
use WsdlToPhp PackageBase AbstractSoapClientBase ;
$ options = [
AbstractSoapClientBase:: WSDL_URL => ' __WSDL_URL__ ' ,
AbstractSoapClientBase:: WSDL_CLASSMAP => Api ApiClassMap:: classMap (),
];
// sets the first instance of SoapClient within AbstractSoapClientBase
$ update = new Api ServiceType ApiUpdate ( $ options );
// resets the SoapClient instance
$ update = new Api ServiceType ApiUpdate ( $ options , true );Затем вызовите любой из этих базовых методов:
DOMDocument resectDOMDocument$this->saveLastError(__METHOD__, $soapFault) вызываетсяSoapFault $ result = $ update -> UpdateBulkOrder ( new Api StructType ApiUpdateBulkOrder ())
if ( $ result !== false ) {
echo "n This is the result as an object: " . print_r ( $ update -> getResult (), true );
// Actually $result is the same data than $update->getResult()
} else {
echo "n This is the XML request: " . $ update -> getLastRequest ( false );
echo "n These are the request's headers: " . $ update -> getLastRequestHeaders ( false );
echo "n This is the XML response: " . $ update -> getLastResponse ( false );
echo "n These are the response's headers: " . $ update -> getLastResponseHeaders ( false );
echo "n These are the last errors: " . print_r ( $ update -> getLastError (), true );
echo "n This is the current error: " . print_r ( $ update -> getLastErrorForMethod ( ' ApiServiceTypeApiUpdate::UpdateBulkOrder ' ), true );
}У вас есть дополнительные методы, такие как:
// A sample of its usage in the generated ServiceType class
public function setSoapHeaderCSPCHD ( Api StructType ApiCSPCHD $ cSPCHD , $ nameSpace = ' http://tempuri.org ' , $ mustUnderstand = false , $ actor = null )
{
return $ this -> setSoapHeader ( $ nameSpace , ' CSPCHD ' , $ cSPCHD , $ mustUnderstand , $ actor );
}Не стесняйтесь сделать несколько запросов на тягу. Мы изучим их и сообщим вам, когда это может быть интегрировано.
Вы можете запустить модульные тесты со следующей командой:
$ cd /path/to/src/WsdlToPhp/PackageBase/
$ composer install
$ composer test
Благодаря изображению Docker Phpfarm, тесты могут выполняться локально под любой версией PHP, используя CLI:
Прежде всего, вам нужно создать свой контейнер, который вы можете сделать, используя Docker-Compose, выполнив приведенную ниже командную строку из корневого каталога проекта:
$ docker-compose up -d --build Затем у вас есть контейнер с именем package_base , в котором вы можете запускать команды composer и команды php cli , такие как:
# install deps in container (using update ensure it does use the composer.lock file if there is any)
$ docker exec -it package_base php-7.4 /usr/bin/composer update
# run tests in container
$ docker exec -it package_base php-7.4 -dmemory_limit=-1 vendor/bin/phpunitЕсли у вас есть вопрос, не стесняйтесь создавать проблему.
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.