diff --git a/bin/configs/php-psr-18.yaml b/bin/configs/php-psr-18.yaml
new file mode 100644
index 0000000000..0b9b7b0f54
--- /dev/null
+++ b/bin/configs/php-psr-18.yaml
@@ -0,0 +1,12 @@
+generatorName: php
+outputDir: samples/client/petstore/php/psr-18
+inputSpec: modules/openapi-generator/src/test/resources/3_0/php/petstore-with-fake-endpoints-models-for-testing.yaml
+templateDir: modules/openapi-generator/src/main/resources/php
+library: psr-18
+nameMappings:
+ _type: underscore_type
+ type_: type_with_underscore
+ type-: type_with_dash
+parameterNameMappings:
+ _type: underscore_type
+ type_: type_with_underscore
diff --git a/docs/generators/php.md b/docs/generators/php.md
index da5d62a51f..a1e5e67773 100644
--- a/docs/generators/php.md
+++ b/docs/generators/php.md
@@ -31,6 +31,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|hideGenerationTimestamp|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |true|
|invokerPackage|The main namespace to use for all classes. e.g. Yay\Pets| |null|
|legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C# have this enabled by default).|
- **true**
- The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document.
- **false**
- The mapping in the discriminator includes any descendent schemas that allOf inherit from self, any oneOf schemas, any anyOf schemas, any x-discriminator-values, and the discriminator mapping schemas in the OAS document AND Codegen validates that oneOf and anyOf schemas contain the required discriminator and throws an error if the discriminator is missing.
|true|
+|library|HTTP library template (sub-template) to use|- **guzzle**
- Guzzle
- **psr-18**
- psr/http-client-implementation, also known as PSR-18. (beta support)
|guzzle|
|licenseName|The name of the license| |null|
|modelPackage|package for generated models| |null|
|packageName|The main package name for classes. e.g. GeneratedPetstore| |null|
diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpClientCodegen.java
index afeb638fa8..f286ebe513 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PhpClientCodegen.java
@@ -35,6 +35,8 @@ import java.util.List;
public class PhpClientCodegen extends AbstractPhpCodegen {
@SuppressWarnings("hiding")
private final Logger LOGGER = LoggerFactory.getLogger(PhpClientCodegen.class);
+ public static final String GUZZLE = "guzzle";
+ public static final String PSR18 = "psr-18";
public PhpClientCodegen() {
super();
@@ -82,6 +84,15 @@ public class PhpClientCodegen extends AbstractPhpCodegen {
cliOptions.add(new CliOption(CodegenConstants.HIDE_GENERATION_TIMESTAMP, CodegenConstants.ALLOW_UNICODE_IDENTIFIERS_DESC)
.defaultValue(Boolean.TRUE.toString()));
+
+ supportedLibraries.put(GUZZLE, "Guzzle");
+ supportedLibraries.put(PSR18, "psr/http-client-implementation, also known as PSR-18. (beta support)");
+ CliOption libraryOption = new CliOption(CodegenConstants.LIBRARY, "HTTP library template (sub-template) to use");
+ libraryOption.setEnum(supportedLibraries);
+ // set GUZZLE as the default
+ libraryOption.setDefault(GUZZLE);
+ cliOptions.add(libraryOption);
+ setLibrary(GUZZLE);
}
@Override
@@ -114,5 +125,14 @@ public class PhpClientCodegen extends AbstractPhpCodegen {
supportingFiles.add(new SupportingFile(".travis.yml", "", ".travis.yml"));
supportingFiles.add(new SupportingFile(".php-cs-fixer.dist.php", "", ".php-cs-fixer.dist.php"));
supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
+
+ if (additionalProperties.containsKey(CodegenConstants.LIBRARY)) {
+ this.setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY));
+ }
+
+ if (PSR18.equals(getLibrary())) {
+ supportingFiles.add(new SupportingFile("DebugPlugin.mustache", toSrcPath(invokerPackage, srcBasePath), "DebugPlugin.php"));
+ }
+
}
}
diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/ApiException.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/ApiException.mustache
new file mode 100644
index 0000000000..5a96f2f6f5
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/ApiException.mustache
@@ -0,0 +1,113 @@
+partial_header}}
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace {{invokerPackage}};
+
+use Exception;
+use Http\Client\Exception\RequestException;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * ApiException Class Doc Comment
+ *
+ * @category Class
+ * @package {{invokerPackage}}
+ * @author OpenAPI Generator team
+ * @link https://openapi-generator.tech
+ */
+class ApiException extends RequestException
+{
+
+ /**
+ * The HTTP body of the server response either as Json or string.
+ *
+ * @var string|null
+ */
+ protected $responseBody;
+
+ /**
+ * The HTTP header of the server response.
+ *
+ * @var string[]|null
+ */
+ protected $responseHeaders;
+
+ /**
+ * The deserialized response object
+ *
+ * @var \stdClass|string|null
+ */
+ protected $responseObject;
+
+ public function __construct(
+ $message,
+ RequestInterface $request,
+ ResponseInterface $response = null,
+ Exception $previous = null
+ ) {
+ parent::__construct($message, $request, $previous);
+ if ($response) {
+ $this->responseHeaders = $response->getHeaders();
+ $this->responseBody = (string) $response->getBody();
+ $this->code = $response->getStatusCode();
+ }
+ }
+
+ /**
+ * Gets the HTTP response header
+ *
+ * @return string[]|null HTTP response header
+ */
+ public function getResponseHeaders()
+ {
+ return $this->responseHeaders;
+ }
+
+ /**
+ * Gets the HTTP body of the server response either as Json or string
+ *
+ * @return \stdClass|string|null HTTP body of the server response either as \stdClass or string
+ */
+ public function getResponseBody()
+ {
+ return $this->responseBody;
+ }
+
+ /**
+ * Sets the deseralized response object (during deserialization)
+ *
+ * @param mixed $obj Deserialized response object
+ *
+ * @return void
+ */
+ public function setResponseObject($obj)
+ {
+ $this->responseObject = $obj;
+ }
+
+ /**
+ * Gets the deseralized response object (during deserialization)
+ *
+ * @return mixed the deserialized response object
+ */
+ public function getResponseObject()
+ {
+ return $this->responseObject;
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/DebugPlugin.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/DebugPlugin.mustache
new file mode 100644
index 0000000000..cf256a1304
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/DebugPlugin.mustache
@@ -0,0 +1,92 @@
+partial_header}}
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace {{invokerPackage}};
+
+use Http\Client\Common\Plugin;
+use Http\Promise\Promise;
+use Psr\Http\Client\ClientExceptionInterface;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\ResponseInterface;
+use function is_resource;
+
+/**
+ * Configuration Class Doc Comment
+ * PHP version 7.2
+ *
+ * @category Class
+ * @package {{invokerPackage}}
+ * @author OpenAPI Generator team
+ * @link https://openapi-generator.tech
+ */
+class DebugPlugin implements Plugin
+{
+
+ /**
+ * @var resource
+ */
+ private $output;
+
+ /**
+ * DebuggingPlugin constructor.
+ *
+ * @param resource $output
+ */
+ public function __construct($output)
+ {
+ if (!is_resource($output)) {
+ throw new \InvalidArgumentException('debugging resource is not valid');
+ }
+ $this->output = $output;
+ }
+
+ public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
+ {
+ return $next($request)->then(
+ function (ResponseInterface $response) use ($request) {
+ $this->logSuccess($request, $response);
+
+ return $response;
+ },
+ function (ClientExceptionInterface $exception) use ($request) {
+ $this->logError($request, $exception);
+
+ throw $exception;
+ }
+ );
+ }
+
+ private function logSuccess(RequestInterface $request, ResponseInterface $response): void
+ {
+ $methodAndPath = $request->getMethod() . ' ' . $request->getUri()->getPath();
+ $protocol = $response->getProtocolVersion();
+ $responseCode = $response->getStatusCode();
+ \fprintf($this->output, '<%s HTTP/%s> %s', $methodAndPath, $protocol, $responseCode);
+ \fwrite($this->output, "\n");
+ }
+
+ private function logError(RequestInterface $request, ClientExceptionInterface $exception): void
+ {
+ $methodAndPath = $request->getMethod() . ' ' . $request->getUri()->getPath();
+ $protocol = $request->getProtocolVersion();
+ $error = $exception->getMessage();
+ $responseCode = $exception->getCode();
+ \fprintf($this->output, '<%s HTTP/%s> %s %s', $methodAndPath, $responseCode, $error, $protocol);
+ \fwrite($this->output, "\n");
+ }
+}
\ No newline at end of file
diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/README.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/README.mustache
new file mode 100644
index 0000000000..1d93323759
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/README.mustache
@@ -0,0 +1,159 @@
+# {{packageName}}
+
+{{#appDescriptionWithNewLines}}
+{{{appDescriptionWithNewLines}}}
+{{/appDescriptionWithNewLines}}
+
+{{#infoUrl}}
+For more information, please visit [{{{infoUrl}}}]({{{infoUrl}}}).
+{{/infoUrl}}
+
+## Installation & Usage
+
+### Requirements
+
+PHP 7.2 and later.
+
+### Composer
+
+To install the bindings via [Composer](https://getcomposer.org/), add the following to `composer.json`:
+
+```json
+{
+ "repositories": [
+ {
+ "type": "vcs",
+ "url": "https://{{gitHost}}/{{gitUserId}}/{{gitRepoId}}.git"
+ }
+ ],
+ "require": {
+ "{{gitUserId}}/{{gitRepoId}}": "*@dev"
+ }
+}
+```
+
+Then run `composer install`
+
+Your project is free to choose the http client of your choice
+Please require packages that will provide http client functionality:
+https://packagist.org/providers/psr/http-client-implementation
+https://packagist.org/providers/php-http/async-client-implementation
+https://packagist.org/providers/psr/http-factory-implementation
+
+As an example:
+
+```
+composer require guzzlehttp/guzzle php-http/guzzle7-adapter http-interop/http-factory-guzzle
+```
+
+### Manual Installation
+
+Download the files and include `autoload.php`:
+
+```php
+ php_doc_auth_partial}}
+$apiInstance = new {{invokerPackage}}\Api\{{classname}}(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(){{#hasAuthMethods}},
+ $config{{/hasAuthMethods}}
+);
+{{#allParams}}${{paramName}} = {{{example}}}; // {{{dataType}}}{{#description}} | {{{description}}}{{/description}}
+{{/allParams}}
+
+try {
+ {{#returnType}}$result = {{/returnType}}$apiInstance->{{{operationId}}}({{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}});{{#returnType}}
+ print_r($result);{{/returnType}}
+} catch (Exception $e) {
+ echo 'Exception when calling {{classname}}->{{operationId}}: ', $e->getMessage(), PHP_EOL;
+}
+{{/-first}}{{/operation}}{{/operations}}{{/-first}}{{/apis}}{{/apiInfo}}
+```
+
+## API Endpoints
+
+All URIs are relative to *{{basePath}}*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}*{{classname}}* | [**{{operationId}}**]({{apiDocPath}}/{{classname}}.md#{{operationIdLowerCase}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{summary}}{{/summary}}
+{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
+## Models
+
+{{#models}}{{#model}}- [{{{classname}}}]({{modelDocPath}}/{{{classname}}}.md){{/model}}
+{{/models}}
+
+## Authorization
+{{^authMethods}}
+All endpoints do not require authorization.
+{{/authMethods}}
+{{#authMethods}}
+{{#last}} Authentication schemes defined for the API:{{/last}}
+### {{{name}}}
+{{#isApiKey}}
+
+- **Type**: API key
+- **API key parameter name**: {{{keyParamName}}}
+- **Location**: {{#isKeyInQuery}}URL query string{{/isKeyInQuery}}{{#isKeyInHeader}}HTTP header{{/isKeyInHeader}}
+
+{{/isApiKey}}
+{{#isBasic}}
+{{#isBasicBasic}}
+
+- **Type**: HTTP basic authentication
+{{/isBasicBasic}}
+{{#isBasicBearer}}
+
+- **Type**: Bearer authentication{{#bearerFormat}} ({{{.}}}){{/bearerFormat}}
+{{/isBasicBearer}}
+{{/isBasic}}
+{{#isOAuth}}
+
+- **Type**: `OAuth`
+- **Flow**: `{{{flow}}}`
+- **Authorization URL**: `{{{authorizationUrl}}}`
+- **Scopes**: {{^scopes}}N/A{{/scopes}}
+{{#scopes}}
+ - **{{{scope}}}**: {{{description}}}
+{{/scopes}}
+{{/isOAuth}}
+
+{{/authMethods}}
+## Tests
+
+To run the tests, use:
+
+```bash
+composer install
+vendor/bin/phpunit
+```
+
+## Author
+
+{{#apiInfo}}{{#apis}}{{#-last}}{{infoEmail}}
+{{/-last}}{{/apis}}{{/apiInfo}}
+## About this package
+
+This PHP package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: `{{appVersion}}`
+{{#artifactVersion}}
+ - Package version: `{{artifactVersion}}`
+{{/artifactVersion}}
+{{^hideGenerationTimestamp}}
+ - Build date: `{{generatedDate}}`
+{{/hideGenerationTimestamp}}
+- Build package: `{{generatorClass}}`
diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache
new file mode 100644
index 0000000000..57f852ee12
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api.mustache
@@ -0,0 +1,779 @@
+partial_header}}
+/**
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+namespace {{apiPackage}};
+
+use GuzzleHttp\Psr7\MultipartStream;
+use GuzzleHttp\Psr7\Query;
+use Http\Client\Common\Plugin\ErrorPlugin;
+use Http\Client\Common\Plugin\RedirectPlugin;
+use Http\Client\Common\PluginClient;
+use Http\Client\Common\PluginClientFactory;
+use Http\Client\Exception\HttpException;
+use Http\Client\HttpAsyncClient;
+use Http\Discovery\HttpAsyncClientDiscovery;
+use Http\Discovery\Psr17FactoryDiscovery;
+use Http\Discovery\Psr18ClientDiscovery;
+use Http\Message\RequestFactory;
+use Http\Promise\Promise;
+use {{invokerPackage}}\ApiException;
+use {{invokerPackage}}\Configuration;
+use {{invokerPackage}}\DebugPlugin;
+use {{invokerPackage}}\HeaderSelector;
+use {{invokerPackage}}\ObjectSerializer;
+use Psr\Http\Client\ClientExceptionInterface;
+use Psr\Http\Client\ClientInterface;
+use Psr\Http\Message\RequestFactoryInterface;
+use Psr\Http\Message\RequestInterface;
+use Psr\Http\Message\StreamFactoryInterface;
+use Psr\Http\Message\UriFactoryInterface;
+use Psr\Http\Message\UriInterface;
+use function sprintf;
+
+/**
+ * {{classname}} Class Doc Comment
+ *
+ * @category Class
+ * @package {{invokerPackage}}
+ * @author OpenAPI Generator team
+ * @link https://openapi-generator.tech
+ */
+{{#operations}}class {{classname}}
+{
+ /**
+ * @var PluginClient
+ */
+ protected $httpClient;
+
+ /**
+ * @var PluginClient
+ */
+ protected $httpAsyncClient;
+
+ /**
+ * @var UriFactoryInterface
+ */
+ protected $uriFactory;
+
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @var HeaderSelector
+ */
+ protected $headerSelector;
+
+ /**
+ * @var int Host index
+ */
+ protected $hostIndex;
+
+ /**
+ * @var RequestFactoryInterface
+ */
+ protected $requestFactory;
+
+ /**
+ * @var StreamFactoryInterface
+ */
+ protected $streamFactory;
+
+ public function __construct(
+ ClientInterface $httpClient = null,
+ Configuration $config = null,
+ HttpAsyncClient $httpAsyncClient = null,
+ UriFactoryInterface $uriFactory = null,
+ RequestFactoryInterface $requestFactory = null,
+ StreamFactoryInterface $streamFactory = null,
+ HeaderSelector $selector = null,
+ ?array $plugins = null,
+ $hostIndex = 0
+ ) {
+ $this->config = $config ?? (new Configuration())->setHost('{{basePath}}');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+{{#operation}}
+ /**
+ * Operation {{{operationId}}}
+{{#summary}}
+ *
+ * {{.}}
+{{/summary}}
+ *
+{{#description}}
+ * {{.}}
+ *
+{{/description}}
+{{#vendorExtensions.x-group-parameters}}
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+{{/vendorExtensions.x-group-parameters}}
+{{#servers}}
+{{#-first}}
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+{{/-first}}
+ * URL: {{{url}}}
+{{#-last}}
+ *
+{{/-last}}
+{{/servers}}
+{{#allParams}}
+ * @param {{{dataType}}} ${{paramName}}{{#description}} {{description}}{{/description}}{{^description}} {{paramName}}{{/description}} {{#required}}(required){{/required}}{{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
+{{/allParams}}
+ *
+ * @throws \{{invokerPackage}}\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return {{#returnType}}{{#responses}}{{#dataType}}{{^-first}}|{{/-first}}{{/dataType}}{{{dataType}}}{{/responses}}{{/returnType}}{{^returnType}}void{{/returnType}}
+ */
+ public function {{operationId}}({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}})
+ {
+ {{#returnType}}list($response) = {{/returnType}}$this->{{operationId}}WithHttpInfo({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}});{{#returnType}}
+ return $response;{{/returnType}}
+ }
+
+ /**
+ * Operation {{{operationId}}}WithHttpInfo
+{{#summary}}
+ *
+ * {{.}}
+{{/summary}}
+ *
+{{#description}}
+ * {{.}}
+ *
+{{/description}}
+{{#vendorExtensions.x-group-parameters}}
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+{{/vendorExtensions.x-group-parameters}}
+{{#servers}}
+{{#-first}}
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+{{/-first}}
+ * URL: {{{url}}}
+{{#-last}}
+ *
+{{/-last}}
+{{/servers}}
+{{#allParams}}
+ * @param {{{dataType}}} ${{paramName}}{{#description}} {{description}}{{/description}} {{#required}}(required){{/required}}{{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
+{{/allParams}}
+ *
+ * @throws \{{invokerPackage}}\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of {{#returnType}}{{#responses}}{{#dataType}}{{^-first}}|{{/-first}}{{/dataType}}{{{dataType}}}{{/responses}}{{/returnType}}{{^returnType}}null{{/returnType}}, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function {{operationId}}WithHttpInfo({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}})
+ {
+ $request = $this->{{operationId}}Request({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}});
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+ {{#returnType}}
+ {{#responses}}
+ {{#-first}}
+
+ switch($statusCode) {
+ {{/-first}}
+ {{#dataType}}
+ {{^isWildcard}}case {{code}}:{{/isWildcard}}{{#isWildcard}}default:{{/isWildcard}}
+ if ('{{{dataType}}}' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '{{{dataType}}}', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ {{/dataType}}
+ {{#-last}}
+ }
+ {{/-last}}
+ {{/responses}}
+
+ $returnType = '{{{returnType}}}';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ {{/returnType}}
+ {{^returnType}}
+
+ return [null, $statusCode, $response->getHeaders()];
+ {{/returnType}}
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ {{#responses}}
+ {{#dataType}}
+ {{^isWildcard}}case {{code}}:{{/isWildcard}}{{#isWildcard}}default:{{/isWildcard}}
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '{{{dataType}}}',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ {{/dataType}}
+ {{/responses}}
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation {{{operationId}}}Async
+ *
+{{#summary}}
+ * {{.}}
+ *
+{{/summary}}
+{{#description}}
+ * {{.}}
+ *
+{{/description}}
+{{#vendorExtensions.x-group-parameters}}
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+{{/vendorExtensions.x-group-parameters}}
+{{#servers}}
+{{#-first}}
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+{{/-first}}
+ * URL: {{{url}}}
+{{#-last}}
+ *
+{{/-last}}
+{{/servers}}
+{{#allParams}}
+ * @param {{{dataType}}} ${{paramName}}{{#description}} {{description}}{{/description}} {{#required}}(required){{/required}}{{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
+{{/allParams}}
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function {{operationId}}Async({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}})
+ {
+ return $this->{{operationId}}AsyncWithHttpInfo({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}})
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation {{{operationId}}}AsyncWithHttpInfo
+ *
+{{#summary}}
+ * {{.}}
+ *
+{{/summary}}
+{{#description}}
+ * {{.}}
+ *
+{{/description}}
+{{#vendorExtensions.x-group-parameters}}
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+{{/vendorExtensions.x-group-parameters}}
+{{#servers}}
+{{#-first}}
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+{{/-first}}
+ * URL: {{{url}}}
+{{#-last}}
+ *
+{{/-last}}
+{{/servers}}
+{{#allParams}}
+ * @param {{{dataType}}} ${{paramName}}{{#description}} {{description}}{{/description}} {{#required}}(required){{/required}}{{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
+{{/allParams}}
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function {{operationId}}AsyncWithHttpInfo({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}})
+ {
+ $returnType = '{{{returnType}}}';
+ $request = $this->{{operationId}}Request({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}});
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ {{#returnType}}
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ {{/returnType}}
+ {{^returnType}}
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ {{/returnType}}
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation '{{{operationId}}}'
+ *
+{{#vendorExtensions.x-group-parameters}}
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+{{/vendorExtensions.x-group-parameters}}
+{{#servers}}
+{{#-first}}
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+{{/-first}}
+ * URL: {{{url}}}
+{{#-last}}
+ *
+{{/-last}}
+{{/servers}}
+{{#allParams}}
+ * @param {{{dataType}}} ${{paramName}}{{#description}} {{description}}{{/description}} {{#required}}(required){{/required}}{{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
+{{/allParams}}
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function {{operationId}}Request({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^required}} = {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associative_array{{/vendorExtensions.x-group-parameters}})
+ {
+ {{#vendorExtensions.x-group-parameters}}
+ // unbox the parameters from the associative array
+ {{#allParams}}
+ ${{paramName}} = array_key_exists('{{paramName}}', $associative_array) ? $associative_array['{{paramName}}'] : {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}};
+ {{/allParams}}
+
+ {{/vendorExtensions.x-group-parameters}}
+ {{#allParams}}
+ {{#required}}
+ // verify the required parameter '{{paramName}}' is set
+ if (${{paramName}} === null || (is_array(${{paramName}}) && count(${{paramName}}) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter ${{paramName}} when calling {{operationId}}'
+ );
+ }
+ {{/required}}
+ {{#hasValidation}}
+ {{#maxLength}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}strlen(${{paramName}}) > {{maxLength}}) {
+ throw new \InvalidArgumentException('invalid length for "${{paramName}}" when calling {{classname}}.{{operationId}}, must be smaller than or equal to {{maxLength}}.');
+ }
+ {{/maxLength}}
+ {{#minLength}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}strlen(${{paramName}}) < {{minLength}}) {
+ throw new \InvalidArgumentException('invalid length for "${{paramName}}" when calling {{classname}}.{{operationId}}, must be bigger than or equal to {{minLength}}.');
+ }
+ {{/minLength}}
+ {{#maximum}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}${{paramName}} >{{#exclusiveMaximum}}={{/exclusiveMaximum}} {{maximum}}) {
+ throw new \InvalidArgumentException('invalid value for "${{paramName}}" when calling {{classname}}.{{operationId}}, must be smaller than {{^exclusiveMaximum}}or equal to {{/exclusiveMaximum}}{{maximum}}.');
+ }
+ {{/maximum}}
+ {{#minimum}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}${{paramName}} <{{#exclusiveMinimum}}={{/exclusiveMinimum}} {{minimum}}) {
+ throw new \InvalidArgumentException('invalid value for "${{paramName}}" when calling {{classname}}.{{operationId}}, must be bigger than {{^exclusiveMinimum}}or equal to {{/exclusiveMinimum}}{{minimum}}.');
+ }
+ {{/minimum}}
+ {{#pattern}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}!preg_match("{{{pattern}}}", ${{paramName}})) {
+ throw new \InvalidArgumentException("invalid value for \"{{paramName}}\" when calling {{classname}}.{{operationId}}, must conform to the pattern {{{pattern}}}.");
+ }
+ {{/pattern}}
+ {{#maxItems}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}count(${{paramName}}) > {{maxItems}}) {
+ throw new \InvalidArgumentException('invalid value for "${{paramName}}" when calling {{classname}}.{{operationId}}, number of items must be less than or equal to {{maxItems}}.');
+ }
+ {{/maxItems}}
+ {{#minItems}}
+ if ({{^required}}${{paramName}} !== null && {{/required}}count(${{paramName}}) < {{minItems}}) {
+ throw new \InvalidArgumentException('invalid value for "${{paramName}}" when calling {{classname}}.{{operationId}}, number of items must be greater than or equal to {{minItems}}.');
+ }
+ {{/minItems}}
+
+ {{/hasValidation}}
+ {{/allParams}}
+
+ $resourcePath = '{{{path}}}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ {{#queryParams}}
+ // query params
+ {{#isExplode}}
+ if (${{paramName}} !== null) {
+ {{#style}}
+ if('form' === '{{style}}' && is_array(${{paramName}})) {
+ foreach(${{paramName}} as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['{{baseName}}'] = ${{paramName}};
+ }
+ {{/style}}
+ {{^style}}
+ $queryParams['{{baseName}}'] = ${{paramName}};
+ {{/style}}
+ }
+ {{/isExplode}}
+ {{^isExplode}}
+ if (is_array(${{paramName}})) {
+ ${{paramName}} = ObjectSerializer::serializeCollection(${{paramName}}, '{{#style}}{{style}}{{/style}}{{^style}}{{#collectionFormat}}{{collectionFormat}}{{/collectionFormat}}{{/style}}', true);
+ }
+ if (${{paramName}} !== null) {
+ $queryParams['{{baseName}}'] = ${{paramName}};
+ }
+ {{/isExplode}}
+ {{/queryParams}}
+
+ {{#headerParams}}
+ // header params
+ {{#collectionFormat}}
+ if (is_array(${{paramName}})) {
+ ${{paramName}} = ObjectSerializer::serializeCollection(${{paramName}}, '{{collectionFormat}}');
+ }
+ {{/collectionFormat}}
+ if (${{paramName}} !== null) {
+ $headerParams['{{baseName}}'] = ObjectSerializer::toHeaderValue(${{paramName}});
+ }
+ {{/headerParams}}
+
+ {{#pathParams}}
+ // path params
+ {{#collectionFormat}}
+ if (is_array(${{paramName}})) {
+ ${{paramName}} = ObjectSerializer::serializeCollection(${{paramName}}, '{{collectionFormat}}');
+ }
+ {{/collectionFormat}}
+ if (${{paramName}} !== null) {
+ $resourcePath = str_replace(
+ '{' . '{{baseName}}' . '}',
+ ObjectSerializer::toPathValue(${{paramName}}),
+ $resourcePath
+ );
+ }
+ {{/pathParams}}
+
+ {{#formParams}}
+ // form params
+ if (${{paramName}} !== null) {
+ {{#isFile}}
+ $multipart = true;
+ $formParams['{{baseName}}'] = [];
+ $paramFiles = is_array(${{paramName}}) ? ${{paramName}} : [${{paramName}}];
+ foreach ($paramFiles as $paramFile) {
+ $formParams['{{baseName}}'][] = \GuzzleHttp\Psr7\try_fopen(
+ ObjectSerializer::toFormValue($paramFile),
+ 'rb'
+ );
+ }
+ {{/isFile}}
+ {{^isFile}}
+ $formParams['{{baseName}}'] = ObjectSerializer::toFormValue(${{paramName}});
+ {{/isFile}}
+ }
+ {{/formParams}}
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ [{{#produces}}'{{{mediaType}}}'{{^-last}}, {{/-last}}{{/produces}}]
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [{{#produces}}'{{{mediaType}}}'{{^-last}}, {{/-last}}{{/produces}}],
+ [{{#consumes}}'{{{mediaType}}}'{{^-last}}, {{/-last}}{{/consumes}}]
+ );
+ }
+
+ // for model (json/xml)
+ {{#bodyParams}}
+ if (isset(${{paramName}})) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization(${{paramName}}));
+ } else {
+ $httpBody = ${{paramName}};
+ }
+ } elseif (count($formParams) > 0) {
+ {{/bodyParams}}
+ {{^bodyParams}}
+ if (count($formParams) > 0) {
+ {{/bodyParams}}
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ {{#authMethods}}
+ {{#isApiKey}}
+ // this endpoint requires API key authentication
+ $apiKey = $this->config->getApiKeyWithPrefix('{{keyParamName}}');
+ if ($apiKey !== null) {
+ {{#isKeyInHeader}}$headers['{{keyParamName}}'] = $apiKey;{{/isKeyInHeader}}{{#isKeyInQuery}}$queryParams['{{keyParamName}}'] = $apiKey;{{/isKeyInQuery}}
+ }
+ {{/isApiKey}}
+ {{#isBasic}}
+ {{#isBasicBasic}}
+ // this endpoint requires HTTP basic authentication
+ if (!empty($this->config->getUsername()) || !(empty($this->config->getPassword()))) {
+ $headers['Authorization'] = 'Basic ' . base64_encode($this->config->getUsername() . ":" . $this->config->getPassword());
+ }
+ {{/isBasicBasic}}
+ {{#isBasicBearer}}
+ // this endpoint requires Bearer{{#bearerFormat}} ({{{.}}}){{/bearerFormat}} authentication (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+ {{/isBasicBearer}}
+ {{/isBasic}}
+ {{#isOAuth}}
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+ {{/isOAuth}}
+ {{/authMethods}}
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ {{^servers.0}}
+ $operationHost = $this->config->getHost();
+ {{/servers.0}}
+ {{#servers.0}}
+ $operationHosts = [{{#servers}}"{{{url}}}"{{^-last}}, {{/-last}}{{/servers}}];
+ if ($this->hostIndex < 0 || $this->hostIndex >= sizeof($operationHosts)) {
+ throw new \InvalidArgumentException("Invalid index {$this->hostIndex} when selecting the host. Must be less than ".sizeof($operationHosts));
+ }
+ $operationHost = $operationHosts[$this->hostIndex];
+ {{/servers.0}}
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('{{httpMethod}}', $uri, $headers, $httpBody);
+ }
+
+ {{/operation}}
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
+{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api_doc.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api_doc.mustache
new file mode 100644
index 0000000000..3a794f7e5b
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/api_doc.mustache
@@ -0,0 +1,78 @@
+# {{invokerPackage}}\{{classname}}{{#description}}
+
+{{description}}{{/description}}
+
+All URIs are relative to {{basePath}}.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+{{#operations}}{{#operation}}[**{{operationId}}()**]({{classname}}.md#{{operationId}}) | **{{httpMethod}}** {{path}} | {{#summary}}{{summary}}{{/summary}}
+{{/operation}}{{/operations}}{{#operations}}{{#operation}}
+
+## `{{{operationId}}}()`
+
+```php
+{{{operationId}}}({{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}}){{#returnType}}: {{{returnType}}}{{/returnType}}
+```
+
+{{{summary}}}{{#notes}}
+
+{{{notes}}}{{/notes}}
+
+### Example
+
+```php
+ php_doc_auth_partial}}
+$apiInstance = new {{invokerPackage}}\Api\{{classname}}(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(){{#hasAuthMethods}},
+ $config{{/hasAuthMethods}}
+);
+{{^vendorExtensions.x-group-parameters}}
+{{#allParams}}${{paramName}} = {{{example}}}; // {{{dataType}}}{{#description}} | {{{description}}}{{/description}}
+{{/allParams}}
+{{/vendorExtensions.x-group-parameters}}
+{{#vendorExtensions.x-group-parameters}}
+{{#allParams}}$associate_array['{{paramName}}'] = {{{example}}}; // {{{dataType}}}{{#description}} | {{{description}}}{{/description}}
+{{/allParams}}
+{{/vendorExtensions.x-group-parameters}}
+
+try {
+ {{#returnType}}$result = {{/returnType}}$apiInstance->{{{operationId}}}({{^vendorExtensions.x-group-parameters}}{{#allParams}}${{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{/vendorExtensions.x-group-parameters}}{{#vendorExtensions.x-group-parameters}}$associate_array{{/vendorExtensions.x-group-parameters}});{{#returnType}}
+ print_r($result);{{/returnType}}
+} catch (Exception $e) {
+ echo 'Exception when calling {{classname}}->{{operationId}}: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+{{#vendorExtensions.x-group-parameters}}
+Note: the input parameter is an associative array with the keys listed as the parameter name below.
+
+{{/vendorExtensions.x-group-parameters}}
+{{^allParams}}This endpoint does not need any parameter.{{/allParams}}{{#allParams}}{{#-last}}Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------{{/-last}}{{/allParams}}
+{{#allParams}} **{{paramName}}** | {{#isFile}}**{{{dataType}}}**{{/isFile}}{{#isPrimitiveType}}**{{{dataType}}}**{{/isPrimitiveType}}{{^isPrimitiveType}}{{^isFile}}[**{{{dataType}}}**](../Model/{{baseType}}.md){{/isFile}}{{/isPrimitiveType}}| {{description}} |{{^required}} [optional]{{/required}}{{#defaultValue}} [default to {{defaultValue}}]{{/defaultValue}}
+{{/allParams}}
+
+### Return type
+
+{{#returnType}}{{#returnTypeIsPrimitive}}**{{{returnType}}}**{{/returnTypeIsPrimitive}}{{^returnTypeIsPrimitive}}[**{{{returnType}}}**](../Model/{{returnBaseType}}.md){{/returnTypeIsPrimitive}}{{/returnType}}{{^returnType}}void (empty response body){{/returnType}}
+
+### Authorization
+
+{{^authMethods}}No authorization required{{/authMethods}}{{#authMethods}}[{{{name}}}](../../README.md#{{{name}}}){{^-last}}, {{/-last}}{{/authMethods}}
+
+### HTTP request headers
+
+- **Content-Type**: {{#consumes}}`{{{mediaType}}}`{{^-last}}, {{/-last}}{{/consumes}}{{^consumes}}Not defined{{/consumes}}
+- **Accept**: {{#produces}}`{{{mediaType}}}`{{^-last}}, {{/-last}}{{/produces}}{{^produces}}Not defined{{/produces}}
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md){{/operation}}{{/operations}}
diff --git a/modules/openapi-generator/src/main/resources/php/libraries/psr-18/composer.mustache b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/composer.mustache
new file mode 100644
index 0000000000..7ef3e16b0e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/php/libraries/psr-18/composer.mustache
@@ -0,0 +1,54 @@
+{
+ "name": "{{gitUserId}}/{{gitRepoId}}",
+ {{#artifactVersion}}
+ "version": "{{artifactVersion}}",
+ {{/artifactVersion}}
+ "description": "{{{appDescription}}}",
+ "keywords": [
+ "openapitools",
+ "openapi-generator",
+ "openapi",
+ "php",
+ "sdk",
+ "rest",
+ "api"
+ ],
+ "homepage": "https://openapi-generator.tech",
+ "license": "unlicense",
+ "authors": [
+ {
+ "name": "OpenAPI-Generator contributors",
+ "homepage": "https://openapi-generator.tech"
+ }
+ ],
+ "config": {
+ "sort-packages": true
+ },
+ "require": {
+ "php": ">=7.2",
+ "ext-curl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "guzzlehttp/psr7": "^1.8 || ^2.0",
+ "php-http/async-client-implementation": "^1.0",
+ "php-http/client-common": "^2.4",
+ "php-http/discovery": "^1.14",
+ "php-http/httplug": "^2.2",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-factory-implementation": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.0 || ^9.0",
+ "friendsofphp/php-cs-fixer": "^2.12",
+ "guzzlehttp/guzzle": "^7.0",
+ "php-http/guzzle7-adapter": "^1.0"
+ },
+ "autoload": {
+ "psr-4": { "{{escapedInvokerPackage}}\\" : "{{srcBasePath}}/" }
+ },
+ "autoload-dev": {
+ "psr-4": { "{{escapedInvokerPackage}}\\Test\\" : "{{testBasePath}}/" }
+ }
+}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpClientOptionsProvider.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpClientOptionsProvider.java
index 2ef78d7216..bf26ac750f 100644
--- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpClientOptionsProvider.java
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/options/PhpClientOptionsProvider.java
@@ -42,6 +42,7 @@ public class PhpClientOptionsProvider implements OptionsProvider {
public static final String ARTIFACTURL_VALUE = "https://anotherUrl.com";
public static final String DEVELOPER_ORGANIZATION_VALUE = "openapi generator contributors";
public static final String COMPOSER_PACKAGE_NAME_VALUE = "package/name";
+ public static final String LIBRARY_VALUE = "psr-18";
@Override
public String getLanguage() {
@@ -72,6 +73,7 @@ public class PhpClientOptionsProvider implements OptionsProvider {
.put(CodegenConstants.ARTIFACT_URL, ARTIFACTURL_VALUE)
.put(CodegenConstants.DEVELOPER_ORGANIZATION, DEVELOPER_ORGANIZATION_VALUE)
.put(CodegenConstants.COMPOSER_PACKAGE_NAME, COMPOSER_PACKAGE_NAME_VALUE)
+ .put(CodegenConstants.LIBRARY, LIBRARY_VALUE)
.build();
}
diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/PhpClientOptionsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/PhpClientOptionsTest.java
index 5a849757b5..b984010b8b 100644
--- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/PhpClientOptionsTest.java
+++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/PhpClientOptionsTest.java
@@ -21,7 +21,6 @@ import org.openapitools.codegen.AbstractOptionsTest;
import org.openapitools.codegen.CodegenConfig;
import org.openapitools.codegen.languages.PhpClientCodegen;
import org.openapitools.codegen.options.PhpClientOptionsProvider;
-import org.openapitools.codegen.options.PhpLumenServerOptionsProvider;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -54,5 +53,6 @@ public class PhpClientOptionsTest extends AbstractOptionsTest {
verify(clientCodegen).setDeveloperOrganizationUrl(PhpClientOptionsProvider.DEVELOPER_ORGANIZATION_URL_VALUE);
verify(clientCodegen).setArtifactUrl(PhpClientOptionsProvider.ARTIFACTURL_VALUE);
verify(clientCodegen).setDeveloperOrganization(PhpClientOptionsProvider.DEVELOPER_ORGANIZATION_VALUE);
+ verify(clientCodegen).setLibrary(PhpClientOptionsProvider.LIBRARY_VALUE);
}
}
diff --git a/samples/client/petstore/php/psr-18/.gitignore b/samples/client/petstore/php/psr-18/.gitignore
new file mode 100644
index 0000000000..9f1681c2be
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/.gitignore
@@ -0,0 +1,15 @@
+# ref: https://github.com/github/gitignore/blob/master/Composer.gitignore
+
+composer.phar
+/vendor/
+
+# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
+# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
+# composer.lock
+
+# php-cs-fixer cache
+.php_cs.cache
+.php-cs-fixer.cache
+
+# PHPUnit cache
+.phpunit.result.cache
diff --git a/samples/client/petstore/php/psr-18/.openapi-generator-ignore b/samples/client/petstore/php/psr-18/.openapi-generator-ignore
new file mode 100644
index 0000000000..7484ee590a
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/samples/client/petstore/php/psr-18/.openapi-generator/FILES b/samples/client/petstore/php/psr-18/.openapi-generator/FILES
new file mode 100644
index 0000000000..b702a79bd3
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/.openapi-generator/FILES
@@ -0,0 +1,123 @@
+.gitignore
+.php-cs-fixer.dist.php
+.travis.yml
+README.md
+composer.json
+docs/Api/AnotherFakeApi.md
+docs/Api/DefaultApi.md
+docs/Api/FakeApi.md
+docs/Api/FakeClassnameTags123Api.md
+docs/Api/PetApi.md
+docs/Api/StoreApi.md
+docs/Api/UserApi.md
+docs/Model/AdditionalPropertiesClass.md
+docs/Model/AllOfWithSingleRef.md
+docs/Model/Animal.md
+docs/Model/ApiResponse.md
+docs/Model/ArrayOfArrayOfNumberOnly.md
+docs/Model/ArrayOfNumberOnly.md
+docs/Model/ArrayTest.md
+docs/Model/Capitalization.md
+docs/Model/Cat.md
+docs/Model/Category.md
+docs/Model/ClassModel.md
+docs/Model/Client.md
+docs/Model/DeprecatedObject.md
+docs/Model/Dog.md
+docs/Model/EnumArrays.md
+docs/Model/EnumClass.md
+docs/Model/EnumTest.md
+docs/Model/FakeBigDecimalMap200Response.md
+docs/Model/File.md
+docs/Model/FileSchemaTestClass.md
+docs/Model/Foo.md
+docs/Model/FooGetDefaultResponse.md
+docs/Model/FormatTest.md
+docs/Model/HasOnlyReadOnly.md
+docs/Model/HealthCheckResult.md
+docs/Model/MapTest.md
+docs/Model/MixedPropertiesAndAdditionalPropertiesClass.md
+docs/Model/Model200Response.md
+docs/Model/ModelList.md
+docs/Model/ModelReturn.md
+docs/Model/Name.md
+docs/Model/NullableClass.md
+docs/Model/NumberOnly.md
+docs/Model/ObjectWithDeprecatedFields.md
+docs/Model/Order.md
+docs/Model/OuterComposite.md
+docs/Model/OuterEnum.md
+docs/Model/OuterEnumDefaultValue.md
+docs/Model/OuterEnumInteger.md
+docs/Model/OuterEnumIntegerDefaultValue.md
+docs/Model/OuterObjectWithEnumProperty.md
+docs/Model/Pet.md
+docs/Model/PropertyNameMapping.md
+docs/Model/ReadOnlyFirst.md
+docs/Model/SingleRefType.md
+docs/Model/SpecialModelName.md
+docs/Model/Tag.md
+docs/Model/User.md
+git_push.sh
+lib/Api/AnotherFakeApi.php
+lib/Api/DefaultApi.php
+lib/Api/FakeApi.php
+lib/Api/FakeClassnameTags123Api.php
+lib/Api/PetApi.php
+lib/Api/StoreApi.php
+lib/Api/UserApi.php
+lib/ApiException.php
+lib/Configuration.php
+lib/DebugPlugin.php
+lib/HeaderSelector.php
+lib/Model/AdditionalPropertiesClass.php
+lib/Model/AllOfWithSingleRef.php
+lib/Model/Animal.php
+lib/Model/ApiResponse.php
+lib/Model/ArrayOfArrayOfNumberOnly.php
+lib/Model/ArrayOfNumberOnly.php
+lib/Model/ArrayTest.php
+lib/Model/Capitalization.php
+lib/Model/Cat.php
+lib/Model/Category.php
+lib/Model/ClassModel.php
+lib/Model/Client.php
+lib/Model/DeprecatedObject.php
+lib/Model/Dog.php
+lib/Model/EnumArrays.php
+lib/Model/EnumClass.php
+lib/Model/EnumTest.php
+lib/Model/FakeBigDecimalMap200Response.php
+lib/Model/File.php
+lib/Model/FileSchemaTestClass.php
+lib/Model/Foo.php
+lib/Model/FooGetDefaultResponse.php
+lib/Model/FormatTest.php
+lib/Model/HasOnlyReadOnly.php
+lib/Model/HealthCheckResult.php
+lib/Model/MapTest.php
+lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php
+lib/Model/Model200Response.php
+lib/Model/ModelInterface.php
+lib/Model/ModelList.php
+lib/Model/ModelReturn.php
+lib/Model/Name.php
+lib/Model/NullableClass.php
+lib/Model/NumberOnly.php
+lib/Model/ObjectWithDeprecatedFields.php
+lib/Model/Order.php
+lib/Model/OuterComposite.php
+lib/Model/OuterEnum.php
+lib/Model/OuterEnumDefaultValue.php
+lib/Model/OuterEnumInteger.php
+lib/Model/OuterEnumIntegerDefaultValue.php
+lib/Model/OuterObjectWithEnumProperty.php
+lib/Model/Pet.php
+lib/Model/PropertyNameMapping.php
+lib/Model/ReadOnlyFirst.php
+lib/Model/SingleRefType.php
+lib/Model/SpecialModelName.php
+lib/Model/Tag.php
+lib/Model/User.php
+lib/ObjectSerializer.php
+phpunit.xml.dist
diff --git a/samples/client/petstore/php/psr-18/.openapi-generator/VERSION b/samples/client/petstore/php/psr-18/.openapi-generator/VERSION
new file mode 100644
index 0000000000..757e674004
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.0.0-SNAPSHOT
\ No newline at end of file
diff --git a/samples/client/petstore/php/psr-18/.php-cs-fixer.dist.php b/samples/client/petstore/php/psr-18/.php-cs-fixer.dist.php
new file mode 100644
index 0000000000..af9cf39fdd
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/.php-cs-fixer.dist.php
@@ -0,0 +1,29 @@
+in(__DIR__)
+ ->exclude('vendor')
+ ->exclude('test')
+ ->exclude('tests')
+;
+
+$config = new PhpCsFixer\Config();
+return $config->setRules([
+ '@PSR12' => true,
+ 'phpdoc_order' => true,
+ 'array_syntax' => [ 'syntax' => 'short' ],
+ 'strict_comparison' => true,
+ 'strict_param' => true,
+ 'no_trailing_whitespace' => false,
+ 'no_trailing_whitespace_in_comment' => false,
+ 'braces' => false,
+ 'single_blank_line_at_eof' => false,
+ 'blank_line_after_namespace' => false,
+ 'no_leading_import_slash' => false,
+ ])
+ ->setFinder($finder)
+;
diff --git a/samples/client/petstore/php/psr-18/.travis.yml b/samples/client/petstore/php/psr-18/.travis.yml
new file mode 100644
index 0000000000..667b815653
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/.travis.yml
@@ -0,0 +1,8 @@
+language: php
+# Bionic environment has preinstalled PHP from 7.1 to 7.4
+# https://docs.travis-ci.com/user/reference/bionic/#php-support
+dist: bionic
+php:
+ - 7.4
+before_install: "composer install"
+script: "vendor/bin/phpunit"
diff --git a/samples/client/petstore/php/psr-18/README.md b/samples/client/petstore/php/psr-18/README.md
new file mode 100644
index 0000000000..38a52823b8
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/README.md
@@ -0,0 +1,239 @@
+# OpenAPIClient-php
+
+This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
+
+
+## Installation & Usage
+
+### Requirements
+
+PHP 7.2 and later.
+
+### Composer
+
+To install the bindings via [Composer](https://getcomposer.org/), add the following to `composer.json`:
+
+```json
+{
+ "repositories": [
+ {
+ "type": "vcs",
+ "url": "https://github.com/GIT_USER_ID/GIT_REPO_ID.git"
+ }
+ ],
+ "require": {
+ "GIT_USER_ID/GIT_REPO_ID": "*@dev"
+ }
+}
+```
+
+Then run `composer install`
+
+Your project is free to choose the http client of your choice
+Please require packages that will provide http client functionality:
+https://packagist.org/providers/psr/http-client-implementation
+https://packagist.org/providers/php-http/async-client-implementation
+https://packagist.org/providers/psr/http-factory-implementation
+
+As an example:
+
+```
+composer require guzzlehttp/guzzle php-http/guzzle7-adapter http-interop/http-factory-guzzle
+```
+
+### Manual Installation
+
+Download the files and include `autoload.php`:
+
+```php
+call123TestSpecialTags($client);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling AnotherFakeApi->call123TestSpecialTags: ', $e->getMessage(), PHP_EOL;
+}
+
+```
+
+## API Endpoints
+
+All URIs are relative to *http://petstore.swagger.io:80/v2*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*AnotherFakeApi* | [**call123TestSpecialTags**](docs/Api/AnotherFakeApi.md#call123testspecialtags) | **PATCH** /another-fake/dummy | To test special tags
+*DefaultApi* | [**fooGet**](docs/Api/DefaultApi.md#fooget) | **GET** /foo |
+*FakeApi* | [**fakeBigDecimalMap**](docs/Api/FakeApi.md#fakebigdecimalmap) | **GET** /fake/BigDecimalMap |
+*FakeApi* | [**fakeHealthGet**](docs/Api/FakeApi.md#fakehealthget) | **GET** /fake/health | Health check endpoint
+*FakeApi* | [**fakeHttpSignatureTest**](docs/Api/FakeApi.md#fakehttpsignaturetest) | **GET** /fake/http-signature-test | test http signature authentication
+*FakeApi* | [**fakeOuterBooleanSerialize**](docs/Api/FakeApi.md#fakeouterbooleanserialize) | **POST** /fake/outer/boolean |
+*FakeApi* | [**fakeOuterCompositeSerialize**](docs/Api/FakeApi.md#fakeoutercompositeserialize) | **POST** /fake/outer/composite |
+*FakeApi* | [**fakeOuterNumberSerialize**](docs/Api/FakeApi.md#fakeouternumberserialize) | **POST** /fake/outer/number |
+*FakeApi* | [**fakeOuterStringSerialize**](docs/Api/FakeApi.md#fakeouterstringserialize) | **POST** /fake/outer/string |
+*FakeApi* | [**fakePropertyEnumIntegerSerialize**](docs/Api/FakeApi.md#fakepropertyenumintegerserialize) | **POST** /fake/property/enum-int |
+*FakeApi* | [**getParameterNameMapping**](docs/Api/FakeApi.md#getparameternamemapping) | **GET** /fake/parameter-name-mapping | parameter name mapping test
+*FakeApi* | [**testBodyWithBinary**](docs/Api/FakeApi.md#testbodywithbinary) | **PUT** /fake/body-with-binary |
+*FakeApi* | [**testBodyWithFileSchema**](docs/Api/FakeApi.md#testbodywithfileschema) | **PUT** /fake/body-with-file-schema |
+*FakeApi* | [**testBodyWithQueryParams**](docs/Api/FakeApi.md#testbodywithqueryparams) | **PUT** /fake/body-with-query-params |
+*FakeApi* | [**testClientModel**](docs/Api/FakeApi.md#testclientmodel) | **PATCH** /fake | To test \"client\" model
+*FakeApi* | [**testEndpointParameters**](docs/Api/FakeApi.md#testendpointparameters) | **POST** /fake | Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+*FakeApi* | [**testEnumParameters**](docs/Api/FakeApi.md#testenumparameters) | **GET** /fake | To test enum parameters
+*FakeApi* | [**testGroupParameters**](docs/Api/FakeApi.md#testgroupparameters) | **DELETE** /fake | Fake endpoint to test group parameters (optional)
+*FakeApi* | [**testInlineAdditionalProperties**](docs/Api/FakeApi.md#testinlineadditionalproperties) | **POST** /fake/inline-additionalProperties | test inline additionalProperties
+*FakeApi* | [**testJsonFormData**](docs/Api/FakeApi.md#testjsonformdata) | **GET** /fake/jsonFormData | test json serialization of form data
+*FakeApi* | [**testQueryParameterCollectionFormat**](docs/Api/FakeApi.md#testqueryparametercollectionformat) | **PUT** /fake/test-query-parameters |
+*FakeClassnameTags123Api* | [**testClassname**](docs/Api/FakeClassnameTags123Api.md#testclassname) | **PATCH** /fake_classname_test | To test class name in snake case
+*PetApi* | [**addPet**](docs/Api/PetApi.md#addpet) | **POST** /pet | Add a new pet to the store
+*PetApi* | [**deletePet**](docs/Api/PetApi.md#deletepet) | **DELETE** /pet/{petId} | Deletes a pet
+*PetApi* | [**findPetsByStatus**](docs/Api/PetApi.md#findpetsbystatus) | **GET** /pet/findByStatus | Finds Pets by status
+*PetApi* | [**findPetsByTags**](docs/Api/PetApi.md#findpetsbytags) | **GET** /pet/findByTags | Finds Pets by tags
+*PetApi* | [**getPetById**](docs/Api/PetApi.md#getpetbyid) | **GET** /pet/{petId} | Find pet by ID
+*PetApi* | [**updatePet**](docs/Api/PetApi.md#updatepet) | **PUT** /pet | Update an existing pet
+*PetApi* | [**updatePetWithForm**](docs/Api/PetApi.md#updatepetwithform) | **POST** /pet/{petId} | Updates a pet in the store with form data
+*PetApi* | [**uploadFile**](docs/Api/PetApi.md#uploadfile) | **POST** /pet/{petId}/uploadImage | uploads an image
+*PetApi* | [**uploadFileWithRequiredFile**](docs/Api/PetApi.md#uploadfilewithrequiredfile) | **POST** /fake/{petId}/uploadImageWithRequiredFile | uploads an image (required)
+*StoreApi* | [**deleteOrder**](docs/Api/StoreApi.md#deleteorder) | **DELETE** /store/order/{order_id} | Delete purchase order by ID
+*StoreApi* | [**getInventory**](docs/Api/StoreApi.md#getinventory) | **GET** /store/inventory | Returns pet inventories by status
+*StoreApi* | [**getOrderById**](docs/Api/StoreApi.md#getorderbyid) | **GET** /store/order/{order_id} | Find purchase order by ID
+*StoreApi* | [**placeOrder**](docs/Api/StoreApi.md#placeorder) | **POST** /store/order | Place an order for a pet
+*UserApi* | [**createUser**](docs/Api/UserApi.md#createuser) | **POST** /user | Create user
+*UserApi* | [**createUsersWithArrayInput**](docs/Api/UserApi.md#createuserswitharrayinput) | **POST** /user/createWithArray | Creates list of users with given input array
+*UserApi* | [**createUsersWithListInput**](docs/Api/UserApi.md#createuserswithlistinput) | **POST** /user/createWithList | Creates list of users with given input array
+*UserApi* | [**deleteUser**](docs/Api/UserApi.md#deleteuser) | **DELETE** /user/{username} | Delete user
+*UserApi* | [**getUserByName**](docs/Api/UserApi.md#getuserbyname) | **GET** /user/{username} | Get user by user name
+*UserApi* | [**loginUser**](docs/Api/UserApi.md#loginuser) | **GET** /user/login | Logs user into the system
+*UserApi* | [**logoutUser**](docs/Api/UserApi.md#logoutuser) | **GET** /user/logout | Logs out current logged in user session
+*UserApi* | [**updateUser**](docs/Api/UserApi.md#updateuser) | **PUT** /user/{username} | Updated user
+
+## Models
+
+- [AdditionalPropertiesClass](docs/Model/AdditionalPropertiesClass.md)
+- [AllOfWithSingleRef](docs/Model/AllOfWithSingleRef.md)
+- [Animal](docs/Model/Animal.md)
+- [ApiResponse](docs/Model/ApiResponse.md)
+- [ArrayOfArrayOfNumberOnly](docs/Model/ArrayOfArrayOfNumberOnly.md)
+- [ArrayOfNumberOnly](docs/Model/ArrayOfNumberOnly.md)
+- [ArrayTest](docs/Model/ArrayTest.md)
+- [Capitalization](docs/Model/Capitalization.md)
+- [Cat](docs/Model/Cat.md)
+- [Category](docs/Model/Category.md)
+- [ClassModel](docs/Model/ClassModel.md)
+- [Client](docs/Model/Client.md)
+- [DeprecatedObject](docs/Model/DeprecatedObject.md)
+- [Dog](docs/Model/Dog.md)
+- [EnumArrays](docs/Model/EnumArrays.md)
+- [EnumClass](docs/Model/EnumClass.md)
+- [EnumTest](docs/Model/EnumTest.md)
+- [FakeBigDecimalMap200Response](docs/Model/FakeBigDecimalMap200Response.md)
+- [File](docs/Model/File.md)
+- [FileSchemaTestClass](docs/Model/FileSchemaTestClass.md)
+- [Foo](docs/Model/Foo.md)
+- [FooGetDefaultResponse](docs/Model/FooGetDefaultResponse.md)
+- [FormatTest](docs/Model/FormatTest.md)
+- [HasOnlyReadOnly](docs/Model/HasOnlyReadOnly.md)
+- [HealthCheckResult](docs/Model/HealthCheckResult.md)
+- [MapTest](docs/Model/MapTest.md)
+- [MixedPropertiesAndAdditionalPropertiesClass](docs/Model/MixedPropertiesAndAdditionalPropertiesClass.md)
+- [Model200Response](docs/Model/Model200Response.md)
+- [ModelList](docs/Model/ModelList.md)
+- [ModelReturn](docs/Model/ModelReturn.md)
+- [Name](docs/Model/Name.md)
+- [NullableClass](docs/Model/NullableClass.md)
+- [NumberOnly](docs/Model/NumberOnly.md)
+- [ObjectWithDeprecatedFields](docs/Model/ObjectWithDeprecatedFields.md)
+- [Order](docs/Model/Order.md)
+- [OuterComposite](docs/Model/OuterComposite.md)
+- [OuterEnum](docs/Model/OuterEnum.md)
+- [OuterEnumDefaultValue](docs/Model/OuterEnumDefaultValue.md)
+- [OuterEnumInteger](docs/Model/OuterEnumInteger.md)
+- [OuterEnumIntegerDefaultValue](docs/Model/OuterEnumIntegerDefaultValue.md)
+- [OuterObjectWithEnumProperty](docs/Model/OuterObjectWithEnumProperty.md)
+- [Pet](docs/Model/Pet.md)
+- [PropertyNameMapping](docs/Model/PropertyNameMapping.md)
+- [ReadOnlyFirst](docs/Model/ReadOnlyFirst.md)
+- [SingleRefType](docs/Model/SingleRefType.md)
+- [SpecialModelName](docs/Model/SpecialModelName.md)
+- [Tag](docs/Model/Tag.md)
+- [User](docs/Model/User.md)
+
+## Authorization
+
+### petstore_auth
+
+- **Type**: `OAuth`
+- **Flow**: `implicit`
+- **Authorization URL**: `http://petstore.swagger.io/api/oauth/dialog`
+- **Scopes**:
+ - **write:pets**: modify pets in your account
+ - **read:pets**: read your pets
+
+
+### api_key
+
+- **Type**: API key
+- **API key parameter name**: api_key
+- **Location**: HTTP header
+
+
+
+### api_key_query
+
+- **Type**: API key
+- **API key parameter name**: api_key_query
+- **Location**: URL query string
+
+
+
+### http_basic_test
+
+- **Type**: HTTP basic authentication
+
+
+### bearer_test
+
+- **Type**: Bearer authentication (JWT)
+
+
+### http_signature_test
+
+## Tests
+
+To run the tests, use:
+
+```bash
+composer install
+vendor/bin/phpunit
+```
+
+## Author
+
+
+
+## About this package
+
+This PHP package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: `1.0.0`
+- Build package: `org.openapitools.codegen.languages.PhpClientCodegen`
diff --git a/samples/client/petstore/php/psr-18/composer.json b/samples/client/petstore/php/psr-18/composer.json
new file mode 100644
index 0000000000..988cf821ed
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/composer.json
@@ -0,0 +1,51 @@
+{
+ "name": "GIT_USER_ID/GIT_REPO_ID",
+ "description": "This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\",
+ "keywords": [
+ "openapitools",
+ "openapi-generator",
+ "openapi",
+ "php",
+ "sdk",
+ "rest",
+ "api"
+ ],
+ "homepage": "https://openapi-generator.tech",
+ "license": "unlicense",
+ "authors": [
+ {
+ "name": "OpenAPI-Generator contributors",
+ "homepage": "https://openapi-generator.tech"
+ }
+ ],
+ "config": {
+ "sort-packages": true
+ },
+ "require": {
+ "php": ">=7.2",
+ "ext-curl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "guzzlehttp/psr7": "^1.8 || ^2.0",
+ "php-http/async-client-implementation": "^1.0",
+ "php-http/client-common": "^2.4",
+ "php-http/discovery": "^1.14",
+ "php-http/httplug": "^2.2",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-factory-implementation": "^1.0",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.0 || ^9.0",
+ "friendsofphp/php-cs-fixer": "^2.12",
+ "guzzlehttp/guzzle": "^7.0",
+ "php-http/guzzle7-adapter": "^1.0"
+ },
+ "autoload": {
+ "psr-4": { "OpenAPI\\Client\\" : "lib/" }
+ },
+ "autoload-dev": {
+ "psr-4": { "OpenAPI\\Client\\Test\\" : "test/" }
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/composer.lock b/samples/client/petstore/php/psr-18/composer.lock
new file mode 100644
index 0000000000..c1cf6707bf
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/composer.lock
@@ -0,0 +1,4983 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "eaa4af6876416b9e7ba17683702be606",
+ "packages": [
+ {
+ "name": "clue/stream-filter",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/clue/stream-filter.git",
+ "reference": "d6169430c7731d8509da7aecd0af756a5747b78e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e",
+ "reference": "d6169430c7731d8509da7aecd0af756a5747b78e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "Clue\\StreamFilter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "A simple and modern approach to stream filtering in PHP",
+ "homepage": "https://github.com/clue/php-stream-filter",
+ "keywords": [
+ "bucket brigade",
+ "callback",
+ "filter",
+ "php_user_filter",
+ "stream",
+ "stream_filter_append",
+ "stream_filter_register"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/stream-filter/issues",
+ "source": "https://github.com/clue/stream-filter/tree/v1.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-21T13:15:14+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77",
+ "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-03T15:06:02+00:00"
+ },
+ {
+ "name": "php-http/client-common",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/client-common.git",
+ "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b",
+ "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/httplug": "^2.0",
+ "php-http/message": "^1.6",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.1",
+ "guzzlehttp/psr7": "^1.4",
+ "nyholm/psr7": "^1.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "phpspec/prophecy": "^1.10.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+ },
+ "suggest": {
+ "ext-json": "To detect JSON responses with the ContentTypePlugin",
+ "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+ "php-http/cache-plugin": "PSR-6 Cache plugin",
+ "php-http/logger-plugin": "PSR-3 Logger plugin",
+ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Common HTTP Client implementations and tools for HTTPlug",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "common",
+ "http",
+ "httplug"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/client-common/issues",
+ "source": "https://github.com/php-http/client-common/tree/2.7.0"
+ },
+ "time": "2023-05-17T06:46:59+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.19.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e",
+ "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "symfony/phpunit-bridge": "^6.2"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.19.1"
+ },
+ "time": "2023-07-11T07:02:26+00:00"
+ },
+ {
+ "name": "php-http/httplug",
+ "version": "2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/httplug.git",
+ "reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
+ "reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/promise": "^1.1",
+ "psr/http-client": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "HTTPlug, the HTTP client abstraction for PHP",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "client",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/2.4.0"
+ },
+ "time": "2023-04-14T15:10:03+00:00"
+ },
+ {
+ "name": "php-http/message",
+ "version": "1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message.git",
+ "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+ "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+ "shasum": ""
+ },
+ "require": {
+ "clue/stream-filter": "^1.5",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.6",
+ "ext-zlib": "*",
+ "guzzlehttp/psr7": "^1.0 || ^2.0",
+ "laminas/laminas-diactoros": "^2.0 || ^3.0",
+ "php-http/message-factory": "^1.0.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "slim/slim": "^3.0"
+ },
+ "suggest": {
+ "ext-zlib": "Used with compressor/decompressor streams",
+ "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+ "laminas/laminas-diactoros": "Used with Diactoros Factories",
+ "slim/slim": "Used with Slim Framework PSR-7 implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/filters.php"
+ ],
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "HTTP Message related tools",
+ "homepage": "http://php-http.org",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message/issues",
+ "source": "https://github.com/php-http/message/tree/1.16.0"
+ },
+ "time": "2023-05-17T06:43:38+00:00"
+ },
+ {
+ "name": "php-http/promise",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/promise.git",
+ "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/4c4c1f9b7289a2ec57cde7f1e9762a5789506f88",
+ "reference": "4c4c1f9b7289a2ec57cde7f1e9762a5789506f88",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2",
+ "phpspec/phpspec": "^5.1.2 || ^6.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joel Wurtz",
+ "email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Promise used for asynchronous HTTP requests",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.1.0"
+ },
+ "time": "2020-07-07T09:29:14+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+ "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:12:12+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:10:41+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/1.1"
+ },
+ "time": "2023-04-04T09:50:52+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+ "reference": "26954b3d62a6c5fd0ea8a2a00c0353a14978d05c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-01-02T09:55:41+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v5.4.21",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9",
+ "reference": "4fe5cf6ede71096839f0e4b4444d65dd3a7c1eb9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php73": "~1.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v5.4.21"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-02-14T08:03:56+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php73",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
+ "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "composer/pcre",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/67a32d7d6f9f560b726ab25a061b38ff3a80c560",
+ "reference": "67a32d7d6f9f560b726ab25a061b38ff3a80c560",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.3",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-01-21T20:24:37+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.4",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-04-01T19:23:25+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "2.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/9e36aeed4616366d2b690bdce11f71e9178c579a",
+ "reference": "9e36aeed4616366d2b690bdce11f71e9178c579a",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1",
+ "php": "^5.3.2 || ^7.0 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/2.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-24T20:20:32+00:00"
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "1.14.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af",
+ "reference": "fb0d71a7393298a7b232cbf4c8b1f73f3ec3d5af",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^1 || ^2",
+ "ext-tokenizer": "*",
+ "php": "^7.1 || ^8.0",
+ "psr/cache": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "doctrine/cache": "^1.11 || ^2.0",
+ "doctrine/coding-standard": "^9 || ^10",
+ "phpstan/phpstan": "~1.4.10 || ^1.8.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "symfony/cache": "^4.4 || ^5.4 || ^6",
+ "vimeo/psalm": "^4.10"
+ },
+ "suggest": {
+ "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/annotations/issues",
+ "source": "https://github.com/doctrine/annotations/tree/1.14.3"
+ },
+ "time": "2023-02-01T09:20:38+00:00"
+ },
+ {
+ "name": "doctrine/deprecations",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
+ "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9",
+ "phpstan/phpstan": "1.4.10 || 1.10.15",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "psalm/plugin-phpunit": "0.18.4",
+ "psr/log": "^1 || ^2 || ^3",
+ "vimeo/psalm": "4.30.0 || 5.12.0"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+ "homepage": "https://www.doctrine-project.org/",
+ "support": {
+ "issues": "https://github.com/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/v1.1.1"
+ },
+ "time": "2023-06-03T09:27:29+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.16 || ^1",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.30 || ^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:15:36+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
+ "reference": "39ab8fcf5a51ce4b85ca97c7a7d033eb12831124",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^10",
+ "phpstan/phpstan": "^1.3",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^4.11 || ^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/2.1.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-14T08:49:07+00:00"
+ },
+ {
+ "name": "friendsofphp/php-cs-fixer",
+ "version": "v2.19.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
+ "reference": "75ac86f33fab4714ea5a39a396784d83ae3b5ed8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/75ac86f33fab4714ea5a39a396784d83ae3b5ed8",
+ "reference": "75ac86f33fab4714ea5a39a396784d83ae3b5ed8",
+ "shasum": ""
+ },
+ "require": {
+ "composer/semver": "^1.4 || ^2.0 || ^3.0",
+ "composer/xdebug-handler": "^1.2 || ^2.0",
+ "doctrine/annotations": "^1.2",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^5.6 || ^7.0 || ^8.0",
+ "php-cs-fixer/diff": "^1.3",
+ "symfony/console": "^3.4.43 || ^4.1.6 || ^5.0",
+ "symfony/event-dispatcher": "^3.0 || ^4.0 || ^5.0",
+ "symfony/filesystem": "^3.0 || ^4.0 || ^5.0",
+ "symfony/finder": "^3.0 || ^4.0 || ^5.0",
+ "symfony/options-resolver": "^3.0 || ^4.0 || ^5.0",
+ "symfony/polyfill-php70": "^1.0",
+ "symfony/polyfill-php72": "^1.4",
+ "symfony/process": "^3.0 || ^4.0 || ^5.0",
+ "symfony/stopwatch": "^3.0 || ^4.0 || ^5.0"
+ },
+ "require-dev": {
+ "justinrainbow/json-schema": "^5.0",
+ "keradus/cli-executor": "^1.4",
+ "mikey179/vfsstream": "^1.6",
+ "php-coveralls/php-coveralls": "^2.4.2",
+ "php-cs-fixer/accessible-object": "^1.0",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.2",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.2.1",
+ "phpspec/prophecy-phpunit": "^1.1 || ^2.0",
+ "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.13 || ^9.5",
+ "phpunitgoodpractices/polyfill": "^1.5",
+ "phpunitgoodpractices/traits": "^1.9.1",
+ "sanmai/phpunit-legacy-adapter": "^6.4 || ^8.2.1",
+ "symfony/phpunit-bridge": "^5.2.1",
+ "symfony/yaml": "^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "ext-dom": "For handling output formats in XML",
+ "ext-mbstring": "For handling non-UTF8 characters.",
+ "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.",
+ "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.",
+ "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible."
+ },
+ "bin": [
+ "php-cs-fixer"
+ ],
+ "type": "application",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.19-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpCsFixer\\": "src/"
+ },
+ "classmap": [
+ "tests/Test/AbstractFixerTestCase.php",
+ "tests/Test/AbstractIntegrationCaseFactory.php",
+ "tests/Test/AbstractIntegrationTestCase.php",
+ "tests/Test/Assert/AssertTokensTrait.php",
+ "tests/Test/IntegrationCase.php",
+ "tests/Test/IntegrationCaseFactory.php",
+ "tests/Test/IntegrationCaseFactoryInterface.php",
+ "tests/Test/InternalIntegrationCaseFactory.php",
+ "tests/Test/IsIdenticalConstraint.php",
+ "tests/Test/TokensWithObservedTransformers.php",
+ "tests/TestCase.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Dariusz Rumiński",
+ "email": "dariusz.ruminski@gmail.com"
+ }
+ ],
+ "description": "A tool to automatically fix PHP code style",
+ "support": {
+ "issues": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/issues",
+ "source": "https://github.com/FriendsOfPHP/PHP-CS-Fixer/tree/v2.19.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/keradus",
+ "type": "github"
+ }
+ ],
+ "time": "2021-11-15T17:17:55+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5",
+ "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-21T14:04:53+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-03T15:11:55+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-03-08T13:26:56+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.17.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
+ },
+ "time": "2023-08-13T19:53:39+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ },
+ "time": "2021-07-20T11:28:43+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "php-cs-fixer/diff",
+ "version": "v1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHP-CS-Fixer/diff.git",
+ "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/dbd31aeb251639ac0b9e7e29405c1441907f5759",
+ "reference": "dbd31aeb251639ac0b9e7e29405c1441907f5759",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7.23 || ^6.4.3 || ^7.0",
+ "symfony/process": "^3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "SpacePossum"
+ }
+ ],
+ "description": "sebastian/diff v2 backport support for PHP5.6",
+ "homepage": "https://github.com/PHP-CS-Fixer",
+ "keywords": [
+ "diff"
+ ],
+ "support": {
+ "issues": "https://github.com/PHP-CS-Fixer/diff/issues",
+ "source": "https://github.com/PHP-CS-Fixer/diff/tree/v1.3.1"
+ },
+ "abandoned": true,
+ "time": "2020-10-14T08:39:05+00:00"
+ },
+ {
+ "name": "php-http/guzzle7-adapter",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/guzzle7-adapter.git",
+ "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01",
+ "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^7.0",
+ "php": "^7.2 | ^8.0",
+ "php-http/httplug": "^2.0",
+ "psr/http-client": "^1.0"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "1.0",
+ "php-http/client-implementation": "1.0",
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.0|^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Adapter\\Guzzle7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ }
+ ],
+ "description": "Guzzle 7 HTTP Adapter",
+ "homepage": "http://httplug.io",
+ "keywords": [
+ "Guzzle",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/guzzle7-adapter/issues",
+ "source": "https://github.com/php-http/guzzle7-adapter/tree/1.0.0"
+ },
+ "time": "2021-03-09T07:35:15+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.27",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1",
+ "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.15",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-07-26T13:44:30+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "810500e92855eba8a7a5319ae913be2da6f957b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/810500e92855eba8a7a5319ae913be2da6f957b0",
+ "reference": "810500e92855eba8a7a5319ae913be2da6f957b0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.13",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.5",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^3.2",
+ "sebastian/version": "^3.0.2"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.11"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-19T07:10:56+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
+ "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/2.0.0"
+ },
+ "time": "2021-07-14T16:41:46+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:41:17+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-07T05:35:17+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T06:03:37+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bde739e7565280bda77be70044ac1047bc007e34"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34",
+ "reference": "bde739e7565280bda77be70044ac1047bc007e34",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-02T09:26:13+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:07:39+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13:03+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.4.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/b504a3d266ad2bb632f196c0936ef2af5ff6e273",
+ "reference": "b504a3d266ad2bb632f196c0936ef2af5ff6e273",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
+ },
+ "conflict": {
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v5.4.26"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-19T20:11:33+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v5.4.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac",
+ "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/event-dispatcher-contracts": "^2|^3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/expression-language": "^4.4|^5.0|^6.0",
+ "symfony/http-foundation": "^4.4|^5.0|^6.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/stopwatch": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-06T06:34:20+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "7bc61cc2db649b4637d331240c5346dcc7708051"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7bc61cc2db649b4637d331240c5346dcc7708051",
+ "reference": "7bc61cc2db649b4637d331240c5346dcc7708051",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-01-02T09:55:41+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.4.25",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364",
+ "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v5.4.25"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-31T13:04:02+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.4.27",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d",
+ "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v5.4.27"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-31T08:02:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php70",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php70.git",
+ "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644",
+ "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "metapackage",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php70/tree/v1.20.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97",
+ "reference": "869329b1e9894268a8a61dabb69153029b7a8c97",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v5.4.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/1a44dc377ec86a50fab40d066cd061e28a6b482f",
+ "reference": "1a44dc377ec86a50fab40d066cd061e28a6b482f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v5.4.26"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-12T15:44:31+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-30T19:17:58+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v5.4.21",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f83692cd869a6f2391691d40a01e8acb89e76fee",
+ "reference": "f83692cd869a6f2391691d40a01e8acb89e76fee",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/service-contracts": "^1|^2|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a way to profile code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/stopwatch/tree/v5.4.21"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-02-14T08:03:56+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/translation-contracts": "^2.0|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.0.19"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:36:10+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.2",
+ "ext-curl": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.2.0"
+}
diff --git a/samples/client/petstore/php/psr-18/docs/Api/AnotherFakeApi.md b/samples/client/petstore/php/psr-18/docs/Api/AnotherFakeApi.md
new file mode 100644
index 0000000000..42a2243039
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/AnotherFakeApi.md
@@ -0,0 +1,64 @@
+# OpenAPI\Client\AnotherFakeApi
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**call123TestSpecialTags()**](AnotherFakeApi.md#call123TestSpecialTags) | **PATCH** /another-fake/dummy | To test special tags
+
+
+## `call123TestSpecialTags()`
+
+```php
+call123TestSpecialTags($client): \OpenAPI\Client\Model\Client
+```
+
+To test special tags
+
+To test special tags and operation ID starting with number
+
+### Example
+
+```php
+call123TestSpecialTags($client);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling AnotherFakeApi->call123TestSpecialTags: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **client** | [**\OpenAPI\Client\Model\Client**](../Model/Client.md)| client model |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Client**](../Model/Client.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Api/DefaultApi.md b/samples/client/petstore/php/psr-18/docs/Api/DefaultApi.md
new file mode 100644
index 0000000000..b56d4df36e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/DefaultApi.md
@@ -0,0 +1,59 @@
+# OpenAPI\Client\DefaultApi
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**fooGet()**](DefaultApi.md#fooGet) | **GET** /foo |
+
+
+## `fooGet()`
+
+```php
+fooGet(): \OpenAPI\Client\Model\FooGetDefaultResponse
+```
+
+
+
+### Example
+
+```php
+fooGet();
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling DefaultApi->fooGet: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+[**\OpenAPI\Client\Model\FooGetDefaultResponse**](../Model/FooGetDefaultResponse.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Api/FakeApi.md b/samples/client/petstore/php/psr-18/docs/Api/FakeApi.md
new file mode 100644
index 0000000000..8ab1bf86ab
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/FakeApi.md
@@ -0,0 +1,1159 @@
+# OpenAPI\Client\FakeApi
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**fakeBigDecimalMap()**](FakeApi.md#fakeBigDecimalMap) | **GET** /fake/BigDecimalMap |
+[**fakeHealthGet()**](FakeApi.md#fakeHealthGet) | **GET** /fake/health | Health check endpoint
+[**fakeHttpSignatureTest()**](FakeApi.md#fakeHttpSignatureTest) | **GET** /fake/http-signature-test | test http signature authentication
+[**fakeOuterBooleanSerialize()**](FakeApi.md#fakeOuterBooleanSerialize) | **POST** /fake/outer/boolean |
+[**fakeOuterCompositeSerialize()**](FakeApi.md#fakeOuterCompositeSerialize) | **POST** /fake/outer/composite |
+[**fakeOuterNumberSerialize()**](FakeApi.md#fakeOuterNumberSerialize) | **POST** /fake/outer/number |
+[**fakeOuterStringSerialize()**](FakeApi.md#fakeOuterStringSerialize) | **POST** /fake/outer/string |
+[**fakePropertyEnumIntegerSerialize()**](FakeApi.md#fakePropertyEnumIntegerSerialize) | **POST** /fake/property/enum-int |
+[**getParameterNameMapping()**](FakeApi.md#getParameterNameMapping) | **GET** /fake/parameter-name-mapping | parameter name mapping test
+[**testBodyWithBinary()**](FakeApi.md#testBodyWithBinary) | **PUT** /fake/body-with-binary |
+[**testBodyWithFileSchema()**](FakeApi.md#testBodyWithFileSchema) | **PUT** /fake/body-with-file-schema |
+[**testBodyWithQueryParams()**](FakeApi.md#testBodyWithQueryParams) | **PUT** /fake/body-with-query-params |
+[**testClientModel()**](FakeApi.md#testClientModel) | **PATCH** /fake | To test \"client\" model
+[**testEndpointParameters()**](FakeApi.md#testEndpointParameters) | **POST** /fake | Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+[**testEnumParameters()**](FakeApi.md#testEnumParameters) | **GET** /fake | To test enum parameters
+[**testGroupParameters()**](FakeApi.md#testGroupParameters) | **DELETE** /fake | Fake endpoint to test group parameters (optional)
+[**testInlineAdditionalProperties()**](FakeApi.md#testInlineAdditionalProperties) | **POST** /fake/inline-additionalProperties | test inline additionalProperties
+[**testJsonFormData()**](FakeApi.md#testJsonFormData) | **GET** /fake/jsonFormData | test json serialization of form data
+[**testQueryParameterCollectionFormat()**](FakeApi.md#testQueryParameterCollectionFormat) | **PUT** /fake/test-query-parameters |
+
+
+## `fakeBigDecimalMap()`
+
+```php
+fakeBigDecimalMap(): \OpenAPI\Client\Model\FakeBigDecimalMap200Response
+```
+
+
+
+for Java apache and Java native, test toUrlQueryString for maps with BegDecimal keys
+
+### Example
+
+```php
+fakeBigDecimalMap();
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeBigDecimalMap: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+[**\OpenAPI\Client\Model\FakeBigDecimalMap200Response**](../Model/FakeBigDecimalMap200Response.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `*/*`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakeHealthGet()`
+
+```php
+fakeHealthGet(): \OpenAPI\Client\Model\HealthCheckResult
+```
+
+Health check endpoint
+
+### Example
+
+```php
+fakeHealthGet();
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeHealthGet: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+[**\OpenAPI\Client\Model\HealthCheckResult**](../Model/HealthCheckResult.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakeHttpSignatureTest()`
+
+```php
+fakeHttpSignatureTest($pet, $query_1, $header_1)
+```
+
+test http signature authentication
+
+### Example
+
+```php
+fakeHttpSignatureTest($pet, $query_1, $header_1);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeHttpSignatureTest: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet** | [**\OpenAPI\Client\Model\Pet**](../Model/Pet.md)| Pet object that needs to be added to the store |
+ **query_1** | **string**| query parameter | [optional]
+ **header_1** | **string**| header parameter | [optional]
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[http_signature_test](../../README.md#http_signature_test)
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`, `application/xml`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakeOuterBooleanSerialize()`
+
+```php
+fakeOuterBooleanSerialize($body): bool
+```
+
+
+
+Test serialization of outer boolean types
+
+### Example
+
+```php
+fakeOuterBooleanSerialize($body);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeOuterBooleanSerialize: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **body** | **bool**| Input boolean as post body | [optional]
+
+### Return type
+
+**bool**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `*/*`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakeOuterCompositeSerialize()`
+
+```php
+fakeOuterCompositeSerialize($outer_composite): \OpenAPI\Client\Model\OuterComposite
+```
+
+
+
+Test serialization of object with outer number type
+
+### Example
+
+```php
+fakeOuterCompositeSerialize($outer_composite);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeOuterCompositeSerialize: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **outer_composite** | [**\OpenAPI\Client\Model\OuterComposite**](../Model/OuterComposite.md)| Input composite as post body | [optional]
+
+### Return type
+
+[**\OpenAPI\Client\Model\OuterComposite**](../Model/OuterComposite.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `*/*`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakeOuterNumberSerialize()`
+
+```php
+fakeOuterNumberSerialize($body): float
+```
+
+
+
+Test serialization of outer number types
+
+### Example
+
+```php
+fakeOuterNumberSerialize($body);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeOuterNumberSerialize: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **body** | **float**| Input number as post body | [optional]
+
+### Return type
+
+**float**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `*/*`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakeOuterStringSerialize()`
+
+```php
+fakeOuterStringSerialize($body): string
+```
+
+
+
+Test serialization of outer string types
+
+### Example
+
+```php
+fakeOuterStringSerialize($body);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakeOuterStringSerialize: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **body** | **string**| Input string as post body | [optional]
+
+### Return type
+
+**string**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `*/*`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `fakePropertyEnumIntegerSerialize()`
+
+```php
+fakePropertyEnumIntegerSerialize($outer_object_with_enum_property): \OpenAPI\Client\Model\OuterObjectWithEnumProperty
+```
+
+
+
+Test serialization of enum (int) properties with examples
+
+### Example
+
+```php
+fakePropertyEnumIntegerSerialize($outer_object_with_enum_property);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->fakePropertyEnumIntegerSerialize: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **outer_object_with_enum_property** | [**\OpenAPI\Client\Model\OuterObjectWithEnumProperty**](../Model/OuterObjectWithEnumProperty.md)| Input enum (int) as post body |
+
+### Return type
+
+[**\OpenAPI\Client\Model\OuterObjectWithEnumProperty**](../Model/OuterObjectWithEnumProperty.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `*/*`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `getParameterNameMapping()`
+
+```php
+getParameterNameMapping($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+```
+
+parameter name mapping test
+
+### Example
+
+```php
+getParameterNameMapping($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->getParameterNameMapping: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **underscore_type** | **int**| _type |
+ **type** | **string**| type |
+ **type_with_underscore** | **string**| type_ |
+ **type_with_dash** | **string**| type- |
+ **http_debug_option** | **string**| http debug option (to test parameter naming option) |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testBodyWithBinary()`
+
+```php
+testBodyWithBinary($body)
+```
+
+
+
+For this test, the body has to be a binary file.
+
+### Example
+
+```php
+testBodyWithBinary($body);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testBodyWithBinary: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **body** | **\SplFileObject****\SplFileObject**| image to upload |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `image/png`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testBodyWithFileSchema()`
+
+```php
+testBodyWithFileSchema($file_schema_test_class)
+```
+
+
+
+For this test, the body for this request must reference a schema named `File`.
+
+### Example
+
+```php
+testBodyWithFileSchema($file_schema_test_class);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testBodyWithFileSchema: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **file_schema_test_class** | [**\OpenAPI\Client\Model\FileSchemaTestClass**](../Model/FileSchemaTestClass.md)| |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testBodyWithQueryParams()`
+
+```php
+testBodyWithQueryParams($query, $user)
+```
+
+
+
+### Example
+
+```php
+testBodyWithQueryParams($query, $user);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testBodyWithQueryParams: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **query** | **string**| |
+ **user** | [**\OpenAPI\Client\Model\User**](../Model/User.md)| |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testClientModel()`
+
+```php
+testClientModel($client): \OpenAPI\Client\Model\Client
+```
+
+To test \"client\" model
+
+To test \"client\" model
+
+### Example
+
+```php
+testClientModel($client);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testClientModel: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **client** | [**\OpenAPI\Client\Model\Client**](../Model/Client.md)| client model |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Client**](../Model/Client.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testEndpointParameters()`
+
+```php
+testEndpointParameters($number, $double, $pattern_without_delimiter, $byte, $integer, $int32, $int64, $float, $string, $binary, $date, $date_time, $password, $callback)
+```
+
+Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+
+Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+
+### Example
+
+```php
+setUsername('YOUR_USERNAME')
+ ->setPassword('YOUR_PASSWORD');
+
+
+$apiInstance = new OpenAPI\Client\Api\FakeApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$number = 3.4; // float | None
+$double = 3.4; // float | None
+$pattern_without_delimiter = 'pattern_without_delimiter_example'; // string | None
+$byte = 'byte_example'; // string | None
+$integer = 56; // int | None
+$int32 = 56; // int | None
+$int64 = 56; // int | None
+$float = 3.4; // float | None
+$string = 'string_example'; // string | None
+$binary = "/path/to/file.txt"; // \SplFileObject | None
+$date = new \DateTime("2013-10-20T19:20:30+01:00"); // \DateTime | None
+$date_time = new \DateTime("2013-10-20T19:20:30+01:00"); // \DateTime | None
+$password = 'password_example'; // string | None
+$callback = 'callback_example'; // string | None
+
+try {
+ $apiInstance->testEndpointParameters($number, $double, $pattern_without_delimiter, $byte, $integer, $int32, $int64, $float, $string, $binary, $date, $date_time, $password, $callback);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testEndpointParameters: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **number** | **float**| None |
+ **double** | **float**| None |
+ **pattern_without_delimiter** | **string**| None |
+ **byte** | **string**| None |
+ **integer** | **int**| None | [optional]
+ **int32** | **int**| None | [optional]
+ **int64** | **int**| None | [optional]
+ **float** | **float**| None | [optional]
+ **string** | **string**| None | [optional]
+ **binary** | **\SplFileObject****\SplFileObject**| None | [optional]
+ **date** | **\DateTime**| None | [optional]
+ **date_time** | **\DateTime**| None | [optional]
+ **password** | **string**| None | [optional]
+ **callback** | **string**| None | [optional]
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[http_basic_test](../../README.md#http_basic_test)
+
+### HTTP request headers
+
+- **Content-Type**: `application/x-www-form-urlencoded`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testEnumParameters()`
+
+```php
+testEnumParameters($enum_header_string_array, $enum_header_string, $enum_query_string_array, $enum_query_string, $enum_query_integer, $enum_query_double, $enum_query_model_array, $enum_form_string_array, $enum_form_string)
+```
+
+To test enum parameters
+
+To test enum parameters
+
+### Example
+
+```php
+testEnumParameters($enum_header_string_array, $enum_header_string, $enum_query_string_array, $enum_query_string, $enum_query_integer, $enum_query_double, $enum_query_model_array, $enum_form_string_array, $enum_form_string);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testEnumParameters: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **enum_header_string_array** | [**string[]**](../Model/string.md)| Header parameter enum test (string array) | [optional]
+ **enum_header_string** | **string**| Header parameter enum test (string) | [optional] [default to '-efg']
+ **enum_query_string_array** | [**string[]**](../Model/string.md)| Query parameter enum test (string array) | [optional]
+ **enum_query_string** | **string**| Query parameter enum test (string) | [optional] [default to '-efg']
+ **enum_query_integer** | **int**| Query parameter enum test (double) | [optional]
+ **enum_query_double** | **float**| Query parameter enum test (double) | [optional]
+ **enum_query_model_array** | [**\OpenAPI\Client\Model\EnumClass[]**](../Model/\OpenAPI\Client\Model\EnumClass.md)| | [optional]
+ **enum_form_string_array** | [**string[]**](../Model/string.md)| Form parameter enum test (string array) | [optional] [default to '$']
+ **enum_form_string** | **string**| Form parameter enum test (string) | [optional] [default to '-efg']
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/x-www-form-urlencoded`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testGroupParameters()`
+
+```php
+testGroupParameters($required_string_group, $required_boolean_group, $required_int64_group, $string_group, $boolean_group, $int64_group)
+```
+
+Fake endpoint to test group parameters (optional)
+
+Fake endpoint to test group parameters (optional)
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\FakeApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$associate_array['required_string_group'] = 56; // int | Required String in group parameters
+$associate_array['required_boolean_group'] = True; // bool | Required Boolean in group parameters
+$associate_array['required_int64_group'] = 56; // int | Required Integer in group parameters
+$associate_array['string_group'] = 56; // int | String in group parameters
+$associate_array['boolean_group'] = True; // bool | Boolean in group parameters
+$associate_array['int64_group'] = 56; // int | Integer in group parameters
+
+try {
+ $apiInstance->testGroupParameters($associate_array);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testGroupParameters: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Note: the input parameter is an associative array with the keys listed as the parameter name below.
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **required_string_group** | **int**| Required String in group parameters |
+ **required_boolean_group** | **bool**| Required Boolean in group parameters |
+ **required_int64_group** | **int**| Required Integer in group parameters |
+ **string_group** | **int**| String in group parameters | [optional]
+ **boolean_group** | **bool**| Boolean in group parameters | [optional]
+ **int64_group** | **int**| Integer in group parameters | [optional]
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[bearer_test](../../README.md#bearer_test)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testInlineAdditionalProperties()`
+
+```php
+testInlineAdditionalProperties($request_body)
+```
+
+test inline additionalProperties
+
+
+
+### Example
+
+```php
+ 'request_body_example'); // array | request body
+
+try {
+ $apiInstance->testInlineAdditionalProperties($request_body);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testInlineAdditionalProperties: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **request_body** | [**array**](../Model/string.md)| request body |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testJsonFormData()`
+
+```php
+testJsonFormData($param, $param2)
+```
+
+test json serialization of form data
+
+
+
+### Example
+
+```php
+testJsonFormData($param, $param2);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testJsonFormData: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **param** | **string**| field1 |
+ **param2** | **string**| field2 |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/x-www-form-urlencoded`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `testQueryParameterCollectionFormat()`
+
+```php
+testQueryParameterCollectionFormat($pipe, $ioutil, $http, $url, $context, $allow_empty, $language)
+```
+
+
+
+To test the collection format in query parameters
+
+### Example
+
+```php
+ 'language_example'); // array
+
+try {
+ $apiInstance->testQueryParameterCollectionFormat($pipe, $ioutil, $http, $url, $context, $allow_empty, $language);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeApi->testQueryParameterCollectionFormat: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pipe** | [**string[]**](../Model/string.md)| |
+ **ioutil** | [**string[]**](../Model/string.md)| |
+ **http** | [**string[]**](../Model/string.md)| |
+ **url** | [**string[]**](../Model/string.md)| |
+ **context** | [**string[]**](../Model/string.md)| |
+ **allow_empty** | **string**| |
+ **language** | [**array**](../Model/string.md)| | [optional]
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Api/FakeClassnameTags123Api.md b/samples/client/petstore/php/psr-18/docs/Api/FakeClassnameTags123Api.md
new file mode 100644
index 0000000000..48b2139c35
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/FakeClassnameTags123Api.md
@@ -0,0 +1,70 @@
+# OpenAPI\Client\FakeClassnameTags123Api
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**testClassname()**](FakeClassnameTags123Api.md#testClassname) | **PATCH** /fake_classname_test | To test class name in snake case
+
+
+## `testClassname()`
+
+```php
+testClassname($client): \OpenAPI\Client\Model\Client
+```
+
+To test class name in snake case
+
+To test class name in snake case
+
+### Example
+
+```php
+setApiKey('api_key_query', 'YOUR_API_KEY');
+// Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
+// $config = OpenAPI\Client\Configuration::getDefaultConfiguration()->setApiKeyPrefix('api_key_query', 'Bearer');
+
+
+$apiInstance = new OpenAPI\Client\Api\FakeClassnameTags123Api(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$client = new \OpenAPI\Client\Model\Client(); // \OpenAPI\Client\Model\Client | client model
+
+try {
+ $result = $apiInstance->testClassname($client);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling FakeClassnameTags123Api->testClassname: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **client** | [**\OpenAPI\Client\Model\Client**](../Model/Client.md)| client model |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Client**](../Model/Client.md)
+
+### Authorization
+
+[api_key_query](../../README.md#api_key_query)
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Api/PetApi.md b/samples/client/petstore/php/psr-18/docs/Api/PetApi.md
new file mode 100644
index 0000000000..568f6c4c6e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/PetApi.md
@@ -0,0 +1,568 @@
+# OpenAPI\Client\PetApi
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**addPet()**](PetApi.md#addPet) | **POST** /pet | Add a new pet to the store
+[**deletePet()**](PetApi.md#deletePet) | **DELETE** /pet/{petId} | Deletes a pet
+[**findPetsByStatus()**](PetApi.md#findPetsByStatus) | **GET** /pet/findByStatus | Finds Pets by status
+[**findPetsByTags()**](PetApi.md#findPetsByTags) | **GET** /pet/findByTags | Finds Pets by tags
+[**getPetById()**](PetApi.md#getPetById) | **GET** /pet/{petId} | Find pet by ID
+[**updatePet()**](PetApi.md#updatePet) | **PUT** /pet | Update an existing pet
+[**updatePetWithForm()**](PetApi.md#updatePetWithForm) | **POST** /pet/{petId} | Updates a pet in the store with form data
+[**uploadFile()**](PetApi.md#uploadFile) | **POST** /pet/{petId}/uploadImage | uploads an image
+[**uploadFileWithRequiredFile()**](PetApi.md#uploadFileWithRequiredFile) | **POST** /fake/{petId}/uploadImageWithRequiredFile | uploads an image (required)
+
+
+## `addPet()`
+
+```php
+addPet($pet)
+```
+
+Add a new pet to the store
+
+
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet = new \OpenAPI\Client\Model\Pet(); // \OpenAPI\Client\Model\Pet | Pet object that needs to be added to the store
+
+try {
+ $apiInstance->addPet($pet);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->addPet: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet** | [**\OpenAPI\Client\Model\Pet**](../Model/Pet.md)| Pet object that needs to be added to the store |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`, `application/xml`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `deletePet()`
+
+```php
+deletePet($pet_id, $api_key)
+```
+
+Deletes a pet
+
+
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet_id = 56; // int | Pet id to delete
+$api_key = 'api_key_example'; // string
+
+try {
+ $apiInstance->deletePet($pet_id, $api_key);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->deletePet: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet_id** | **int**| Pet id to delete |
+ **api_key** | **string**| | [optional]
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `findPetsByStatus()`
+
+```php
+findPetsByStatus($status): \OpenAPI\Client\Model\Pet[]
+```
+
+Finds Pets by status
+
+Multiple status values can be provided with comma separated strings
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$status = array('status_example'); // string[] | Status values that need to be considered for filter
+
+try {
+ $result = $apiInstance->findPetsByStatus($status);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->findPetsByStatus: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **status** | [**string[]**](../Model/string.md)| Status values that need to be considered for filter |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Pet[]**](../Model/Pet.md)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `findPetsByTags()`
+
+```php
+findPetsByTags($tags): \OpenAPI\Client\Model\Pet[]
+```
+
+Finds Pets by tags
+
+Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$tags = array('tags_example'); // string[] | Tags to filter by
+
+try {
+ $result = $apiInstance->findPetsByTags($tags);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->findPetsByTags: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **tags** | [**string[]**](../Model/string.md)| Tags to filter by |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Pet[]**](../Model/Pet.md)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `getPetById()`
+
+```php
+getPetById($pet_id): \OpenAPI\Client\Model\Pet
+```
+
+Find pet by ID
+
+Returns a single pet
+
+### Example
+
+```php
+setApiKey('api_key', 'YOUR_API_KEY');
+// Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
+// $config = OpenAPI\Client\Configuration::getDefaultConfiguration()->setApiKeyPrefix('api_key', 'Bearer');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet_id = 56; // int | ID of pet to return
+
+try {
+ $result = $apiInstance->getPetById($pet_id);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->getPetById: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet_id** | **int**| ID of pet to return |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Pet**](../Model/Pet.md)
+
+### Authorization
+
+[api_key](../../README.md#api_key)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `updatePet()`
+
+```php
+updatePet($pet)
+```
+
+Update an existing pet
+
+
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet = new \OpenAPI\Client\Model\Pet(); // \OpenAPI\Client\Model\Pet | Pet object that needs to be added to the store
+
+try {
+ $apiInstance->updatePet($pet);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->updatePet: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet** | [**\OpenAPI\Client\Model\Pet**](../Model/Pet.md)| Pet object that needs to be added to the store |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`, `application/xml`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `updatePetWithForm()`
+
+```php
+updatePetWithForm($pet_id, $name, $status)
+```
+
+Updates a pet in the store with form data
+
+
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet_id = 56; // int | ID of pet that needs to be updated
+$name = 'name_example'; // string | Updated name of the pet
+$status = 'status_example'; // string | Updated status of the pet
+
+try {
+ $apiInstance->updatePetWithForm($pet_id, $name, $status);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->updatePetWithForm: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet_id** | **int**| ID of pet that needs to be updated |
+ **name** | **string**| Updated name of the pet | [optional]
+ **status** | **string**| Updated status of the pet | [optional]
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: `application/x-www-form-urlencoded`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `uploadFile()`
+
+```php
+uploadFile($pet_id, $additional_metadata, $file): \OpenAPI\Client\Model\ApiResponse
+```
+
+uploads an image
+
+
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet_id = 56; // int | ID of pet to update
+$additional_metadata = 'additional_metadata_example'; // string | Additional data to pass to server
+$file = "/path/to/file.txt"; // \SplFileObject | file to upload
+
+try {
+ $result = $apiInstance->uploadFile($pet_id, $additional_metadata, $file);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->uploadFile: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet_id** | **int**| ID of pet to update |
+ **additional_metadata** | **string**| Additional data to pass to server | [optional]
+ **file** | **\SplFileObject****\SplFileObject**| file to upload | [optional]
+
+### Return type
+
+[**\OpenAPI\Client\Model\ApiResponse**](../Model/ApiResponse.md)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: `multipart/form-data`
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `uploadFileWithRequiredFile()`
+
+```php
+uploadFileWithRequiredFile($pet_id, $required_file, $additional_metadata): \OpenAPI\Client\Model\ApiResponse
+```
+
+uploads an image (required)
+
+
+
+### Example
+
+```php
+setAccessToken('YOUR_ACCESS_TOKEN');
+
+
+$apiInstance = new OpenAPI\Client\Api\PetApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+$pet_id = 56; // int | ID of pet to update
+$required_file = "/path/to/file.txt"; // \SplFileObject | file to upload
+$additional_metadata = 'additional_metadata_example'; // string | Additional data to pass to server
+
+try {
+ $result = $apiInstance->uploadFileWithRequiredFile($pet_id, $required_file, $additional_metadata);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling PetApi->uploadFileWithRequiredFile: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **pet_id** | **int**| ID of pet to update |
+ **required_file** | **\SplFileObject****\SplFileObject**| file to upload |
+ **additional_metadata** | **string**| Additional data to pass to server | [optional]
+
+### Return type
+
+[**\OpenAPI\Client\Model\ApiResponse**](../Model/ApiResponse.md)
+
+### Authorization
+
+[petstore_auth](../../README.md#petstore_auth)
+
+### HTTP request headers
+
+- **Content-Type**: `multipart/form-data`
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Api/StoreApi.md b/samples/client/petstore/php/psr-18/docs/Api/StoreApi.md
new file mode 100644
index 0000000000..b5036ae1b6
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/StoreApi.md
@@ -0,0 +1,237 @@
+# OpenAPI\Client\StoreApi
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**deleteOrder()**](StoreApi.md#deleteOrder) | **DELETE** /store/order/{order_id} | Delete purchase order by ID
+[**getInventory()**](StoreApi.md#getInventory) | **GET** /store/inventory | Returns pet inventories by status
+[**getOrderById()**](StoreApi.md#getOrderById) | **GET** /store/order/{order_id} | Find purchase order by ID
+[**placeOrder()**](StoreApi.md#placeOrder) | **POST** /store/order | Place an order for a pet
+
+
+## `deleteOrder()`
+
+```php
+deleteOrder($order_id)
+```
+
+Delete purchase order by ID
+
+For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors
+
+### Example
+
+```php
+deleteOrder($order_id);
+} catch (Exception $e) {
+ echo 'Exception when calling StoreApi->deleteOrder: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **order_id** | **string**| ID of the order that needs to be deleted |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `getInventory()`
+
+```php
+getInventory(): array
+```
+
+Returns pet inventories by status
+
+Returns a map of status codes to quantities
+
+### Example
+
+```php
+setApiKey('api_key', 'YOUR_API_KEY');
+// Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
+// $config = OpenAPI\Client\Configuration::getDefaultConfiguration()->setApiKeyPrefix('api_key', 'Bearer');
+
+
+$apiInstance = new OpenAPI\Client\Api\StoreApi(
+ // If you want use custom http client, pass your client which implements `Psr\Http\Client\ClientInterface`.
+ // This is optional, `Psr18ClientDiscovery` will be used to find http client. For instance `GuzzleHttp\Client` implements that interface
+ new GuzzleHttp\Client(),
+ $config
+);
+
+try {
+ $result = $apiInstance->getInventory();
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling StoreApi->getInventory: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+**array**
+
+### Authorization
+
+[api_key](../../README.md#api_key)
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `getOrderById()`
+
+```php
+getOrderById($order_id): \OpenAPI\Client\Model\Order
+```
+
+Find purchase order by ID
+
+For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions
+
+### Example
+
+```php
+getOrderById($order_id);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling StoreApi->getOrderById: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **order_id** | **int**| ID of pet that needs to be fetched |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Order**](../Model/Order.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `placeOrder()`
+
+```php
+placeOrder($order): \OpenAPI\Client\Model\Order
+```
+
+Place an order for a pet
+
+
+
+### Example
+
+```php
+placeOrder($order);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling StoreApi->placeOrder: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **order** | [**\OpenAPI\Client\Model\Order**](../Model/Order.md)| order placed for purchasing the pet |
+
+### Return type
+
+[**\OpenAPI\Client\Model\Order**](../Model/Order.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Api/UserApi.md b/samples/client/petstore/php/psr-18/docs/Api/UserApi.md
new file mode 100644
index 0000000000..29ff9f5166
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Api/UserApi.md
@@ -0,0 +1,458 @@
+# OpenAPI\Client\UserApi
+
+All URIs are relative to http://petstore.swagger.io:80/v2.
+
+Method | HTTP request | Description
+------------- | ------------- | -------------
+[**createUser()**](UserApi.md#createUser) | **POST** /user | Create user
+[**createUsersWithArrayInput()**](UserApi.md#createUsersWithArrayInput) | **POST** /user/createWithArray | Creates list of users with given input array
+[**createUsersWithListInput()**](UserApi.md#createUsersWithListInput) | **POST** /user/createWithList | Creates list of users with given input array
+[**deleteUser()**](UserApi.md#deleteUser) | **DELETE** /user/{username} | Delete user
+[**getUserByName()**](UserApi.md#getUserByName) | **GET** /user/{username} | Get user by user name
+[**loginUser()**](UserApi.md#loginUser) | **GET** /user/login | Logs user into the system
+[**logoutUser()**](UserApi.md#logoutUser) | **GET** /user/logout | Logs out current logged in user session
+[**updateUser()**](UserApi.md#updateUser) | **PUT** /user/{username} | Updated user
+
+
+## `createUser()`
+
+```php
+createUser($user)
+```
+
+Create user
+
+This can only be done by the logged in user.
+
+### Example
+
+```php
+createUser($user);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->createUser: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **user** | [**\OpenAPI\Client\Model\User**](../Model/User.md)| Created user object |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `createUsersWithArrayInput()`
+
+```php
+createUsersWithArrayInput($user)
+```
+
+Creates list of users with given input array
+
+
+
+### Example
+
+```php
+createUsersWithArrayInput($user);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->createUsersWithArrayInput: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **user** | [**\OpenAPI\Client\Model\User[]**](../Model/User.md)| List of user object |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `createUsersWithListInput()`
+
+```php
+createUsersWithListInput($user)
+```
+
+Creates list of users with given input array
+
+
+
+### Example
+
+```php
+createUsersWithListInput($user);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->createUsersWithListInput: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **user** | [**\OpenAPI\Client\Model\User[]**](../Model/User.md)| List of user object |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `deleteUser()`
+
+```php
+deleteUser($username)
+```
+
+Delete user
+
+This can only be done by the logged in user.
+
+### Example
+
+```php
+deleteUser($username);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->deleteUser: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **username** | **string**| The name that needs to be deleted |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `getUserByName()`
+
+```php
+getUserByName($username): \OpenAPI\Client\Model\User
+```
+
+Get user by user name
+
+
+
+### Example
+
+```php
+getUserByName($username);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->getUserByName: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **username** | **string**| The name that needs to be fetched. Use user1 for testing. |
+
+### Return type
+
+[**\OpenAPI\Client\Model\User**](../Model/User.md)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `loginUser()`
+
+```php
+loginUser($username, $password): string
+```
+
+Logs user into the system
+
+
+
+### Example
+
+```php
+loginUser($username, $password);
+ print_r($result);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->loginUser: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **username** | **string**| The user name for login |
+ **password** | **string**| The password for login in clear text |
+
+### Return type
+
+**string**
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: `application/xml`, `application/json`
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `logoutUser()`
+
+```php
+logoutUser()
+```
+
+Logs out current logged in user session
+
+
+
+### Example
+
+```php
+logoutUser();
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->logoutUser: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+This endpoint does not need any parameter.
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: Not defined
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
+
+## `updateUser()`
+
+```php
+updateUser($username, $user)
+```
+
+Updated user
+
+This can only be done by the logged in user.
+
+### Example
+
+```php
+updateUser($username, $user);
+} catch (Exception $e) {
+ echo 'Exception when calling UserApi->updateUser: ', $e->getMessage(), PHP_EOL;
+}
+```
+
+### Parameters
+
+Name | Type | Description | Notes
+------------- | ------------- | ------------- | -------------
+ **username** | **string**| name that need to be deleted |
+ **user** | [**\OpenAPI\Client\Model\User**](../Model/User.md)| Updated user object |
+
+### Return type
+
+void (empty response body)
+
+### Authorization
+
+No authorization required
+
+### HTTP request headers
+
+- **Content-Type**: `application/json`
+- **Accept**: Not defined
+
+[[Back to top]](#) [[Back to API list]](../../README.md#endpoints)
+[[Back to Model list]](../../README.md#models)
+[[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/AdditionalPropertiesClass.md b/samples/client/petstore/php/psr-18/docs/Model/AdditionalPropertiesClass.md
new file mode 100644
index 0000000000..bcb2642185
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/AdditionalPropertiesClass.md
@@ -0,0 +1,10 @@
+# # AdditionalPropertiesClass
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**map_property** | **array** | | [optional]
+**map_of_map_property** | **array>** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/AllOfWithSingleRef.md b/samples/client/petstore/php/psr-18/docs/Model/AllOfWithSingleRef.md
new file mode 100644
index 0000000000..d8a2b54b5a
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/AllOfWithSingleRef.md
@@ -0,0 +1,10 @@
+# # AllOfWithSingleRef
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**username** | **string** | | [optional]
+**single_ref_type** | [**\OpenAPI\Client\Model\SingleRefType**](SingleRefType.md) | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Animal.md b/samples/client/petstore/php/psr-18/docs/Model/Animal.md
new file mode 100644
index 0000000000..ee79377b56
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Animal.md
@@ -0,0 +1,10 @@
+# # Animal
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**class_name** | **string** | |
+**color** | **string** | | [optional] [default to 'red']
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ApiResponse.md b/samples/client/petstore/php/psr-18/docs/Model/ApiResponse.md
new file mode 100644
index 0000000000..bd084f0b74
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ApiResponse.md
@@ -0,0 +1,11 @@
+# # ApiResponse
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**code** | **int** | | [optional]
+**type** | **string** | | [optional]
+**message** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ArrayOfArrayOfNumberOnly.md b/samples/client/petstore/php/psr-18/docs/Model/ArrayOfArrayOfNumberOnly.md
new file mode 100644
index 0000000000..45f7d3b861
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ArrayOfArrayOfNumberOnly.md
@@ -0,0 +1,9 @@
+# # ArrayOfArrayOfNumberOnly
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**array_array_number** | **float[][]** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ArrayOfNumberOnly.md b/samples/client/petstore/php/psr-18/docs/Model/ArrayOfNumberOnly.md
new file mode 100644
index 0000000000..f21a9758c4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ArrayOfNumberOnly.md
@@ -0,0 +1,9 @@
+# # ArrayOfNumberOnly
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**array_number** | **float[]** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ArrayTest.md b/samples/client/petstore/php/psr-18/docs/Model/ArrayTest.md
new file mode 100644
index 0000000000..8f260b7c9b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ArrayTest.md
@@ -0,0 +1,11 @@
+# # ArrayTest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**array_of_string** | **string[]** | | [optional]
+**array_array_of_integer** | **int[][]** | | [optional]
+**array_array_of_model** | **\OpenAPI\Client\Model\ReadOnlyFirst[][]** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Capitalization.md b/samples/client/petstore/php/psr-18/docs/Model/Capitalization.md
new file mode 100644
index 0000000000..9984c623ab
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Capitalization.md
@@ -0,0 +1,14 @@
+# # Capitalization
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**small_camel** | **string** | | [optional]
+**capital_camel** | **string** | | [optional]
+**small_snake** | **string** | | [optional]
+**capital_snake** | **string** | | [optional]
+**sca_eth_flow_points** | **string** | | [optional]
+**att_name** | **string** | Name of the pet | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Cat.md b/samples/client/petstore/php/psr-18/docs/Model/Cat.md
new file mode 100644
index 0000000000..28dff94a08
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Cat.md
@@ -0,0 +1,9 @@
+# # Cat
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**declawed** | **bool** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Category.md b/samples/client/petstore/php/psr-18/docs/Model/Category.md
new file mode 100644
index 0000000000..55a1f51150
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Category.md
@@ -0,0 +1,10 @@
+# # Category
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**id** | **int** | | [optional]
+**name** | **string** | | [default to 'default-name']
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ClassModel.md b/samples/client/petstore/php/psr-18/docs/Model/ClassModel.md
new file mode 100644
index 0000000000..8c9707bfd4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ClassModel.md
@@ -0,0 +1,9 @@
+# # ClassModel
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**_class** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Client.md b/samples/client/petstore/php/psr-18/docs/Model/Client.md
new file mode 100644
index 0000000000..3ba14006da
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Client.md
@@ -0,0 +1,9 @@
+# # Client
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**client** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/DeprecatedObject.md b/samples/client/petstore/php/psr-18/docs/Model/DeprecatedObject.md
new file mode 100644
index 0000000000..e5c6c758d1
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/DeprecatedObject.md
@@ -0,0 +1,9 @@
+# # DeprecatedObject
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**name** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Dog.md b/samples/client/petstore/php/psr-18/docs/Model/Dog.md
new file mode 100644
index 0000000000..1face18443
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Dog.md
@@ -0,0 +1,9 @@
+# # Dog
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**breed** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/EnumArrays.md b/samples/client/petstore/php/psr-18/docs/Model/EnumArrays.md
new file mode 100644
index 0000000000..39c30a915f
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/EnumArrays.md
@@ -0,0 +1,10 @@
+# # EnumArrays
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**just_symbol** | **string** | | [optional]
+**array_enum** | **string[]** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/EnumClass.md b/samples/client/petstore/php/psr-18/docs/Model/EnumClass.md
new file mode 100644
index 0000000000..223d525736
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/EnumClass.md
@@ -0,0 +1,8 @@
+# # EnumClass
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/EnumTest.md b/samples/client/petstore/php/psr-18/docs/Model/EnumTest.md
new file mode 100644
index 0000000000..d2e02570c5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/EnumTest.md
@@ -0,0 +1,16 @@
+# # EnumTest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**enum_string** | **string** | | [optional]
+**enum_string_required** | **string** | |
+**enum_integer** | **int** | | [optional]
+**enum_number** | **float** | | [optional]
+**outer_enum** | [**\OpenAPI\Client\Model\OuterEnum**](OuterEnum.md) | | [optional]
+**outer_enum_integer** | [**\OpenAPI\Client\Model\OuterEnumInteger**](OuterEnumInteger.md) | | [optional]
+**outer_enum_default_value** | [**\OpenAPI\Client\Model\OuterEnumDefaultValue**](OuterEnumDefaultValue.md) | | [optional]
+**outer_enum_integer_default_value** | [**\OpenAPI\Client\Model\OuterEnumIntegerDefaultValue**](OuterEnumIntegerDefaultValue.md) | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/FakeBigDecimalMap200Response.md b/samples/client/petstore/php/psr-18/docs/Model/FakeBigDecimalMap200Response.md
new file mode 100644
index 0000000000..cc1f6338a8
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/FakeBigDecimalMap200Response.md
@@ -0,0 +1,10 @@
+# # FakeBigDecimalMap200Response
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**some_id** | **float** | | [optional]
+**some_map** | **array** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/File.md b/samples/client/petstore/php/psr-18/docs/Model/File.md
new file mode 100644
index 0000000000..3d29f9163b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/File.md
@@ -0,0 +1,9 @@
+# # File
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**source_uri** | **string** | Test capitalization | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/FileSchemaTestClass.md b/samples/client/petstore/php/psr-18/docs/Model/FileSchemaTestClass.md
new file mode 100644
index 0000000000..9c05122130
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/FileSchemaTestClass.md
@@ -0,0 +1,10 @@
+# # FileSchemaTestClass
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**file** | [**\OpenAPI\Client\Model\File**](File.md) | | [optional]
+**files** | [**\OpenAPI\Client\Model\File[]**](File.md) | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Foo.md b/samples/client/petstore/php/psr-18/docs/Model/Foo.md
new file mode 100644
index 0000000000..b2f50b38d5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Foo.md
@@ -0,0 +1,9 @@
+# # Foo
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**bar** | **string** | | [optional] [default to 'bar']
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/FooGetDefaultResponse.md b/samples/client/petstore/php/psr-18/docs/Model/FooGetDefaultResponse.md
new file mode 100644
index 0000000000..2e3ee6f683
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/FooGetDefaultResponse.md
@@ -0,0 +1,9 @@
+# # FooGetDefaultResponse
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**string** | [**\OpenAPI\Client\Model\Foo**](Foo.md) | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/FormatTest.md b/samples/client/petstore/php/psr-18/docs/Model/FormatTest.md
new file mode 100644
index 0000000000..81f6387a2e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/FormatTest.md
@@ -0,0 +1,24 @@
+# # FormatTest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**integer** | **int** | | [optional]
+**int32** | **int** | | [optional]
+**int64** | **int** | | [optional]
+**number** | **float** | |
+**float** | **float** | | [optional]
+**double** | **float** | | [optional]
+**decimal** | **float** | | [optional]
+**string** | **string** | | [optional]
+**byte** | **string** | |
+**binary** | **\SplFileObject** | | [optional]
+**date** | **\DateTime** | |
+**date_time** | **\DateTime** | | [optional]
+**uuid** | **string** | | [optional]
+**password** | **string** | |
+**pattern_with_digits** | **string** | A string that is a 10 digit number. Can have leading zeros. | [optional]
+**pattern_with_digits_and_delimiter** | **string** | A string starting with 'image_' (case insensitive) and one to three digits following i.e. Image_01. | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/HasOnlyReadOnly.md b/samples/client/petstore/php/psr-18/docs/Model/HasOnlyReadOnly.md
new file mode 100644
index 0000000000..7a1bb56472
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/HasOnlyReadOnly.md
@@ -0,0 +1,10 @@
+# # HasOnlyReadOnly
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**bar** | **string** | | [optional] [readonly]
+**foo** | **string** | | [optional] [readonly]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/HealthCheckResult.md b/samples/client/petstore/php/psr-18/docs/Model/HealthCheckResult.md
new file mode 100644
index 0000000000..940bcc96ee
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/HealthCheckResult.md
@@ -0,0 +1,9 @@
+# # HealthCheckResult
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**nullable_message** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/MapTest.md b/samples/client/petstore/php/psr-18/docs/Model/MapTest.md
new file mode 100644
index 0000000000..10509cbb6e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/MapTest.md
@@ -0,0 +1,12 @@
+# # MapTest
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**map_map_of_string** | **array>** | | [optional]
+**map_of_enum_string** | **array** | | [optional]
+**direct_map** | **array** | | [optional]
+**indirect_map** | **array** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/MixedPropertiesAndAdditionalPropertiesClass.md b/samples/client/petstore/php/psr-18/docs/Model/MixedPropertiesAndAdditionalPropertiesClass.md
new file mode 100644
index 0000000000..d86cc9fccc
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/MixedPropertiesAndAdditionalPropertiesClass.md
@@ -0,0 +1,11 @@
+# # MixedPropertiesAndAdditionalPropertiesClass
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**uuid** | **string** | | [optional]
+**date_time** | **\DateTime** | | [optional]
+**map** | [**array**](Animal.md) | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Model200Response.md b/samples/client/petstore/php/psr-18/docs/Model/Model200Response.md
new file mode 100644
index 0000000000..3e60cc4f39
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Model200Response.md
@@ -0,0 +1,10 @@
+# # Model200Response
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**name** | **int** | | [optional]
+**class** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ModelList.md b/samples/client/petstore/php/psr-18/docs/Model/ModelList.md
new file mode 100644
index 0000000000..61e65e27c0
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ModelList.md
@@ -0,0 +1,9 @@
+# # ModelList
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**_123_list** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ModelReturn.md b/samples/client/petstore/php/psr-18/docs/Model/ModelReturn.md
new file mode 100644
index 0000000000..efd1e85f1b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ModelReturn.md
@@ -0,0 +1,9 @@
+# # ModelReturn
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**return** | **int** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Name.md b/samples/client/petstore/php/psr-18/docs/Model/Name.md
new file mode 100644
index 0000000000..fd9ef873e7
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Name.md
@@ -0,0 +1,12 @@
+# # Name
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**name** | **int** | |
+**snake_case** | **int** | | [optional] [readonly]
+**property** | **string** | | [optional]
+**_123_number** | **int** | | [optional] [readonly]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/NullableClass.md b/samples/client/petstore/php/psr-18/docs/Model/NullableClass.md
new file mode 100644
index 0000000000..83b78eaa81
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/NullableClass.md
@@ -0,0 +1,20 @@
+# # NullableClass
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**integer_prop** | **int** | | [optional]
+**number_prop** | **float** | | [optional]
+**boolean_prop** | **bool** | | [optional]
+**string_prop** | **string** | | [optional]
+**date_prop** | **\DateTime** | | [optional]
+**datetime_prop** | **\DateTime** | | [optional]
+**array_nullable_prop** | **object[]** | | [optional]
+**array_and_items_nullable_prop** | **object[]** | | [optional]
+**array_items_nullable** | **object[]** | | [optional]
+**object_nullable_prop** | **array** | | [optional]
+**object_and_items_nullable_prop** | **array** | | [optional]
+**object_items_nullable** | **array** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/NumberOnly.md b/samples/client/petstore/php/psr-18/docs/Model/NumberOnly.md
new file mode 100644
index 0000000000..736fa0125d
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/NumberOnly.md
@@ -0,0 +1,9 @@
+# # NumberOnly
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**just_number** | **float** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ObjectWithDeprecatedFields.md b/samples/client/petstore/php/psr-18/docs/Model/ObjectWithDeprecatedFields.md
new file mode 100644
index 0000000000..c2cb996294
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ObjectWithDeprecatedFields.md
@@ -0,0 +1,12 @@
+# # ObjectWithDeprecatedFields
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**uuid** | **string** | | [optional]
+**id** | **float** | | [optional]
+**deprecated_ref** | [**\OpenAPI\Client\Model\DeprecatedObject**](DeprecatedObject.md) | | [optional]
+**bars** | **string[]** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Order.md b/samples/client/petstore/php/psr-18/docs/Model/Order.md
new file mode 100644
index 0000000000..c6ec90a33c
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Order.md
@@ -0,0 +1,14 @@
+# # Order
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**id** | **int** | | [optional]
+**pet_id** | **int** | | [optional]
+**quantity** | **int** | | [optional]
+**ship_date** | **\DateTime** | | [optional]
+**status** | **string** | Order Status | [optional]
+**complete** | **bool** | | [optional] [default to false]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/OuterComposite.md b/samples/client/petstore/php/psr-18/docs/Model/OuterComposite.md
new file mode 100644
index 0000000000..9d5f885b9d
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/OuterComposite.md
@@ -0,0 +1,11 @@
+# # OuterComposite
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**my_number** | **float** | | [optional]
+**my_string** | **string** | | [optional]
+**my_boolean** | **bool** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/OuterEnum.md b/samples/client/petstore/php/psr-18/docs/Model/OuterEnum.md
new file mode 100644
index 0000000000..ae6fde5fb6
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/OuterEnum.md
@@ -0,0 +1,8 @@
+# # OuterEnum
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/OuterEnumDefaultValue.md b/samples/client/petstore/php/psr-18/docs/Model/OuterEnumDefaultValue.md
new file mode 100644
index 0000000000..41e73b701d
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/OuterEnumDefaultValue.md
@@ -0,0 +1,8 @@
+# # OuterEnumDefaultValue
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/OuterEnumInteger.md b/samples/client/petstore/php/psr-18/docs/Model/OuterEnumInteger.md
new file mode 100644
index 0000000000..7253448cd6
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/OuterEnumInteger.md
@@ -0,0 +1,8 @@
+# # OuterEnumInteger
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/OuterEnumIntegerDefaultValue.md b/samples/client/petstore/php/psr-18/docs/Model/OuterEnumIntegerDefaultValue.md
new file mode 100644
index 0000000000..6e4ed357ff
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/OuterEnumIntegerDefaultValue.md
@@ -0,0 +1,8 @@
+# # OuterEnumIntegerDefaultValue
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/OuterObjectWithEnumProperty.md b/samples/client/petstore/php/psr-18/docs/Model/OuterObjectWithEnumProperty.md
new file mode 100644
index 0000000000..f2455a1972
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/OuterObjectWithEnumProperty.md
@@ -0,0 +1,9 @@
+# # OuterObjectWithEnumProperty
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**value** | [**\OpenAPI\Client\Model\OuterEnumInteger**](OuterEnumInteger.md) | |
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Pet.md b/samples/client/petstore/php/psr-18/docs/Model/Pet.md
new file mode 100644
index 0000000000..c9edeaf65b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Pet.md
@@ -0,0 +1,14 @@
+# # Pet
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**id** | **int** | | [optional]
+**category** | [**\OpenAPI\Client\Model\Category**](Category.md) | | [optional]
+**name** | **string** | |
+**photo_urls** | **string[]** | |
+**tags** | [**\OpenAPI\Client\Model\Tag[]**](Tag.md) | | [optional]
+**status** | **string** | pet status in the store | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/PropertyNameMapping.md b/samples/client/petstore/php/psr-18/docs/Model/PropertyNameMapping.md
new file mode 100644
index 0000000000..a85567c69c
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/PropertyNameMapping.md
@@ -0,0 +1,12 @@
+# # PropertyNameMapping
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**http_debug_operation** | **string** | | [optional]
+**underscore_type** | **string** | | [optional]
+**type** | **string** | | [optional]
+**type_with_underscore** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/ReadOnlyFirst.md b/samples/client/petstore/php/psr-18/docs/Model/ReadOnlyFirst.md
new file mode 100644
index 0000000000..5b67e7fdec
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/ReadOnlyFirst.md
@@ -0,0 +1,10 @@
+# # ReadOnlyFirst
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**bar** | **string** | | [optional] [readonly]
+**baz** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/SingleRefType.md b/samples/client/petstore/php/psr-18/docs/Model/SingleRefType.md
new file mode 100644
index 0000000000..6ef5c7e7bf
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/SingleRefType.md
@@ -0,0 +1,8 @@
+# # SingleRefType
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/SpecialModelName.md b/samples/client/petstore/php/psr-18/docs/Model/SpecialModelName.md
new file mode 100644
index 0000000000..7a178c13e5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/SpecialModelName.md
@@ -0,0 +1,9 @@
+# # SpecialModelName
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**special_property_name** | **int** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/Tag.md b/samples/client/petstore/php/psr-18/docs/Model/Tag.md
new file mode 100644
index 0000000000..4cf7084738
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/Tag.md
@@ -0,0 +1,10 @@
+# # Tag
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**id** | **int** | | [optional]
+**name** | **string** | | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/docs/Model/User.md b/samples/client/petstore/php/psr-18/docs/Model/User.md
new file mode 100644
index 0000000000..dde68f38fc
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/docs/Model/User.md
@@ -0,0 +1,16 @@
+# # User
+
+## Properties
+
+Name | Type | Description | Notes
+------------ | ------------- | ------------- | -------------
+**id** | **int** | | [optional]
+**username** | **string** | | [optional]
+**first_name** | **string** | | [optional]
+**last_name** | **string** | | [optional]
+**email** | **string** | | [optional]
+**password** | **string** | | [optional]
+**phone** | **string** | | [optional]
+**user_status** | **int** | User Status | [optional]
+
+[[Back to Model list]](../../README.md#models) [[Back to API list]](../../README.md#endpoints) [[Back to README]](../../README.md)
diff --git a/samples/client/petstore/php/psr-18/git_push.sh b/samples/client/petstore/php/psr-18/git_push.sh
new file mode 100644
index 0000000000..f53a75d4fa
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/git_push.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
+#
+# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com"
+
+git_user_id=$1
+git_repo_id=$2
+release_note=$3
+git_host=$4
+
+if [ "$git_host" = "" ]; then
+ git_host="github.com"
+ echo "[INFO] No command line input provided. Set \$git_host to $git_host"
+fi
+
+if [ "$git_user_id" = "" ]; then
+ git_user_id="GIT_USER_ID"
+ echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id"
+fi
+
+if [ "$git_repo_id" = "" ]; then
+ git_repo_id="GIT_REPO_ID"
+ echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id"
+fi
+
+if [ "$release_note" = "" ]; then
+ release_note="Minor update"
+ echo "[INFO] No command line input provided. Set \$release_note to $release_note"
+fi
+
+# Initialize the local directory as a Git repository
+git init
+
+# Adds the files in the local repository and stages them for commit.
+git add .
+
+# Commits the tracked changes and prepares them to be pushed to a remote repository.
+git commit -m "$release_note"
+
+# Sets the new remote
+git_remote=$(git remote)
+if [ "$git_remote" = "" ]; then # git remote not defined
+
+ if [ "$GIT_TOKEN" = "" ]; then
+ echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment."
+ git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git
+ else
+ git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git
+ fi
+
+fi
+
+git pull origin master
+
+# Pushes (Forces) the changes in the local repository up to the remote repository
+echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git"
+git push origin master 2>&1 | grep -v 'To https'
diff --git a/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php b/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php
new file mode 100644
index 0000000000..f545fc822e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/AnotherFakeApi.php
@@ -0,0 +1,498 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation call123TestSpecialTags
+ *
+ * To test special tags
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Client
+ */
+ public function call123TestSpecialTags($client)
+ {
+ list($response) = $this->call123TestSpecialTagsWithHttpInfo($client);
+ return $response;
+ }
+
+ /**
+ * Operation call123TestSpecialTagsWithHttpInfo
+ *
+ * To test special tags
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Client, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function call123TestSpecialTagsWithHttpInfo($client)
+ {
+ $request = $this->call123TestSpecialTagsRequest($client);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Client' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Client', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Client';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Client',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation call123TestSpecialTagsAsync
+ *
+ * To test special tags
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function call123TestSpecialTagsAsync($client)
+ {
+ return $this->call123TestSpecialTagsAsyncWithHttpInfo($client)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation call123TestSpecialTagsAsyncWithHttpInfo
+ *
+ * To test special tags
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function call123TestSpecialTagsAsyncWithHttpInfo($client)
+ {
+ $returnType = '\OpenAPI\Client\Model\Client';
+ $request = $this->call123TestSpecialTagsRequest($client);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'call123TestSpecialTags'
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function call123TestSpecialTagsRequest($client)
+ {
+ // verify the required parameter 'client' is set
+ if ($client === null || (is_array($client) && count($client) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $client when calling call123TestSpecialTags'
+ );
+ }
+
+ $resourcePath = '/another-fake/dummy';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($client)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($client));
+ } else {
+ $httpBody = $client;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PATCH', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php b/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php
new file mode 100644
index 0000000000..d317b5d5e3
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/DefaultApi.php
@@ -0,0 +1,473 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation fooGet
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\FooGetDefaultResponse
+ */
+ public function fooGet()
+ {
+ list($response) = $this->fooGetWithHttpInfo();
+ return $response;
+ }
+
+ /**
+ * Operation fooGetWithHttpInfo
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\FooGetDefaultResponse, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fooGetWithHttpInfo()
+ {
+ $request = $this->fooGetRequest();
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ default:
+ if ('\OpenAPI\Client\Model\FooGetDefaultResponse' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\FooGetDefaultResponse', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\FooGetDefaultResponse';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ default:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\FooGetDefaultResponse',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fooGetAsync
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fooGetAsync()
+ {
+ return $this->fooGetAsyncWithHttpInfo()
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fooGetAsyncWithHttpInfo
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fooGetAsyncWithHttpInfo()
+ {
+ $returnType = '\OpenAPI\Client\Model\FooGetDefaultResponse';
+ $request = $this->fooGetRequest();
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fooGet'
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fooGetRequest()
+ {
+
+ $resourcePath = '/foo';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php b/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php
new file mode 100644
index 0000000000..aee6cbc163
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/FakeApi.php
@@ -0,0 +1,5137 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation fakeBigDecimalMap
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\FakeBigDecimalMap200Response
+ */
+ public function fakeBigDecimalMap()
+ {
+ list($response) = $this->fakeBigDecimalMapWithHttpInfo();
+ return $response;
+ }
+
+ /**
+ * Operation fakeBigDecimalMapWithHttpInfo
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\FakeBigDecimalMap200Response, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeBigDecimalMapWithHttpInfo()
+ {
+ $request = $this->fakeBigDecimalMapRequest();
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\FakeBigDecimalMap200Response' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\FakeBigDecimalMap200Response', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\FakeBigDecimalMap200Response';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\FakeBigDecimalMap200Response',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeBigDecimalMapAsync
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeBigDecimalMapAsync()
+ {
+ return $this->fakeBigDecimalMapAsyncWithHttpInfo()
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeBigDecimalMapAsyncWithHttpInfo
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeBigDecimalMapAsyncWithHttpInfo()
+ {
+ $returnType = '\OpenAPI\Client\Model\FakeBigDecimalMap200Response';
+ $request = $this->fakeBigDecimalMapRequest();
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeBigDecimalMap'
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeBigDecimalMapRequest()
+ {
+
+ $resourcePath = '/fake/BigDecimalMap';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['*/*']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['*/*'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakeHealthGet
+ *
+ * Health check endpoint
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\HealthCheckResult
+ */
+ public function fakeHealthGet()
+ {
+ list($response) = $this->fakeHealthGetWithHttpInfo();
+ return $response;
+ }
+
+ /**
+ * Operation fakeHealthGetWithHttpInfo
+ *
+ * Health check endpoint
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\HealthCheckResult, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeHealthGetWithHttpInfo()
+ {
+ $request = $this->fakeHealthGetRequest();
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\HealthCheckResult' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\HealthCheckResult', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\HealthCheckResult';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\HealthCheckResult',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeHealthGetAsync
+ *
+ * Health check endpoint
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeHealthGetAsync()
+ {
+ return $this->fakeHealthGetAsyncWithHttpInfo()
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeHealthGetAsyncWithHttpInfo
+ *
+ * Health check endpoint
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeHealthGetAsyncWithHttpInfo()
+ {
+ $returnType = '\OpenAPI\Client\Model\HealthCheckResult';
+ $request = $this->fakeHealthGetRequest();
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeHealthGet'
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeHealthGetRequest()
+ {
+
+ $resourcePath = '/fake/health';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakeHttpSignatureTest
+ *
+ * test http signature authentication
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ * @param string $query_1 query parameter (optional)
+ * @param string $header_1 header parameter (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function fakeHttpSignatureTest($pet, $query_1 = null, $header_1 = null)
+ {
+ $this->fakeHttpSignatureTestWithHttpInfo($pet, $query_1, $header_1);
+ }
+
+ /**
+ * Operation fakeHttpSignatureTestWithHttpInfo
+ *
+ * test http signature authentication
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ * @param string $query_1 query parameter (optional)
+ * @param string $header_1 header parameter (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeHttpSignatureTestWithHttpInfo($pet, $query_1 = null, $header_1 = null)
+ {
+ $request = $this->fakeHttpSignatureTestRequest($pet, $query_1, $header_1);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeHttpSignatureTestAsync
+ *
+ * test http signature authentication
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ * @param string $query_1 query parameter (optional)
+ * @param string $header_1 header parameter (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeHttpSignatureTestAsync($pet, $query_1 = null, $header_1 = null)
+ {
+ return $this->fakeHttpSignatureTestAsyncWithHttpInfo($pet, $query_1, $header_1)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeHttpSignatureTestAsyncWithHttpInfo
+ *
+ * test http signature authentication
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ * @param string $query_1 query parameter (optional)
+ * @param string $header_1 header parameter (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeHttpSignatureTestAsyncWithHttpInfo($pet, $query_1 = null, $header_1 = null)
+ {
+ $returnType = '';
+ $request = $this->fakeHttpSignatureTestRequest($pet, $query_1, $header_1);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeHttpSignatureTest'
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ * @param string $query_1 query parameter (optional)
+ * @param string $header_1 header parameter (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeHttpSignatureTestRequest($pet, $query_1 = null, $header_1 = null)
+ {
+ // verify the required parameter 'pet' is set
+ if ($pet === null || (is_array($pet) && count($pet) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet when calling fakeHttpSignatureTest'
+ );
+ }
+
+ $resourcePath = '/fake/http-signature-test';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if ($query_1 !== null) {
+ if('form' === 'form' && is_array($query_1)) {
+ foreach($query_1 as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['query_1'] = $query_1;
+ }
+ }
+
+ // header params
+ if ($header_1 !== null) {
+ $headerParams['header_1'] = ObjectSerializer::toHeaderValue($header_1);
+ }
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json', 'application/xml']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($pet)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($pet));
+ } else {
+ $httpBody = $pet;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakeOuterBooleanSerialize
+ *
+ * @param bool $body Input boolean as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return bool
+ */
+ public function fakeOuterBooleanSerialize($body = null)
+ {
+ list($response) = $this->fakeOuterBooleanSerializeWithHttpInfo($body);
+ return $response;
+ }
+
+ /**
+ * Operation fakeOuterBooleanSerializeWithHttpInfo
+ *
+ * @param bool $body Input boolean as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of bool, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeOuterBooleanSerializeWithHttpInfo($body = null)
+ {
+ $request = $this->fakeOuterBooleanSerializeRequest($body);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('bool' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, 'bool', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = 'bool';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ 'bool',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeOuterBooleanSerializeAsync
+ *
+ * @param bool $body Input boolean as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterBooleanSerializeAsync($body = null)
+ {
+ return $this->fakeOuterBooleanSerializeAsyncWithHttpInfo($body)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeOuterBooleanSerializeAsyncWithHttpInfo
+ *
+ * @param bool $body Input boolean as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterBooleanSerializeAsyncWithHttpInfo($body = null)
+ {
+ $returnType = 'bool';
+ $request = $this->fakeOuterBooleanSerializeRequest($body);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeOuterBooleanSerialize'
+ *
+ * @param bool $body Input boolean as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeOuterBooleanSerializeRequest($body = null)
+ {
+
+ $resourcePath = '/fake/outer/boolean';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['*/*']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['*/*'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($body)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body));
+ } else {
+ $httpBody = $body;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakeOuterCompositeSerialize
+ *
+ * @param \OpenAPI\Client\Model\OuterComposite $outer_composite Input composite as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\OuterComposite
+ */
+ public function fakeOuterCompositeSerialize($outer_composite = null)
+ {
+ list($response) = $this->fakeOuterCompositeSerializeWithHttpInfo($outer_composite);
+ return $response;
+ }
+
+ /**
+ * Operation fakeOuterCompositeSerializeWithHttpInfo
+ *
+ * @param \OpenAPI\Client\Model\OuterComposite $outer_composite Input composite as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\OuterComposite, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeOuterCompositeSerializeWithHttpInfo($outer_composite = null)
+ {
+ $request = $this->fakeOuterCompositeSerializeRequest($outer_composite);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\OuterComposite' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\OuterComposite', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\OuterComposite';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\OuterComposite',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeOuterCompositeSerializeAsync
+ *
+ * @param \OpenAPI\Client\Model\OuterComposite $outer_composite Input composite as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterCompositeSerializeAsync($outer_composite = null)
+ {
+ return $this->fakeOuterCompositeSerializeAsyncWithHttpInfo($outer_composite)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeOuterCompositeSerializeAsyncWithHttpInfo
+ *
+ * @param \OpenAPI\Client\Model\OuterComposite $outer_composite Input composite as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterCompositeSerializeAsyncWithHttpInfo($outer_composite = null)
+ {
+ $returnType = '\OpenAPI\Client\Model\OuterComposite';
+ $request = $this->fakeOuterCompositeSerializeRequest($outer_composite);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeOuterCompositeSerialize'
+ *
+ * @param \OpenAPI\Client\Model\OuterComposite $outer_composite Input composite as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeOuterCompositeSerializeRequest($outer_composite = null)
+ {
+
+ $resourcePath = '/fake/outer/composite';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['*/*']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['*/*'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($outer_composite)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($outer_composite));
+ } else {
+ $httpBody = $outer_composite;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakeOuterNumberSerialize
+ *
+ * @param float $body Input number as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return float
+ */
+ public function fakeOuterNumberSerialize($body = null)
+ {
+ list($response) = $this->fakeOuterNumberSerializeWithHttpInfo($body);
+ return $response;
+ }
+
+ /**
+ * Operation fakeOuterNumberSerializeWithHttpInfo
+ *
+ * @param float $body Input number as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of float, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeOuterNumberSerializeWithHttpInfo($body = null)
+ {
+ $request = $this->fakeOuterNumberSerializeRequest($body);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('float' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, 'float', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = 'float';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ 'float',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeOuterNumberSerializeAsync
+ *
+ * @param float $body Input number as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterNumberSerializeAsync($body = null)
+ {
+ return $this->fakeOuterNumberSerializeAsyncWithHttpInfo($body)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeOuterNumberSerializeAsyncWithHttpInfo
+ *
+ * @param float $body Input number as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterNumberSerializeAsyncWithHttpInfo($body = null)
+ {
+ $returnType = 'float';
+ $request = $this->fakeOuterNumberSerializeRequest($body);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeOuterNumberSerialize'
+ *
+ * @param float $body Input number as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeOuterNumberSerializeRequest($body = null)
+ {
+
+ $resourcePath = '/fake/outer/number';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['*/*']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['*/*'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($body)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body));
+ } else {
+ $httpBody = $body;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakeOuterStringSerialize
+ *
+ * @param string $body Input string as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return string
+ */
+ public function fakeOuterStringSerialize($body = null)
+ {
+ list($response) = $this->fakeOuterStringSerializeWithHttpInfo($body);
+ return $response;
+ }
+
+ /**
+ * Operation fakeOuterStringSerializeWithHttpInfo
+ *
+ * @param string $body Input string as post body (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of string, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakeOuterStringSerializeWithHttpInfo($body = null)
+ {
+ $request = $this->fakeOuterStringSerializeRequest($body);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('string' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, 'string', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = 'string';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ 'string',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakeOuterStringSerializeAsync
+ *
+ * @param string $body Input string as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterStringSerializeAsync($body = null)
+ {
+ return $this->fakeOuterStringSerializeAsyncWithHttpInfo($body)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakeOuterStringSerializeAsyncWithHttpInfo
+ *
+ * @param string $body Input string as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakeOuterStringSerializeAsyncWithHttpInfo($body = null)
+ {
+ $returnType = 'string';
+ $request = $this->fakeOuterStringSerializeRequest($body);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakeOuterStringSerialize'
+ *
+ * @param string $body Input string as post body (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakeOuterStringSerializeRequest($body = null)
+ {
+
+ $resourcePath = '/fake/outer/string';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['*/*']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['*/*'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($body)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body));
+ } else {
+ $httpBody = $body;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation fakePropertyEnumIntegerSerialize
+ *
+ * @param \OpenAPI\Client\Model\OuterObjectWithEnumProperty $outer_object_with_enum_property Input enum (int) as post body (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\OuterObjectWithEnumProperty
+ */
+ public function fakePropertyEnumIntegerSerialize($outer_object_with_enum_property)
+ {
+ list($response) = $this->fakePropertyEnumIntegerSerializeWithHttpInfo($outer_object_with_enum_property);
+ return $response;
+ }
+
+ /**
+ * Operation fakePropertyEnumIntegerSerializeWithHttpInfo
+ *
+ * @param \OpenAPI\Client\Model\OuterObjectWithEnumProperty $outer_object_with_enum_property Input enum (int) as post body (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\OuterObjectWithEnumProperty, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function fakePropertyEnumIntegerSerializeWithHttpInfo($outer_object_with_enum_property)
+ {
+ $request = $this->fakePropertyEnumIntegerSerializeRequest($outer_object_with_enum_property);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\OuterObjectWithEnumProperty' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\OuterObjectWithEnumProperty', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\OuterObjectWithEnumProperty';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\OuterObjectWithEnumProperty',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation fakePropertyEnumIntegerSerializeAsync
+ *
+ * @param \OpenAPI\Client\Model\OuterObjectWithEnumProperty $outer_object_with_enum_property Input enum (int) as post body (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakePropertyEnumIntegerSerializeAsync($outer_object_with_enum_property)
+ {
+ return $this->fakePropertyEnumIntegerSerializeAsyncWithHttpInfo($outer_object_with_enum_property)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation fakePropertyEnumIntegerSerializeAsyncWithHttpInfo
+ *
+ * @param \OpenAPI\Client\Model\OuterObjectWithEnumProperty $outer_object_with_enum_property Input enum (int) as post body (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function fakePropertyEnumIntegerSerializeAsyncWithHttpInfo($outer_object_with_enum_property)
+ {
+ $returnType = '\OpenAPI\Client\Model\OuterObjectWithEnumProperty';
+ $request = $this->fakePropertyEnumIntegerSerializeRequest($outer_object_with_enum_property);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'fakePropertyEnumIntegerSerialize'
+ *
+ * @param \OpenAPI\Client\Model\OuterObjectWithEnumProperty $outer_object_with_enum_property Input enum (int) as post body (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function fakePropertyEnumIntegerSerializeRequest($outer_object_with_enum_property)
+ {
+ // verify the required parameter 'outer_object_with_enum_property' is set
+ if ($outer_object_with_enum_property === null || (is_array($outer_object_with_enum_property) && count($outer_object_with_enum_property) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $outer_object_with_enum_property when calling fakePropertyEnumIntegerSerialize'
+ );
+ }
+
+ $resourcePath = '/fake/property/enum-int';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['*/*']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['*/*'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($outer_object_with_enum_property)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($outer_object_with_enum_property));
+ } else {
+ $httpBody = $outer_object_with_enum_property;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation getParameterNameMapping
+ *
+ * parameter name mapping test
+ *
+ * @param int $underscore_type _type (required)
+ * @param string $type type (required)
+ * @param string $type_with_underscore type_ (required)
+ * @param string $type_with_dash type- (required)
+ * @param string $http_debug_option http debug option (to test parameter naming option) (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function getParameterNameMapping($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+ {
+ $this->getParameterNameMappingWithHttpInfo($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option);
+ }
+
+ /**
+ * Operation getParameterNameMappingWithHttpInfo
+ *
+ * parameter name mapping test
+ *
+ * @param int $underscore_type _type (required)
+ * @param string $type type (required)
+ * @param string $type_with_underscore type_ (required)
+ * @param string $type_with_dash type- (required)
+ * @param string $http_debug_option http debug option (to test parameter naming option) (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function getParameterNameMappingWithHttpInfo($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+ {
+ $request = $this->getParameterNameMappingRequest($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation getParameterNameMappingAsync
+ *
+ * parameter name mapping test
+ *
+ * @param int $underscore_type _type (required)
+ * @param string $type type (required)
+ * @param string $type_with_underscore type_ (required)
+ * @param string $type_with_dash type- (required)
+ * @param string $http_debug_option http debug option (to test parameter naming option) (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getParameterNameMappingAsync($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+ {
+ return $this->getParameterNameMappingAsyncWithHttpInfo($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation getParameterNameMappingAsyncWithHttpInfo
+ *
+ * parameter name mapping test
+ *
+ * @param int $underscore_type _type (required)
+ * @param string $type type (required)
+ * @param string $type_with_underscore type_ (required)
+ * @param string $type_with_dash type- (required)
+ * @param string $http_debug_option http debug option (to test parameter naming option) (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getParameterNameMappingAsyncWithHttpInfo($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+ {
+ $returnType = '';
+ $request = $this->getParameterNameMappingRequest($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'getParameterNameMapping'
+ *
+ * @param int $underscore_type _type (required)
+ * @param string $type type (required)
+ * @param string $type_with_underscore type_ (required)
+ * @param string $type_with_dash type- (required)
+ * @param string $http_debug_option http debug option (to test parameter naming option) (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function getParameterNameMappingRequest($underscore_type, $type, $type_with_underscore, $type_with_dash, $http_debug_option)
+ {
+ // verify the required parameter 'underscore_type' is set
+ if ($underscore_type === null || (is_array($underscore_type) && count($underscore_type) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $underscore_type when calling getParameterNameMapping'
+ );
+ }
+ // verify the required parameter 'type' is set
+ if ($type === null || (is_array($type) && count($type) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $type when calling getParameterNameMapping'
+ );
+ }
+ // verify the required parameter 'type_with_underscore' is set
+ if ($type_with_underscore === null || (is_array($type_with_underscore) && count($type_with_underscore) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $type_with_underscore when calling getParameterNameMapping'
+ );
+ }
+ // verify the required parameter 'type_with_dash' is set
+ if ($type_with_dash === null || (is_array($type_with_dash) && count($type_with_dash) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $type_with_dash when calling getParameterNameMapping'
+ );
+ }
+ // verify the required parameter 'http_debug_option' is set
+ if ($http_debug_option === null || (is_array($http_debug_option) && count($http_debug_option) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $http_debug_option when calling getParameterNameMapping'
+ );
+ }
+
+ $resourcePath = '/fake/parameter-name-mapping';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if ($type !== null) {
+ if('form' === 'form' && is_array($type)) {
+ foreach($type as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['type'] = $type;
+ }
+ }
+ // query params
+ if ($http_debug_option !== null) {
+ if('form' === 'form' && is_array($http_debug_option)) {
+ foreach($http_debug_option as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['http_debug_option'] = $http_debug_option;
+ }
+ }
+
+ // header params
+ if ($underscore_type !== null) {
+ $headerParams['_type'] = ObjectSerializer::toHeaderValue($underscore_type);
+ }
+ // header params
+ if ($type_with_underscore !== null) {
+ $headerParams['type_'] = ObjectSerializer::toHeaderValue($type_with_underscore);
+ }
+ // header params
+ if ($type_with_dash !== null) {
+ $headerParams['type-'] = ObjectSerializer::toHeaderValue($type_with_dash);
+ }
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testBodyWithBinary
+ *
+ * @param \SplFileObject $body image to upload (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testBodyWithBinary($body)
+ {
+ $this->testBodyWithBinaryWithHttpInfo($body);
+ }
+
+ /**
+ * Operation testBodyWithBinaryWithHttpInfo
+ *
+ * @param \SplFileObject $body image to upload (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testBodyWithBinaryWithHttpInfo($body)
+ {
+ $request = $this->testBodyWithBinaryRequest($body);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testBodyWithBinaryAsync
+ *
+ * @param \SplFileObject $body image to upload (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testBodyWithBinaryAsync($body)
+ {
+ return $this->testBodyWithBinaryAsyncWithHttpInfo($body)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testBodyWithBinaryAsyncWithHttpInfo
+ *
+ * @param \SplFileObject $body image to upload (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testBodyWithBinaryAsyncWithHttpInfo($body)
+ {
+ $returnType = '';
+ $request = $this->testBodyWithBinaryRequest($body);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testBodyWithBinary'
+ *
+ * @param \SplFileObject $body image to upload (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testBodyWithBinaryRequest($body)
+ {
+ // verify the required parameter 'body' is set
+ if ($body === null || (is_array($body) && count($body) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $body when calling testBodyWithBinary'
+ );
+ }
+
+ $resourcePath = '/fake/body-with-binary';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['image/png']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($body)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($body));
+ } else {
+ $httpBody = $body;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PUT', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testBodyWithFileSchema
+ *
+ * @param \OpenAPI\Client\Model\FileSchemaTestClass $file_schema_test_class file_schema_test_class (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testBodyWithFileSchema($file_schema_test_class)
+ {
+ $this->testBodyWithFileSchemaWithHttpInfo($file_schema_test_class);
+ }
+
+ /**
+ * Operation testBodyWithFileSchemaWithHttpInfo
+ *
+ * @param \OpenAPI\Client\Model\FileSchemaTestClass $file_schema_test_class (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testBodyWithFileSchemaWithHttpInfo($file_schema_test_class)
+ {
+ $request = $this->testBodyWithFileSchemaRequest($file_schema_test_class);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testBodyWithFileSchemaAsync
+ *
+ * @param \OpenAPI\Client\Model\FileSchemaTestClass $file_schema_test_class (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testBodyWithFileSchemaAsync($file_schema_test_class)
+ {
+ return $this->testBodyWithFileSchemaAsyncWithHttpInfo($file_schema_test_class)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testBodyWithFileSchemaAsyncWithHttpInfo
+ *
+ * @param \OpenAPI\Client\Model\FileSchemaTestClass $file_schema_test_class (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testBodyWithFileSchemaAsyncWithHttpInfo($file_schema_test_class)
+ {
+ $returnType = '';
+ $request = $this->testBodyWithFileSchemaRequest($file_schema_test_class);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testBodyWithFileSchema'
+ *
+ * @param \OpenAPI\Client\Model\FileSchemaTestClass $file_schema_test_class (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testBodyWithFileSchemaRequest($file_schema_test_class)
+ {
+ // verify the required parameter 'file_schema_test_class' is set
+ if ($file_schema_test_class === null || (is_array($file_schema_test_class) && count($file_schema_test_class) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $file_schema_test_class when calling testBodyWithFileSchema'
+ );
+ }
+
+ $resourcePath = '/fake/body-with-file-schema';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($file_schema_test_class)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($file_schema_test_class));
+ } else {
+ $httpBody = $file_schema_test_class;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PUT', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testBodyWithQueryParams
+ *
+ * @param string $query query (required)
+ * @param \OpenAPI\Client\Model\User $user user (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testBodyWithQueryParams($query, $user)
+ {
+ $this->testBodyWithQueryParamsWithHttpInfo($query, $user);
+ }
+
+ /**
+ * Operation testBodyWithQueryParamsWithHttpInfo
+ *
+ * @param string $query (required)
+ * @param \OpenAPI\Client\Model\User $user (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testBodyWithQueryParamsWithHttpInfo($query, $user)
+ {
+ $request = $this->testBodyWithQueryParamsRequest($query, $user);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testBodyWithQueryParamsAsync
+ *
+ * @param string $query (required)
+ * @param \OpenAPI\Client\Model\User $user (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testBodyWithQueryParamsAsync($query, $user)
+ {
+ return $this->testBodyWithQueryParamsAsyncWithHttpInfo($query, $user)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testBodyWithQueryParamsAsyncWithHttpInfo
+ *
+ * @param string $query (required)
+ * @param \OpenAPI\Client\Model\User $user (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testBodyWithQueryParamsAsyncWithHttpInfo($query, $user)
+ {
+ $returnType = '';
+ $request = $this->testBodyWithQueryParamsRequest($query, $user);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testBodyWithQueryParams'
+ *
+ * @param string $query (required)
+ * @param \OpenAPI\Client\Model\User $user (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testBodyWithQueryParamsRequest($query, $user)
+ {
+ // verify the required parameter 'query' is set
+ if ($query === null || (is_array($query) && count($query) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $query when calling testBodyWithQueryParams'
+ );
+ }
+ // verify the required parameter 'user' is set
+ if ($user === null || (is_array($user) && count($user) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $user when calling testBodyWithQueryParams'
+ );
+ }
+
+ $resourcePath = '/fake/body-with-query-params';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if ($query !== null) {
+ if('form' === 'form' && is_array($query)) {
+ foreach($query as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['query'] = $query;
+ }
+ }
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($user)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user));
+ } else {
+ $httpBody = $user;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PUT', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testClientModel
+ *
+ * To test \"client\" model
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Client
+ */
+ public function testClientModel($client)
+ {
+ list($response) = $this->testClientModelWithHttpInfo($client);
+ return $response;
+ }
+
+ /**
+ * Operation testClientModelWithHttpInfo
+ *
+ * To test \"client\" model
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Client, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testClientModelWithHttpInfo($client)
+ {
+ $request = $this->testClientModelRequest($client);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Client' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Client', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Client';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Client',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testClientModelAsync
+ *
+ * To test \"client\" model
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testClientModelAsync($client)
+ {
+ return $this->testClientModelAsyncWithHttpInfo($client)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testClientModelAsyncWithHttpInfo
+ *
+ * To test \"client\" model
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testClientModelAsyncWithHttpInfo($client)
+ {
+ $returnType = '\OpenAPI\Client\Model\Client';
+ $request = $this->testClientModelRequest($client);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testClientModel'
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testClientModelRequest($client)
+ {
+ // verify the required parameter 'client' is set
+ if ($client === null || (is_array($client) && count($client) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $client when calling testClientModel'
+ );
+ }
+
+ $resourcePath = '/fake';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($client)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($client));
+ } else {
+ $httpBody = $client;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PATCH', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testEndpointParameters
+ *
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+ *
+ * @param float $number None (required)
+ * @param float $double None (required)
+ * @param string $pattern_without_delimiter None (required)
+ * @param string $byte None (required)
+ * @param int $integer None (optional)
+ * @param int $int32 None (optional)
+ * @param int $int64 None (optional)
+ * @param float $float None (optional)
+ * @param string $string None (optional)
+ * @param \SplFileObject $binary None (optional)
+ * @param \DateTime $date None (optional)
+ * @param \DateTime $date_time None (optional)
+ * @param string $password None (optional)
+ * @param string $callback None (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testEndpointParameters($number, $double, $pattern_without_delimiter, $byte, $integer = null, $int32 = null, $int64 = null, $float = null, $string = null, $binary = null, $date = null, $date_time = null, $password = null, $callback = null)
+ {
+ $this->testEndpointParametersWithHttpInfo($number, $double, $pattern_without_delimiter, $byte, $integer, $int32, $int64, $float, $string, $binary, $date, $date_time, $password, $callback);
+ }
+
+ /**
+ * Operation testEndpointParametersWithHttpInfo
+ *
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+ *
+ * @param float $number None (required)
+ * @param float $double None (required)
+ * @param string $pattern_without_delimiter None (required)
+ * @param string $byte None (required)
+ * @param int $integer None (optional)
+ * @param int $int32 None (optional)
+ * @param int $int64 None (optional)
+ * @param float $float None (optional)
+ * @param string $string None (optional)
+ * @param \SplFileObject $binary None (optional)
+ * @param \DateTime $date None (optional)
+ * @param \DateTime $date_time None (optional)
+ * @param string $password None (optional)
+ * @param string $callback None (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testEndpointParametersWithHttpInfo($number, $double, $pattern_without_delimiter, $byte, $integer = null, $int32 = null, $int64 = null, $float = null, $string = null, $binary = null, $date = null, $date_time = null, $password = null, $callback = null)
+ {
+ $request = $this->testEndpointParametersRequest($number, $double, $pattern_without_delimiter, $byte, $integer, $int32, $int64, $float, $string, $binary, $date, $date_time, $password, $callback);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testEndpointParametersAsync
+ *
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+ *
+ * @param float $number None (required)
+ * @param float $double None (required)
+ * @param string $pattern_without_delimiter None (required)
+ * @param string $byte None (required)
+ * @param int $integer None (optional)
+ * @param int $int32 None (optional)
+ * @param int $int64 None (optional)
+ * @param float $float None (optional)
+ * @param string $string None (optional)
+ * @param \SplFileObject $binary None (optional)
+ * @param \DateTime $date None (optional)
+ * @param \DateTime $date_time None (optional)
+ * @param string $password None (optional)
+ * @param string $callback None (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testEndpointParametersAsync($number, $double, $pattern_without_delimiter, $byte, $integer = null, $int32 = null, $int64 = null, $float = null, $string = null, $binary = null, $date = null, $date_time = null, $password = null, $callback = null)
+ {
+ return $this->testEndpointParametersAsyncWithHttpInfo($number, $double, $pattern_without_delimiter, $byte, $integer, $int32, $int64, $float, $string, $binary, $date, $date_time, $password, $callback)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testEndpointParametersAsyncWithHttpInfo
+ *
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트
+ *
+ * @param float $number None (required)
+ * @param float $double None (required)
+ * @param string $pattern_without_delimiter None (required)
+ * @param string $byte None (required)
+ * @param int $integer None (optional)
+ * @param int $int32 None (optional)
+ * @param int $int64 None (optional)
+ * @param float $float None (optional)
+ * @param string $string None (optional)
+ * @param \SplFileObject $binary None (optional)
+ * @param \DateTime $date None (optional)
+ * @param \DateTime $date_time None (optional)
+ * @param string $password None (optional)
+ * @param string $callback None (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testEndpointParametersAsyncWithHttpInfo($number, $double, $pattern_without_delimiter, $byte, $integer = null, $int32 = null, $int64 = null, $float = null, $string = null, $binary = null, $date = null, $date_time = null, $password = null, $callback = null)
+ {
+ $returnType = '';
+ $request = $this->testEndpointParametersRequest($number, $double, $pattern_without_delimiter, $byte, $integer, $int32, $int64, $float, $string, $binary, $date, $date_time, $password, $callback);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testEndpointParameters'
+ *
+ * @param float $number None (required)
+ * @param float $double None (required)
+ * @param string $pattern_without_delimiter None (required)
+ * @param string $byte None (required)
+ * @param int $integer None (optional)
+ * @param int $int32 None (optional)
+ * @param int $int64 None (optional)
+ * @param float $float None (optional)
+ * @param string $string None (optional)
+ * @param \SplFileObject $binary None (optional)
+ * @param \DateTime $date None (optional)
+ * @param \DateTime $date_time None (optional)
+ * @param string $password None (optional)
+ * @param string $callback None (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testEndpointParametersRequest($number, $double, $pattern_without_delimiter, $byte, $integer = null, $int32 = null, $int64 = null, $float = null, $string = null, $binary = null, $date = null, $date_time = null, $password = null, $callback = null)
+ {
+ // verify the required parameter 'number' is set
+ if ($number === null || (is_array($number) && count($number) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $number when calling testEndpointParameters'
+ );
+ }
+ if ($number > 543.2) {
+ throw new \InvalidArgumentException('invalid value for "$number" when calling FakeApi.testEndpointParameters, must be smaller than or equal to 543.2.');
+ }
+ if ($number < 32.1) {
+ throw new \InvalidArgumentException('invalid value for "$number" when calling FakeApi.testEndpointParameters, must be bigger than or equal to 32.1.');
+ }
+
+ // verify the required parameter 'double' is set
+ if ($double === null || (is_array($double) && count($double) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $double when calling testEndpointParameters'
+ );
+ }
+ if ($double > 123.4) {
+ throw new \InvalidArgumentException('invalid value for "$double" when calling FakeApi.testEndpointParameters, must be smaller than or equal to 123.4.');
+ }
+ if ($double < 67.8) {
+ throw new \InvalidArgumentException('invalid value for "$double" when calling FakeApi.testEndpointParameters, must be bigger than or equal to 67.8.');
+ }
+
+ // verify the required parameter 'pattern_without_delimiter' is set
+ if ($pattern_without_delimiter === null || (is_array($pattern_without_delimiter) && count($pattern_without_delimiter) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pattern_without_delimiter when calling testEndpointParameters'
+ );
+ }
+ if (!preg_match("/^[A-Z].*/", $pattern_without_delimiter)) {
+ throw new \InvalidArgumentException("invalid value for \"pattern_without_delimiter\" when calling FakeApi.testEndpointParameters, must conform to the pattern /^[A-Z].*/.");
+ }
+
+ // verify the required parameter 'byte' is set
+ if ($byte === null || (is_array($byte) && count($byte) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $byte when calling testEndpointParameters'
+ );
+ }
+ if ($integer !== null && $integer > 100) {
+ throw new \InvalidArgumentException('invalid value for "$integer" when calling FakeApi.testEndpointParameters, must be smaller than or equal to 100.');
+ }
+ if ($integer !== null && $integer < 10) {
+ throw new \InvalidArgumentException('invalid value for "$integer" when calling FakeApi.testEndpointParameters, must be bigger than or equal to 10.');
+ }
+
+ if ($int32 !== null && $int32 > 200) {
+ throw new \InvalidArgumentException('invalid value for "$int32" when calling FakeApi.testEndpointParameters, must be smaller than or equal to 200.');
+ }
+ if ($int32 !== null && $int32 < 20) {
+ throw new \InvalidArgumentException('invalid value for "$int32" when calling FakeApi.testEndpointParameters, must be bigger than or equal to 20.');
+ }
+
+ if ($float !== null && $float > 987.6) {
+ throw new \InvalidArgumentException('invalid value for "$float" when calling FakeApi.testEndpointParameters, must be smaller than or equal to 987.6.');
+ }
+
+ if ($string !== null && !preg_match("/[a-z]/i", $string)) {
+ throw new \InvalidArgumentException("invalid value for \"string\" when calling FakeApi.testEndpointParameters, must conform to the pattern /[a-z]/i.");
+ }
+
+ if ($password !== null && strlen($password) > 64) {
+ throw new \InvalidArgumentException('invalid length for "$password" when calling FakeApi.testEndpointParameters, must be smaller than or equal to 64.');
+ }
+ if ($password !== null && strlen($password) < 10) {
+ throw new \InvalidArgumentException('invalid length for "$password" when calling FakeApi.testEndpointParameters, must be bigger than or equal to 10.');
+ }
+
+
+ $resourcePath = '/fake';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+ // form params
+ if ($integer !== null) {
+ $formParams['integer'] = ObjectSerializer::toFormValue($integer);
+ }
+ // form params
+ if ($int32 !== null) {
+ $formParams['int32'] = ObjectSerializer::toFormValue($int32);
+ }
+ // form params
+ if ($int64 !== null) {
+ $formParams['int64'] = ObjectSerializer::toFormValue($int64);
+ }
+ // form params
+ if ($number !== null) {
+ $formParams['number'] = ObjectSerializer::toFormValue($number);
+ }
+ // form params
+ if ($float !== null) {
+ $formParams['float'] = ObjectSerializer::toFormValue($float);
+ }
+ // form params
+ if ($double !== null) {
+ $formParams['double'] = ObjectSerializer::toFormValue($double);
+ }
+ // form params
+ if ($string !== null) {
+ $formParams['string'] = ObjectSerializer::toFormValue($string);
+ }
+ // form params
+ if ($pattern_without_delimiter !== null) {
+ $formParams['pattern_without_delimiter'] = ObjectSerializer::toFormValue($pattern_without_delimiter);
+ }
+ // form params
+ if ($byte !== null) {
+ $formParams['byte'] = ObjectSerializer::toFormValue($byte);
+ }
+ // form params
+ if ($binary !== null) {
+ $multipart = true;
+ $formParams['binary'] = [];
+ $paramFiles = is_array($binary) ? $binary : [$binary];
+ foreach ($paramFiles as $paramFile) {
+ $formParams['binary'][] = \GuzzleHttp\Psr7\try_fopen(
+ ObjectSerializer::toFormValue($paramFile),
+ 'rb'
+ );
+ }
+ }
+ // form params
+ if ($date !== null) {
+ $formParams['date'] = ObjectSerializer::toFormValue($date);
+ }
+ // form params
+ if ($date_time !== null) {
+ $formParams['dateTime'] = ObjectSerializer::toFormValue($date_time);
+ }
+ // form params
+ if ($password !== null) {
+ $formParams['password'] = ObjectSerializer::toFormValue($password);
+ }
+ // form params
+ if ($callback !== null) {
+ $formParams['callback'] = ObjectSerializer::toFormValue($callback);
+ }
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/x-www-form-urlencoded']
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires HTTP basic authentication
+ if (!empty($this->config->getUsername()) || !(empty($this->config->getPassword()))) {
+ $headers['Authorization'] = 'Basic ' . base64_encode($this->config->getUsername() . ":" . $this->config->getPassword());
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testEnumParameters
+ *
+ * To test enum parameters
+ *
+ * @param string[] $enum_header_string_array Header parameter enum test (string array) (optional)
+ * @param string $enum_header_string Header parameter enum test (string) (optional, default to '-efg')
+ * @param string[] $enum_query_string_array Query parameter enum test (string array) (optional)
+ * @param string $enum_query_string Query parameter enum test (string) (optional, default to '-efg')
+ * @param int $enum_query_integer Query parameter enum test (double) (optional)
+ * @param float $enum_query_double Query parameter enum test (double) (optional)
+ * @param \OpenAPI\Client\Model\EnumClass[] $enum_query_model_array enum_query_model_array (optional)
+ * @param string[] $enum_form_string_array Form parameter enum test (string array) (optional, default to '$')
+ * @param string $enum_form_string Form parameter enum test (string) (optional, default to '-efg')
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testEnumParameters($enum_header_string_array = null, $enum_header_string = '-efg', $enum_query_string_array = null, $enum_query_string = '-efg', $enum_query_integer = null, $enum_query_double = null, $enum_query_model_array = null, $enum_form_string_array = '$', $enum_form_string = '-efg')
+ {
+ $this->testEnumParametersWithHttpInfo($enum_header_string_array, $enum_header_string, $enum_query_string_array, $enum_query_string, $enum_query_integer, $enum_query_double, $enum_query_model_array, $enum_form_string_array, $enum_form_string);
+ }
+
+ /**
+ * Operation testEnumParametersWithHttpInfo
+ *
+ * To test enum parameters
+ *
+ * @param string[] $enum_header_string_array Header parameter enum test (string array) (optional)
+ * @param string $enum_header_string Header parameter enum test (string) (optional, default to '-efg')
+ * @param string[] $enum_query_string_array Query parameter enum test (string array) (optional)
+ * @param string $enum_query_string Query parameter enum test (string) (optional, default to '-efg')
+ * @param int $enum_query_integer Query parameter enum test (double) (optional)
+ * @param float $enum_query_double Query parameter enum test (double) (optional)
+ * @param \OpenAPI\Client\Model\EnumClass[] $enum_query_model_array (optional)
+ * @param string[] $enum_form_string_array Form parameter enum test (string array) (optional, default to '$')
+ * @param string $enum_form_string Form parameter enum test (string) (optional, default to '-efg')
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testEnumParametersWithHttpInfo($enum_header_string_array = null, $enum_header_string = '-efg', $enum_query_string_array = null, $enum_query_string = '-efg', $enum_query_integer = null, $enum_query_double = null, $enum_query_model_array = null, $enum_form_string_array = '$', $enum_form_string = '-efg')
+ {
+ $request = $this->testEnumParametersRequest($enum_header_string_array, $enum_header_string, $enum_query_string_array, $enum_query_string, $enum_query_integer, $enum_query_double, $enum_query_model_array, $enum_form_string_array, $enum_form_string);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testEnumParametersAsync
+ *
+ * To test enum parameters
+ *
+ * @param string[] $enum_header_string_array Header parameter enum test (string array) (optional)
+ * @param string $enum_header_string Header parameter enum test (string) (optional, default to '-efg')
+ * @param string[] $enum_query_string_array Query parameter enum test (string array) (optional)
+ * @param string $enum_query_string Query parameter enum test (string) (optional, default to '-efg')
+ * @param int $enum_query_integer Query parameter enum test (double) (optional)
+ * @param float $enum_query_double Query parameter enum test (double) (optional)
+ * @param \OpenAPI\Client\Model\EnumClass[] $enum_query_model_array (optional)
+ * @param string[] $enum_form_string_array Form parameter enum test (string array) (optional, default to '$')
+ * @param string $enum_form_string Form parameter enum test (string) (optional, default to '-efg')
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testEnumParametersAsync($enum_header_string_array = null, $enum_header_string = '-efg', $enum_query_string_array = null, $enum_query_string = '-efg', $enum_query_integer = null, $enum_query_double = null, $enum_query_model_array = null, $enum_form_string_array = '$', $enum_form_string = '-efg')
+ {
+ return $this->testEnumParametersAsyncWithHttpInfo($enum_header_string_array, $enum_header_string, $enum_query_string_array, $enum_query_string, $enum_query_integer, $enum_query_double, $enum_query_model_array, $enum_form_string_array, $enum_form_string)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testEnumParametersAsyncWithHttpInfo
+ *
+ * To test enum parameters
+ *
+ * @param string[] $enum_header_string_array Header parameter enum test (string array) (optional)
+ * @param string $enum_header_string Header parameter enum test (string) (optional, default to '-efg')
+ * @param string[] $enum_query_string_array Query parameter enum test (string array) (optional)
+ * @param string $enum_query_string Query parameter enum test (string) (optional, default to '-efg')
+ * @param int $enum_query_integer Query parameter enum test (double) (optional)
+ * @param float $enum_query_double Query parameter enum test (double) (optional)
+ * @param \OpenAPI\Client\Model\EnumClass[] $enum_query_model_array (optional)
+ * @param string[] $enum_form_string_array Form parameter enum test (string array) (optional, default to '$')
+ * @param string $enum_form_string Form parameter enum test (string) (optional, default to '-efg')
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testEnumParametersAsyncWithHttpInfo($enum_header_string_array = null, $enum_header_string = '-efg', $enum_query_string_array = null, $enum_query_string = '-efg', $enum_query_integer = null, $enum_query_double = null, $enum_query_model_array = null, $enum_form_string_array = '$', $enum_form_string = '-efg')
+ {
+ $returnType = '';
+ $request = $this->testEnumParametersRequest($enum_header_string_array, $enum_header_string, $enum_query_string_array, $enum_query_string, $enum_query_integer, $enum_query_double, $enum_query_model_array, $enum_form_string_array, $enum_form_string);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testEnumParameters'
+ *
+ * @param string[] $enum_header_string_array Header parameter enum test (string array) (optional)
+ * @param string $enum_header_string Header parameter enum test (string) (optional, default to '-efg')
+ * @param string[] $enum_query_string_array Query parameter enum test (string array) (optional)
+ * @param string $enum_query_string Query parameter enum test (string) (optional, default to '-efg')
+ * @param int $enum_query_integer Query parameter enum test (double) (optional)
+ * @param float $enum_query_double Query parameter enum test (double) (optional)
+ * @param \OpenAPI\Client\Model\EnumClass[] $enum_query_model_array (optional)
+ * @param string[] $enum_form_string_array Form parameter enum test (string array) (optional, default to '$')
+ * @param string $enum_form_string Form parameter enum test (string) (optional, default to '-efg')
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testEnumParametersRequest($enum_header_string_array = null, $enum_header_string = '-efg', $enum_query_string_array = null, $enum_query_string = '-efg', $enum_query_integer = null, $enum_query_double = null, $enum_query_model_array = null, $enum_form_string_array = '$', $enum_form_string = '-efg')
+ {
+
+ $resourcePath = '/fake';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if ($enum_query_string_array !== null) {
+ if('form' === 'form' && is_array($enum_query_string_array)) {
+ foreach($enum_query_string_array as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['enum_query_string_array'] = $enum_query_string_array;
+ }
+ }
+ // query params
+ if ($enum_query_string !== null) {
+ if('form' === 'form' && is_array($enum_query_string)) {
+ foreach($enum_query_string as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['enum_query_string'] = $enum_query_string;
+ }
+ }
+ // query params
+ if ($enum_query_integer !== null) {
+ if('form' === 'form' && is_array($enum_query_integer)) {
+ foreach($enum_query_integer as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['enum_query_integer'] = $enum_query_integer;
+ }
+ }
+ // query params
+ if ($enum_query_double !== null) {
+ if('form' === 'form' && is_array($enum_query_double)) {
+ foreach($enum_query_double as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['enum_query_double'] = $enum_query_double;
+ }
+ }
+ // query params
+ if ($enum_query_model_array !== null) {
+ if('form' === 'form' && is_array($enum_query_model_array)) {
+ foreach($enum_query_model_array as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['enum_query_model_array'] = $enum_query_model_array;
+ }
+ }
+
+ // header params
+ if (is_array($enum_header_string_array)) {
+ $enum_header_string_array = ObjectSerializer::serializeCollection($enum_header_string_array, 'csv');
+ }
+ if ($enum_header_string_array !== null) {
+ $headerParams['enum_header_string_array'] = ObjectSerializer::toHeaderValue($enum_header_string_array);
+ }
+ // header params
+ if ($enum_header_string !== null) {
+ $headerParams['enum_header_string'] = ObjectSerializer::toHeaderValue($enum_header_string);
+ }
+
+
+ // form params
+ if ($enum_form_string_array !== null) {
+ $formParams['enum_form_string_array'] = ObjectSerializer::toFormValue($enum_form_string_array);
+ }
+ // form params
+ if ($enum_form_string !== null) {
+ $formParams['enum_form_string'] = ObjectSerializer::toFormValue($enum_form_string);
+ }
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/x-www-form-urlencoded']
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testGroupParameters
+ *
+ * Fake endpoint to test group parameters (optional)
+ *
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+ * @param int $required_string_group Required String in group parameters (required)
+ * @param bool $required_boolean_group Required Boolean in group parameters (required)
+ * @param int $required_int64_group Required Integer in group parameters (required)
+ * @param int $string_group String in group parameters (optional)
+ * @param bool $boolean_group Boolean in group parameters (optional)
+ * @param int $int64_group Integer in group parameters (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testGroupParameters($associative_array)
+ {
+ $this->testGroupParametersWithHttpInfo($associative_array);
+ }
+
+ /**
+ * Operation testGroupParametersWithHttpInfo
+ *
+ * Fake endpoint to test group parameters (optional)
+ *
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+ * @param int $required_string_group Required String in group parameters (required)
+ * @param bool $required_boolean_group Required Boolean in group parameters (required)
+ * @param int $required_int64_group Required Integer in group parameters (required)
+ * @param int $string_group String in group parameters (optional)
+ * @param bool $boolean_group Boolean in group parameters (optional)
+ * @param int $int64_group Integer in group parameters (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testGroupParametersWithHttpInfo($associative_array)
+ {
+ $request = $this->testGroupParametersRequest($associative_array);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testGroupParametersAsync
+ *
+ * Fake endpoint to test group parameters (optional)
+ *
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+ * @param int $required_string_group Required String in group parameters (required)
+ * @param bool $required_boolean_group Required Boolean in group parameters (required)
+ * @param int $required_int64_group Required Integer in group parameters (required)
+ * @param int $string_group String in group parameters (optional)
+ * @param bool $boolean_group Boolean in group parameters (optional)
+ * @param int $int64_group Integer in group parameters (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testGroupParametersAsync($associative_array)
+ {
+ return $this->testGroupParametersAsyncWithHttpInfo($associative_array)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testGroupParametersAsyncWithHttpInfo
+ *
+ * Fake endpoint to test group parameters (optional)
+ *
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+ * @param int $required_string_group Required String in group parameters (required)
+ * @param bool $required_boolean_group Required Boolean in group parameters (required)
+ * @param int $required_int64_group Required Integer in group parameters (required)
+ * @param int $string_group String in group parameters (optional)
+ * @param bool $boolean_group Boolean in group parameters (optional)
+ * @param int $int64_group Integer in group parameters (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testGroupParametersAsyncWithHttpInfo($associative_array)
+ {
+ $returnType = '';
+ $request = $this->testGroupParametersRequest($associative_array);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testGroupParameters'
+ *
+ * Note: the input parameter is an associative array with the keys listed as the parameter name below
+ *
+ * @param int $required_string_group Required String in group parameters (required)
+ * @param bool $required_boolean_group Required Boolean in group parameters (required)
+ * @param int $required_int64_group Required Integer in group parameters (required)
+ * @param int $string_group String in group parameters (optional)
+ * @param bool $boolean_group Boolean in group parameters (optional)
+ * @param int $int64_group Integer in group parameters (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testGroupParametersRequest($associative_array)
+ {
+ // unbox the parameters from the associative array
+ $required_string_group = array_key_exists('required_string_group', $associative_array) ? $associative_array['required_string_group'] : null;
+ $required_boolean_group = array_key_exists('required_boolean_group', $associative_array) ? $associative_array['required_boolean_group'] : null;
+ $required_int64_group = array_key_exists('required_int64_group', $associative_array) ? $associative_array['required_int64_group'] : null;
+ $string_group = array_key_exists('string_group', $associative_array) ? $associative_array['string_group'] : null;
+ $boolean_group = array_key_exists('boolean_group', $associative_array) ? $associative_array['boolean_group'] : null;
+ $int64_group = array_key_exists('int64_group', $associative_array) ? $associative_array['int64_group'] : null;
+
+ // verify the required parameter 'required_string_group' is set
+ if ($required_string_group === null || (is_array($required_string_group) && count($required_string_group) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $required_string_group when calling testGroupParameters'
+ );
+ }
+ // verify the required parameter 'required_boolean_group' is set
+ if ($required_boolean_group === null || (is_array($required_boolean_group) && count($required_boolean_group) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $required_boolean_group when calling testGroupParameters'
+ );
+ }
+ // verify the required parameter 'required_int64_group' is set
+ if ($required_int64_group === null || (is_array($required_int64_group) && count($required_int64_group) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $required_int64_group when calling testGroupParameters'
+ );
+ }
+
+ $resourcePath = '/fake';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if ($required_string_group !== null) {
+ if('form' === 'form' && is_array($required_string_group)) {
+ foreach($required_string_group as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['required_string_group'] = $required_string_group;
+ }
+ }
+ // query params
+ if ($required_int64_group !== null) {
+ if('form' === 'form' && is_array($required_int64_group)) {
+ foreach($required_int64_group as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['required_int64_group'] = $required_int64_group;
+ }
+ }
+ // query params
+ if ($string_group !== null) {
+ if('form' === 'form' && is_array($string_group)) {
+ foreach($string_group as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['string_group'] = $string_group;
+ }
+ }
+ // query params
+ if ($int64_group !== null) {
+ if('form' === 'form' && is_array($int64_group)) {
+ foreach($int64_group as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['int64_group'] = $int64_group;
+ }
+ }
+
+ // header params
+ if ($required_boolean_group !== null) {
+ $headerParams['required_boolean_group'] = ObjectSerializer::toHeaderValue($required_boolean_group);
+ }
+ // header params
+ if ($boolean_group !== null) {
+ $headerParams['boolean_group'] = ObjectSerializer::toHeaderValue($boolean_group);
+ }
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires Bearer (JWT) authentication (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('DELETE', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testInlineAdditionalProperties
+ *
+ * test inline additionalProperties
+ *
+ * @param array $request_body request body (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testInlineAdditionalProperties($request_body)
+ {
+ $this->testInlineAdditionalPropertiesWithHttpInfo($request_body);
+ }
+
+ /**
+ * Operation testInlineAdditionalPropertiesWithHttpInfo
+ *
+ * test inline additionalProperties
+ *
+ * @param array $request_body request body (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testInlineAdditionalPropertiesWithHttpInfo($request_body)
+ {
+ $request = $this->testInlineAdditionalPropertiesRequest($request_body);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testInlineAdditionalPropertiesAsync
+ *
+ * test inline additionalProperties
+ *
+ * @param array $request_body request body (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testInlineAdditionalPropertiesAsync($request_body)
+ {
+ return $this->testInlineAdditionalPropertiesAsyncWithHttpInfo($request_body)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testInlineAdditionalPropertiesAsyncWithHttpInfo
+ *
+ * test inline additionalProperties
+ *
+ * @param array $request_body request body (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testInlineAdditionalPropertiesAsyncWithHttpInfo($request_body)
+ {
+ $returnType = '';
+ $request = $this->testInlineAdditionalPropertiesRequest($request_body);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testInlineAdditionalProperties'
+ *
+ * @param array $request_body request body (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testInlineAdditionalPropertiesRequest($request_body)
+ {
+ // verify the required parameter 'request_body' is set
+ if ($request_body === null || (is_array($request_body) && count($request_body) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $request_body when calling testInlineAdditionalProperties'
+ );
+ }
+
+ $resourcePath = '/fake/inline-additionalProperties';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($request_body)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($request_body));
+ } else {
+ $httpBody = $request_body;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testJsonFormData
+ *
+ * test json serialization of form data
+ *
+ * @param string $param field1 (required)
+ * @param string $param2 field2 (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testJsonFormData($param, $param2)
+ {
+ $this->testJsonFormDataWithHttpInfo($param, $param2);
+ }
+
+ /**
+ * Operation testJsonFormDataWithHttpInfo
+ *
+ * test json serialization of form data
+ *
+ * @param string $param field1 (required)
+ * @param string $param2 field2 (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testJsonFormDataWithHttpInfo($param, $param2)
+ {
+ $request = $this->testJsonFormDataRequest($param, $param2);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testJsonFormDataAsync
+ *
+ * test json serialization of form data
+ *
+ * @param string $param field1 (required)
+ * @param string $param2 field2 (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testJsonFormDataAsync($param, $param2)
+ {
+ return $this->testJsonFormDataAsyncWithHttpInfo($param, $param2)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testJsonFormDataAsyncWithHttpInfo
+ *
+ * test json serialization of form data
+ *
+ * @param string $param field1 (required)
+ * @param string $param2 field2 (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testJsonFormDataAsyncWithHttpInfo($param, $param2)
+ {
+ $returnType = '';
+ $request = $this->testJsonFormDataRequest($param, $param2);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testJsonFormData'
+ *
+ * @param string $param field1 (required)
+ * @param string $param2 field2 (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testJsonFormDataRequest($param, $param2)
+ {
+ // verify the required parameter 'param' is set
+ if ($param === null || (is_array($param) && count($param) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $param when calling testJsonFormData'
+ );
+ }
+ // verify the required parameter 'param2' is set
+ if ($param2 === null || (is_array($param2) && count($param2) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $param2 when calling testJsonFormData'
+ );
+ }
+
+ $resourcePath = '/fake/jsonFormData';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+ // form params
+ if ($param !== null) {
+ $formParams['param'] = ObjectSerializer::toFormValue($param);
+ }
+ // form params
+ if ($param2 !== null) {
+ $formParams['param2'] = ObjectSerializer::toFormValue($param2);
+ }
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/x-www-form-urlencoded']
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation testQueryParameterCollectionFormat
+ *
+ * @param string[] $pipe pipe (required)
+ * @param string[] $ioutil ioutil (required)
+ * @param string[] $http http (required)
+ * @param string[] $url url (required)
+ * @param string[] $context context (required)
+ * @param string $allow_empty allow_empty (required)
+ * @param array $language language (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function testQueryParameterCollectionFormat($pipe, $ioutil, $http, $url, $context, $allow_empty, $language = null)
+ {
+ $this->testQueryParameterCollectionFormatWithHttpInfo($pipe, $ioutil, $http, $url, $context, $allow_empty, $language);
+ }
+
+ /**
+ * Operation testQueryParameterCollectionFormatWithHttpInfo
+ *
+ * @param string[] $pipe (required)
+ * @param string[] $ioutil (required)
+ * @param string[] $http (required)
+ * @param string[] $url (required)
+ * @param string[] $context (required)
+ * @param string $allow_empty (required)
+ * @param array $language (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testQueryParameterCollectionFormatWithHttpInfo($pipe, $ioutil, $http, $url, $context, $allow_empty, $language = null)
+ {
+ $request = $this->testQueryParameterCollectionFormatRequest($pipe, $ioutil, $http, $url, $context, $allow_empty, $language);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testQueryParameterCollectionFormatAsync
+ *
+ * @param string[] $pipe (required)
+ * @param string[] $ioutil (required)
+ * @param string[] $http (required)
+ * @param string[] $url (required)
+ * @param string[] $context (required)
+ * @param string $allow_empty (required)
+ * @param array $language (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testQueryParameterCollectionFormatAsync($pipe, $ioutil, $http, $url, $context, $allow_empty, $language = null)
+ {
+ return $this->testQueryParameterCollectionFormatAsyncWithHttpInfo($pipe, $ioutil, $http, $url, $context, $allow_empty, $language)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testQueryParameterCollectionFormatAsyncWithHttpInfo
+ *
+ * @param string[] $pipe (required)
+ * @param string[] $ioutil (required)
+ * @param string[] $http (required)
+ * @param string[] $url (required)
+ * @param string[] $context (required)
+ * @param string $allow_empty (required)
+ * @param array $language (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testQueryParameterCollectionFormatAsyncWithHttpInfo($pipe, $ioutil, $http, $url, $context, $allow_empty, $language = null)
+ {
+ $returnType = '';
+ $request = $this->testQueryParameterCollectionFormatRequest($pipe, $ioutil, $http, $url, $context, $allow_empty, $language);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testQueryParameterCollectionFormat'
+ *
+ * @param string[] $pipe (required)
+ * @param string[] $ioutil (required)
+ * @param string[] $http (required)
+ * @param string[] $url (required)
+ * @param string[] $context (required)
+ * @param string $allow_empty (required)
+ * @param array $language (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testQueryParameterCollectionFormatRequest($pipe, $ioutil, $http, $url, $context, $allow_empty, $language = null)
+ {
+ // verify the required parameter 'pipe' is set
+ if ($pipe === null || (is_array($pipe) && count($pipe) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pipe when calling testQueryParameterCollectionFormat'
+ );
+ }
+ // verify the required parameter 'ioutil' is set
+ if ($ioutil === null || (is_array($ioutil) && count($ioutil) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $ioutil when calling testQueryParameterCollectionFormat'
+ );
+ }
+ // verify the required parameter 'http' is set
+ if ($http === null || (is_array($http) && count($http) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $http when calling testQueryParameterCollectionFormat'
+ );
+ }
+ // verify the required parameter 'url' is set
+ if ($url === null || (is_array($url) && count($url) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $url when calling testQueryParameterCollectionFormat'
+ );
+ }
+ // verify the required parameter 'context' is set
+ if ($context === null || (is_array($context) && count($context) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $context when calling testQueryParameterCollectionFormat'
+ );
+ }
+ // verify the required parameter 'allow_empty' is set
+ if ($allow_empty === null || (is_array($allow_empty) && count($allow_empty) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $allow_empty when calling testQueryParameterCollectionFormat'
+ );
+ }
+
+ $resourcePath = '/fake/test-query-parameters';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if (is_array($pipe)) {
+ $pipe = ObjectSerializer::serializeCollection($pipe, 'pipeDelimited', true);
+ }
+ if ($pipe !== null) {
+ $queryParams['pipe'] = $pipe;
+ }
+ // query params
+ if (is_array($ioutil)) {
+ $ioutil = ObjectSerializer::serializeCollection($ioutil, 'form', true);
+ }
+ if ($ioutil !== null) {
+ $queryParams['ioutil'] = $ioutil;
+ }
+ // query params
+ if (is_array($http)) {
+ $http = ObjectSerializer::serializeCollection($http, 'spaceDelimited', true);
+ }
+ if ($http !== null) {
+ $queryParams['http'] = $http;
+ }
+ // query params
+ if (is_array($url)) {
+ $url = ObjectSerializer::serializeCollection($url, 'form', true);
+ }
+ if ($url !== null) {
+ $queryParams['url'] = $url;
+ }
+ // query params
+ if ($context !== null) {
+ if('form' === 'form' && is_array($context)) {
+ foreach($context as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['context'] = $context;
+ }
+ }
+ // query params
+ if ($language !== null) {
+ if('form' === 'form' && is_array($language)) {
+ foreach($language as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['language'] = $language;
+ }
+ }
+ // query params
+ if ($allow_empty !== null) {
+ if('form' === 'form' && is_array($allow_empty)) {
+ foreach($allow_empty as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['allowEmpty'] = $allow_empty;
+ }
+ }
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PUT', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php b/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php
new file mode 100644
index 0000000000..3304010ff2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/FakeClassnameTags123Api.php
@@ -0,0 +1,503 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation testClassname
+ *
+ * To test class name in snake case
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Client
+ */
+ public function testClassname($client)
+ {
+ list($response) = $this->testClassnameWithHttpInfo($client);
+ return $response;
+ }
+
+ /**
+ * Operation testClassnameWithHttpInfo
+ *
+ * To test class name in snake case
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Client, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function testClassnameWithHttpInfo($client)
+ {
+ $request = $this->testClassnameRequest($client);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Client' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Client', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Client';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Client',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation testClassnameAsync
+ *
+ * To test class name in snake case
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testClassnameAsync($client)
+ {
+ return $this->testClassnameAsyncWithHttpInfo($client)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation testClassnameAsyncWithHttpInfo
+ *
+ * To test class name in snake case
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function testClassnameAsyncWithHttpInfo($client)
+ {
+ $returnType = '\OpenAPI\Client\Model\Client';
+ $request = $this->testClassnameRequest($client);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'testClassname'
+ *
+ * @param \OpenAPI\Client\Model\Client $client client model (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function testClassnameRequest($client)
+ {
+ // verify the required parameter 'client' is set
+ if ($client === null || (is_array($client) && count($client) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $client when calling testClassname'
+ );
+ }
+
+ $resourcePath = '/fake_classname_test';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($client)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($client));
+ } else {
+ $httpBody = $client;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires API key authentication
+ $apiKey = $this->config->getApiKeyWithPrefix('api_key_query');
+ if ($apiKey !== null) {
+ $queryParams['api_key_query'] = $apiKey;
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PATCH', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Api/PetApi.php b/samples/client/petstore/php/psr-18/lib/Api/PetApi.php
new file mode 100644
index 0000000000..981639ee8e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/PetApi.php
@@ -0,0 +1,2567 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation addPet
+ *
+ * Add a new pet to the store
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function addPet($pet)
+ {
+ $this->addPetWithHttpInfo($pet);
+ }
+
+ /**
+ * Operation addPetWithHttpInfo
+ *
+ * Add a new pet to the store
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function addPetWithHttpInfo($pet)
+ {
+ $request = $this->addPetRequest($pet);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation addPetAsync
+ *
+ * Add a new pet to the store
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function addPetAsync($pet)
+ {
+ return $this->addPetAsyncWithHttpInfo($pet)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation addPetAsyncWithHttpInfo
+ *
+ * Add a new pet to the store
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function addPetAsyncWithHttpInfo($pet)
+ {
+ $returnType = '';
+ $request = $this->addPetRequest($pet);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'addPet'
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function addPetRequest($pet)
+ {
+ // verify the required parameter 'pet' is set
+ if ($pet === null || (is_array($pet) && count($pet) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet when calling addPet'
+ );
+ }
+
+ $resourcePath = '/pet';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json', 'application/xml']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($pet)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($pet));
+ } else {
+ $httpBody = $pet;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHosts = ["http://petstore.swagger.io/v2", "http://path-server-test.petstore.local/v2", "http://{server}.swagger.io:{port}/v2"];
+ if ($this->hostIndex < 0 || $this->hostIndex >= sizeof($operationHosts)) {
+ throw new \InvalidArgumentException("Invalid index {$this->hostIndex} when selecting the host. Must be less than ".sizeof($operationHosts));
+ }
+ $operationHost = $operationHosts[$this->hostIndex];
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation deletePet
+ *
+ * Deletes a pet
+ *
+ * @param int $pet_id Pet id to delete (required)
+ * @param string $api_key api_key (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function deletePet($pet_id, $api_key = null)
+ {
+ $this->deletePetWithHttpInfo($pet_id, $api_key);
+ }
+
+ /**
+ * Operation deletePetWithHttpInfo
+ *
+ * Deletes a pet
+ *
+ * @param int $pet_id Pet id to delete (required)
+ * @param string $api_key (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function deletePetWithHttpInfo($pet_id, $api_key = null)
+ {
+ $request = $this->deletePetRequest($pet_id, $api_key);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation deletePetAsync
+ *
+ * Deletes a pet
+ *
+ * @param int $pet_id Pet id to delete (required)
+ * @param string $api_key (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function deletePetAsync($pet_id, $api_key = null)
+ {
+ return $this->deletePetAsyncWithHttpInfo($pet_id, $api_key)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation deletePetAsyncWithHttpInfo
+ *
+ * Deletes a pet
+ *
+ * @param int $pet_id Pet id to delete (required)
+ * @param string $api_key (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function deletePetAsyncWithHttpInfo($pet_id, $api_key = null)
+ {
+ $returnType = '';
+ $request = $this->deletePetRequest($pet_id, $api_key);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'deletePet'
+ *
+ * @param int $pet_id Pet id to delete (required)
+ * @param string $api_key (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function deletePetRequest($pet_id, $api_key = null)
+ {
+ // verify the required parameter 'pet_id' is set
+ if ($pet_id === null || (is_array($pet_id) && count($pet_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet_id when calling deletePet'
+ );
+ }
+
+ $resourcePath = '/pet/{petId}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+ // header params
+ if ($api_key !== null) {
+ $headerParams['api_key'] = ObjectSerializer::toHeaderValue($api_key);
+ }
+
+ // path params
+ if ($pet_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'petId' . '}',
+ ObjectSerializer::toPathValue($pet_id),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('DELETE', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation findPetsByStatus
+ *
+ * Finds Pets by status
+ *
+ * @param string[] $status Status values that need to be considered for filter (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Pet[]
+ */
+ public function findPetsByStatus($status)
+ {
+ list($response) = $this->findPetsByStatusWithHttpInfo($status);
+ return $response;
+ }
+
+ /**
+ * Operation findPetsByStatusWithHttpInfo
+ *
+ * Finds Pets by status
+ *
+ * @param string[] $status Status values that need to be considered for filter (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings)
+ */
+ public function findPetsByStatusWithHttpInfo($status)
+ {
+ $request = $this->findPetsByStatusRequest($status);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Pet[]' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Pet[]', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Pet[]';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Pet[]',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation findPetsByStatusAsync
+ *
+ * Finds Pets by status
+ *
+ * @param string[] $status Status values that need to be considered for filter (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function findPetsByStatusAsync($status)
+ {
+ return $this->findPetsByStatusAsyncWithHttpInfo($status)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation findPetsByStatusAsyncWithHttpInfo
+ *
+ * Finds Pets by status
+ *
+ * @param string[] $status Status values that need to be considered for filter (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function findPetsByStatusAsyncWithHttpInfo($status)
+ {
+ $returnType = '\OpenAPI\Client\Model\Pet[]';
+ $request = $this->findPetsByStatusRequest($status);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'findPetsByStatus'
+ *
+ * @param string[] $status Status values that need to be considered for filter (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function findPetsByStatusRequest($status)
+ {
+ // verify the required parameter 'status' is set
+ if ($status === null || (is_array($status) && count($status) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $status when calling findPetsByStatus'
+ );
+ }
+
+ $resourcePath = '/pet/findByStatus';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if (is_array($status)) {
+ $status = ObjectSerializer::serializeCollection($status, 'form', true);
+ }
+ if ($status !== null) {
+ $queryParams['status'] = $status;
+ }
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation findPetsByTags
+ *
+ * Finds Pets by tags
+ *
+ * @param string[] $tags Tags to filter by (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Pet[]
+ */
+ public function findPetsByTags($tags)
+ {
+ list($response) = $this->findPetsByTagsWithHttpInfo($tags);
+ return $response;
+ }
+
+ /**
+ * Operation findPetsByTagsWithHttpInfo
+ *
+ * Finds Pets by tags
+ *
+ * @param string[] $tags Tags to filter by (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Pet[], HTTP status code, HTTP response headers (array of strings)
+ */
+ public function findPetsByTagsWithHttpInfo($tags)
+ {
+ $request = $this->findPetsByTagsRequest($tags);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Pet[]' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Pet[]', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Pet[]';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Pet[]',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation findPetsByTagsAsync
+ *
+ * Finds Pets by tags
+ *
+ * @param string[] $tags Tags to filter by (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function findPetsByTagsAsync($tags)
+ {
+ return $this->findPetsByTagsAsyncWithHttpInfo($tags)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation findPetsByTagsAsyncWithHttpInfo
+ *
+ * Finds Pets by tags
+ *
+ * @param string[] $tags Tags to filter by (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function findPetsByTagsAsyncWithHttpInfo($tags)
+ {
+ $returnType = '\OpenAPI\Client\Model\Pet[]';
+ $request = $this->findPetsByTagsRequest($tags);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'findPetsByTags'
+ *
+ * @param string[] $tags Tags to filter by (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function findPetsByTagsRequest($tags)
+ {
+ // verify the required parameter 'tags' is set
+ if ($tags === null || (is_array($tags) && count($tags) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $tags when calling findPetsByTags'
+ );
+ }
+
+
+ $resourcePath = '/pet/findByTags';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if (is_array($tags)) {
+ $tags = ObjectSerializer::serializeCollection($tags, 'form', true);
+ }
+ if ($tags !== null) {
+ $queryParams['tags'] = $tags;
+ }
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation getPetById
+ *
+ * Find pet by ID
+ *
+ * @param int $pet_id ID of pet to return (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Pet
+ */
+ public function getPetById($pet_id)
+ {
+ list($response) = $this->getPetByIdWithHttpInfo($pet_id);
+ return $response;
+ }
+
+ /**
+ * Operation getPetByIdWithHttpInfo
+ *
+ * Find pet by ID
+ *
+ * @param int $pet_id ID of pet to return (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Pet, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function getPetByIdWithHttpInfo($pet_id)
+ {
+ $request = $this->getPetByIdRequest($pet_id);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Pet' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Pet', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Pet';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Pet',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation getPetByIdAsync
+ *
+ * Find pet by ID
+ *
+ * @param int $pet_id ID of pet to return (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getPetByIdAsync($pet_id)
+ {
+ return $this->getPetByIdAsyncWithHttpInfo($pet_id)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation getPetByIdAsyncWithHttpInfo
+ *
+ * Find pet by ID
+ *
+ * @param int $pet_id ID of pet to return (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getPetByIdAsyncWithHttpInfo($pet_id)
+ {
+ $returnType = '\OpenAPI\Client\Model\Pet';
+ $request = $this->getPetByIdRequest($pet_id);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'getPetById'
+ *
+ * @param int $pet_id ID of pet to return (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function getPetByIdRequest($pet_id)
+ {
+ // verify the required parameter 'pet_id' is set
+ if ($pet_id === null || (is_array($pet_id) && count($pet_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet_id when calling getPetById'
+ );
+ }
+
+ $resourcePath = '/pet/{petId}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($pet_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'petId' . '}',
+ ObjectSerializer::toPathValue($pet_id),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires API key authentication
+ $apiKey = $this->config->getApiKeyWithPrefix('api_key');
+ if ($apiKey !== null) {
+ $headers['api_key'] = $apiKey;
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation updatePet
+ *
+ * Update an existing pet
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function updatePet($pet)
+ {
+ $this->updatePetWithHttpInfo($pet);
+ }
+
+ /**
+ * Operation updatePetWithHttpInfo
+ *
+ * Update an existing pet
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function updatePetWithHttpInfo($pet)
+ {
+ $request = $this->updatePetRequest($pet);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation updatePetAsync
+ *
+ * Update an existing pet
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function updatePetAsync($pet)
+ {
+ return $this->updatePetAsyncWithHttpInfo($pet)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation updatePetAsyncWithHttpInfo
+ *
+ * Update an existing pet
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function updatePetAsyncWithHttpInfo($pet)
+ {
+ $returnType = '';
+ $request = $this->updatePetRequest($pet);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'updatePet'
+ *
+ * This oepration contains host(s) defined in the OpenAP spec. Use 'hostIndex' to select the host.
+ * URL: http://petstore.swagger.io/v2
+ * URL: http://path-server-test.petstore.local/v2
+ * URL: http://{server}.swagger.io:{port}/v2
+ *
+ * @param \OpenAPI\Client\Model\Pet $pet Pet object that needs to be added to the store (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function updatePetRequest($pet)
+ {
+ // verify the required parameter 'pet' is set
+ if ($pet === null || (is_array($pet) && count($pet) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet when calling updatePet'
+ );
+ }
+
+ $resourcePath = '/pet';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json', 'application/xml']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($pet)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($pet));
+ } else {
+ $httpBody = $pet;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHosts = ["http://petstore.swagger.io/v2", "http://path-server-test.petstore.local/v2", "http://{server}.swagger.io:{port}/v2"];
+ if ($this->hostIndex < 0 || $this->hostIndex >= sizeof($operationHosts)) {
+ throw new \InvalidArgumentException("Invalid index {$this->hostIndex} when selecting the host. Must be less than ".sizeof($operationHosts));
+ }
+ $operationHost = $operationHosts[$this->hostIndex];
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PUT', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation updatePetWithForm
+ *
+ * Updates a pet in the store with form data
+ *
+ * @param int $pet_id ID of pet that needs to be updated (required)
+ * @param string $name Updated name of the pet (optional)
+ * @param string $status Updated status of the pet (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function updatePetWithForm($pet_id, $name = null, $status = null)
+ {
+ $this->updatePetWithFormWithHttpInfo($pet_id, $name, $status);
+ }
+
+ /**
+ * Operation updatePetWithFormWithHttpInfo
+ *
+ * Updates a pet in the store with form data
+ *
+ * @param int $pet_id ID of pet that needs to be updated (required)
+ * @param string $name Updated name of the pet (optional)
+ * @param string $status Updated status of the pet (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function updatePetWithFormWithHttpInfo($pet_id, $name = null, $status = null)
+ {
+ $request = $this->updatePetWithFormRequest($pet_id, $name, $status);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation updatePetWithFormAsync
+ *
+ * Updates a pet in the store with form data
+ *
+ * @param int $pet_id ID of pet that needs to be updated (required)
+ * @param string $name Updated name of the pet (optional)
+ * @param string $status Updated status of the pet (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function updatePetWithFormAsync($pet_id, $name = null, $status = null)
+ {
+ return $this->updatePetWithFormAsyncWithHttpInfo($pet_id, $name, $status)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation updatePetWithFormAsyncWithHttpInfo
+ *
+ * Updates a pet in the store with form data
+ *
+ * @param int $pet_id ID of pet that needs to be updated (required)
+ * @param string $name Updated name of the pet (optional)
+ * @param string $status Updated status of the pet (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function updatePetWithFormAsyncWithHttpInfo($pet_id, $name = null, $status = null)
+ {
+ $returnType = '';
+ $request = $this->updatePetWithFormRequest($pet_id, $name, $status);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'updatePetWithForm'
+ *
+ * @param int $pet_id ID of pet that needs to be updated (required)
+ * @param string $name Updated name of the pet (optional)
+ * @param string $status Updated status of the pet (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function updatePetWithFormRequest($pet_id, $name = null, $status = null)
+ {
+ // verify the required parameter 'pet_id' is set
+ if ($pet_id === null || (is_array($pet_id) && count($pet_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet_id when calling updatePetWithForm'
+ );
+ }
+
+ $resourcePath = '/pet/{petId}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($pet_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'petId' . '}',
+ ObjectSerializer::toPathValue($pet_id),
+ $resourcePath
+ );
+ }
+
+ // form params
+ if ($name !== null) {
+ $formParams['name'] = ObjectSerializer::toFormValue($name);
+ }
+ // form params
+ if ($status !== null) {
+ $formParams['status'] = ObjectSerializer::toFormValue($status);
+ }
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/x-www-form-urlencoded']
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation uploadFile
+ *
+ * uploads an image
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ * @param \SplFileObject $file file to upload (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\ApiResponse
+ */
+ public function uploadFile($pet_id, $additional_metadata = null, $file = null)
+ {
+ list($response) = $this->uploadFileWithHttpInfo($pet_id, $additional_metadata, $file);
+ return $response;
+ }
+
+ /**
+ * Operation uploadFileWithHttpInfo
+ *
+ * uploads an image
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ * @param \SplFileObject $file file to upload (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\ApiResponse, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function uploadFileWithHttpInfo($pet_id, $additional_metadata = null, $file = null)
+ {
+ $request = $this->uploadFileRequest($pet_id, $additional_metadata, $file);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\ApiResponse' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\ApiResponse', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\ApiResponse';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\ApiResponse',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation uploadFileAsync
+ *
+ * uploads an image
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ * @param \SplFileObject $file file to upload (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function uploadFileAsync($pet_id, $additional_metadata = null, $file = null)
+ {
+ return $this->uploadFileAsyncWithHttpInfo($pet_id, $additional_metadata, $file)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation uploadFileAsyncWithHttpInfo
+ *
+ * uploads an image
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ * @param \SplFileObject $file file to upload (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function uploadFileAsyncWithHttpInfo($pet_id, $additional_metadata = null, $file = null)
+ {
+ $returnType = '\OpenAPI\Client\Model\ApiResponse';
+ $request = $this->uploadFileRequest($pet_id, $additional_metadata, $file);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'uploadFile'
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ * @param \SplFileObject $file file to upload (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function uploadFileRequest($pet_id, $additional_metadata = null, $file = null)
+ {
+ // verify the required parameter 'pet_id' is set
+ if ($pet_id === null || (is_array($pet_id) && count($pet_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet_id when calling uploadFile'
+ );
+ }
+
+ $resourcePath = '/pet/{petId}/uploadImage';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($pet_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'petId' . '}',
+ ObjectSerializer::toPathValue($pet_id),
+ $resourcePath
+ );
+ }
+
+ // form params
+ if ($additional_metadata !== null) {
+ $formParams['additionalMetadata'] = ObjectSerializer::toFormValue($additional_metadata);
+ }
+ // form params
+ if ($file !== null) {
+ $multipart = true;
+ $formParams['file'] = [];
+ $paramFiles = is_array($file) ? $file : [$file];
+ foreach ($paramFiles as $paramFile) {
+ $formParams['file'][] = \GuzzleHttp\Psr7\try_fopen(
+ ObjectSerializer::toFormValue($paramFile),
+ 'rb'
+ );
+ }
+ }
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ ['multipart/form-data']
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation uploadFileWithRequiredFile
+ *
+ * uploads an image (required)
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param \SplFileObject $required_file file to upload (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\ApiResponse
+ */
+ public function uploadFileWithRequiredFile($pet_id, $required_file, $additional_metadata = null)
+ {
+ list($response) = $this->uploadFileWithRequiredFileWithHttpInfo($pet_id, $required_file, $additional_metadata);
+ return $response;
+ }
+
+ /**
+ * Operation uploadFileWithRequiredFileWithHttpInfo
+ *
+ * uploads an image (required)
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param \SplFileObject $required_file file to upload (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\ApiResponse, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function uploadFileWithRequiredFileWithHttpInfo($pet_id, $required_file, $additional_metadata = null)
+ {
+ $request = $this->uploadFileWithRequiredFileRequest($pet_id, $required_file, $additional_metadata);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\ApiResponse' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\ApiResponse', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\ApiResponse';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\ApiResponse',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation uploadFileWithRequiredFileAsync
+ *
+ * uploads an image (required)
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param \SplFileObject $required_file file to upload (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function uploadFileWithRequiredFileAsync($pet_id, $required_file, $additional_metadata = null)
+ {
+ return $this->uploadFileWithRequiredFileAsyncWithHttpInfo($pet_id, $required_file, $additional_metadata)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation uploadFileWithRequiredFileAsyncWithHttpInfo
+ *
+ * uploads an image (required)
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param \SplFileObject $required_file file to upload (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function uploadFileWithRequiredFileAsyncWithHttpInfo($pet_id, $required_file, $additional_metadata = null)
+ {
+ $returnType = '\OpenAPI\Client\Model\ApiResponse';
+ $request = $this->uploadFileWithRequiredFileRequest($pet_id, $required_file, $additional_metadata);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'uploadFileWithRequiredFile'
+ *
+ * @param int $pet_id ID of pet to update (required)
+ * @param \SplFileObject $required_file file to upload (required)
+ * @param string $additional_metadata Additional data to pass to server (optional)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function uploadFileWithRequiredFileRequest($pet_id, $required_file, $additional_metadata = null)
+ {
+ // verify the required parameter 'pet_id' is set
+ if ($pet_id === null || (is_array($pet_id) && count($pet_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $pet_id when calling uploadFileWithRequiredFile'
+ );
+ }
+ // verify the required parameter 'required_file' is set
+ if ($required_file === null || (is_array($required_file) && count($required_file) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $required_file when calling uploadFileWithRequiredFile'
+ );
+ }
+
+ $resourcePath = '/fake/{petId}/uploadImageWithRequiredFile';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($pet_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'petId' . '}',
+ ObjectSerializer::toPathValue($pet_id),
+ $resourcePath
+ );
+ }
+
+ // form params
+ if ($additional_metadata !== null) {
+ $formParams['additionalMetadata'] = ObjectSerializer::toFormValue($additional_metadata);
+ }
+ // form params
+ if ($required_file !== null) {
+ $multipart = true;
+ $formParams['requiredFile'] = [];
+ $paramFiles = is_array($required_file) ? $required_file : [$required_file];
+ foreach ($paramFiles as $paramFile) {
+ $formParams['requiredFile'][] = \GuzzleHttp\Psr7\try_fopen(
+ ObjectSerializer::toFormValue($paramFile),
+ 'rb'
+ );
+ }
+ }
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ ['multipart/form-data']
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires OAuth (access token)
+ if ($this->config->getAccessToken() !== null) {
+ $headers['Authorization'] = 'Bearer ' . $this->config->getAccessToken();
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php b/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php
new file mode 100644
index 0000000000..cf7bf16ce1
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/StoreApi.php
@@ -0,0 +1,1223 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation deleteOrder
+ *
+ * Delete purchase order by ID
+ *
+ * @param string $order_id ID of the order that needs to be deleted (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function deleteOrder($order_id)
+ {
+ $this->deleteOrderWithHttpInfo($order_id);
+ }
+
+ /**
+ * Operation deleteOrderWithHttpInfo
+ *
+ * Delete purchase order by ID
+ *
+ * @param string $order_id ID of the order that needs to be deleted (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function deleteOrderWithHttpInfo($order_id)
+ {
+ $request = $this->deleteOrderRequest($order_id);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation deleteOrderAsync
+ *
+ * Delete purchase order by ID
+ *
+ * @param string $order_id ID of the order that needs to be deleted (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function deleteOrderAsync($order_id)
+ {
+ return $this->deleteOrderAsyncWithHttpInfo($order_id)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation deleteOrderAsyncWithHttpInfo
+ *
+ * Delete purchase order by ID
+ *
+ * @param string $order_id ID of the order that needs to be deleted (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function deleteOrderAsyncWithHttpInfo($order_id)
+ {
+ $returnType = '';
+ $request = $this->deleteOrderRequest($order_id);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'deleteOrder'
+ *
+ * @param string $order_id ID of the order that needs to be deleted (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function deleteOrderRequest($order_id)
+ {
+ // verify the required parameter 'order_id' is set
+ if ($order_id === null || (is_array($order_id) && count($order_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $order_id when calling deleteOrder'
+ );
+ }
+
+ $resourcePath = '/store/order/{order_id}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($order_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'order_id' . '}',
+ ObjectSerializer::toPathValue($order_id),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('DELETE', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation getInventory
+ *
+ * Returns pet inventories by status
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array
+ */
+ public function getInventory()
+ {
+ list($response) = $this->getInventoryWithHttpInfo();
+ return $response;
+ }
+
+ /**
+ * Operation getInventoryWithHttpInfo
+ *
+ * Returns pet inventories by status
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of array, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function getInventoryWithHttpInfo()
+ {
+ $request = $this->getInventoryRequest();
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('array' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, 'array', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = 'array';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ 'array',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation getInventoryAsync
+ *
+ * Returns pet inventories by status
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getInventoryAsync()
+ {
+ return $this->getInventoryAsyncWithHttpInfo()
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation getInventoryAsyncWithHttpInfo
+ *
+ * Returns pet inventories by status
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getInventoryAsyncWithHttpInfo()
+ {
+ $returnType = 'array';
+ $request = $this->getInventoryRequest();
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'getInventory'
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function getInventoryRequest()
+ {
+
+ $resourcePath = '/store/inventory';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+ // this endpoint requires API key authentication
+ $apiKey = $this->config->getApiKeyWithPrefix('api_key');
+ if ($apiKey !== null) {
+ $headers['api_key'] = $apiKey;
+ }
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation getOrderById
+ *
+ * Find purchase order by ID
+ *
+ * @param int $order_id ID of pet that needs to be fetched (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Order
+ */
+ public function getOrderById($order_id)
+ {
+ list($response) = $this->getOrderByIdWithHttpInfo($order_id);
+ return $response;
+ }
+
+ /**
+ * Operation getOrderByIdWithHttpInfo
+ *
+ * Find purchase order by ID
+ *
+ * @param int $order_id ID of pet that needs to be fetched (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Order, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function getOrderByIdWithHttpInfo($order_id)
+ {
+ $request = $this->getOrderByIdRequest($order_id);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Order' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Order', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Order';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Order',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation getOrderByIdAsync
+ *
+ * Find purchase order by ID
+ *
+ * @param int $order_id ID of pet that needs to be fetched (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getOrderByIdAsync($order_id)
+ {
+ return $this->getOrderByIdAsyncWithHttpInfo($order_id)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation getOrderByIdAsyncWithHttpInfo
+ *
+ * Find purchase order by ID
+ *
+ * @param int $order_id ID of pet that needs to be fetched (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getOrderByIdAsyncWithHttpInfo($order_id)
+ {
+ $returnType = '\OpenAPI\Client\Model\Order';
+ $request = $this->getOrderByIdRequest($order_id);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'getOrderById'
+ *
+ * @param int $order_id ID of pet that needs to be fetched (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function getOrderByIdRequest($order_id)
+ {
+ // verify the required parameter 'order_id' is set
+ if ($order_id === null || (is_array($order_id) && count($order_id) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $order_id when calling getOrderById'
+ );
+ }
+ if ($order_id > 5) {
+ throw new \InvalidArgumentException('invalid value for "$order_id" when calling StoreApi.getOrderById, must be smaller than or equal to 5.');
+ }
+ if ($order_id < 1) {
+ throw new \InvalidArgumentException('invalid value for "$order_id" when calling StoreApi.getOrderById, must be bigger than or equal to 1.');
+ }
+
+
+ $resourcePath = '/store/order/{order_id}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($order_id !== null) {
+ $resourcePath = str_replace(
+ '{' . 'order_id' . '}',
+ ObjectSerializer::toPathValue($order_id),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation placeOrder
+ *
+ * Place an order for a pet
+ *
+ * @param \OpenAPI\Client\Model\Order $order order placed for purchasing the pet (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\Order
+ */
+ public function placeOrder($order)
+ {
+ list($response) = $this->placeOrderWithHttpInfo($order);
+ return $response;
+ }
+
+ /**
+ * Operation placeOrderWithHttpInfo
+ *
+ * Place an order for a pet
+ *
+ * @param \OpenAPI\Client\Model\Order $order order placed for purchasing the pet (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\Order, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function placeOrderWithHttpInfo($order)
+ {
+ $request = $this->placeOrderRequest($order);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\Order' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\Order', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\Order';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\Order',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation placeOrderAsync
+ *
+ * Place an order for a pet
+ *
+ * @param \OpenAPI\Client\Model\Order $order order placed for purchasing the pet (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function placeOrderAsync($order)
+ {
+ return $this->placeOrderAsyncWithHttpInfo($order)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation placeOrderAsyncWithHttpInfo
+ *
+ * Place an order for a pet
+ *
+ * @param \OpenAPI\Client\Model\Order $order order placed for purchasing the pet (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function placeOrderAsyncWithHttpInfo($order)
+ {
+ $returnType = '\OpenAPI\Client\Model\Order';
+ $request = $this->placeOrderRequest($order);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'placeOrder'
+ *
+ * @param \OpenAPI\Client\Model\Order $order order placed for purchasing the pet (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function placeOrderRequest($order)
+ {
+ // verify the required parameter 'order' is set
+ if ($order === null || (is_array($order) && count($order) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $order when calling placeOrder'
+ );
+ }
+
+ $resourcePath = '/store/order';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($order)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($order));
+ } else {
+ $httpBody = $order;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Api/UserApi.php b/samples/client/petstore/php/psr-18/lib/Api/UserApi.php
new file mode 100644
index 0000000000..b4f68c3bf3
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Api/UserApi.php
@@ -0,0 +1,2060 @@
+config = $config ?? (new Configuration())->setHost('http://petstore.swagger.io:80/v2');
+ $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory();
+ $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory();
+
+ $plugins = $plugins ?? [
+ new RedirectPlugin(['strict' => true]),
+ new ErrorPlugin(),
+ ];
+
+ if ($this->config->getDebug()) {
+ $plugins[] = new DebugPlugin(fopen($this->config->getDebugFile(), 'ab'));
+ }
+
+ $this->httpClient = (new PluginClientFactory())->createClient(
+ $httpClient ?? Psr18ClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->httpAsyncClient = (new PluginClientFactory())->createClient(
+ $httpAsyncClient ?? HttpAsyncClientDiscovery::find(),
+ $plugins
+ );
+
+ $this->uriFactory = $uriFactory ?? Psr17FactoryDiscovery::findUriFactory();
+
+ $this->headerSelector = $selector ?? new HeaderSelector();
+
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Set the host index
+ *
+ * @param int $hostIndex Host index (required)
+ */
+ public function setHostIndex($hostIndex): void
+ {
+ $this->hostIndex = $hostIndex;
+ }
+
+ /**
+ * Get the host index
+ *
+ * @return int Host index
+ */
+ public function getHostIndex()
+ {
+ return $this->hostIndex;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * Operation createUser
+ *
+ * Create user
+ *
+ * @param \OpenAPI\Client\Model\User $user Created user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function createUser($user)
+ {
+ $this->createUserWithHttpInfo($user);
+ }
+
+ /**
+ * Operation createUserWithHttpInfo
+ *
+ * Create user
+ *
+ * @param \OpenAPI\Client\Model\User $user Created user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function createUserWithHttpInfo($user)
+ {
+ $request = $this->createUserRequest($user);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation createUserAsync
+ *
+ * Create user
+ *
+ * @param \OpenAPI\Client\Model\User $user Created user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function createUserAsync($user)
+ {
+ return $this->createUserAsyncWithHttpInfo($user)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation createUserAsyncWithHttpInfo
+ *
+ * Create user
+ *
+ * @param \OpenAPI\Client\Model\User $user Created user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function createUserAsyncWithHttpInfo($user)
+ {
+ $returnType = '';
+ $request = $this->createUserRequest($user);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'createUser'
+ *
+ * @param \OpenAPI\Client\Model\User $user Created user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function createUserRequest($user)
+ {
+ // verify the required parameter 'user' is set
+ if ($user === null || (is_array($user) && count($user) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $user when calling createUser'
+ );
+ }
+
+ $resourcePath = '/user';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($user)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user));
+ } else {
+ $httpBody = $user;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation createUsersWithArrayInput
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function createUsersWithArrayInput($user)
+ {
+ $this->createUsersWithArrayInputWithHttpInfo($user);
+ }
+
+ /**
+ * Operation createUsersWithArrayInputWithHttpInfo
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function createUsersWithArrayInputWithHttpInfo($user)
+ {
+ $request = $this->createUsersWithArrayInputRequest($user);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation createUsersWithArrayInputAsync
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function createUsersWithArrayInputAsync($user)
+ {
+ return $this->createUsersWithArrayInputAsyncWithHttpInfo($user)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation createUsersWithArrayInputAsyncWithHttpInfo
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function createUsersWithArrayInputAsyncWithHttpInfo($user)
+ {
+ $returnType = '';
+ $request = $this->createUsersWithArrayInputRequest($user);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'createUsersWithArrayInput'
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function createUsersWithArrayInputRequest($user)
+ {
+ // verify the required parameter 'user' is set
+ if ($user === null || (is_array($user) && count($user) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $user when calling createUsersWithArrayInput'
+ );
+ }
+
+ $resourcePath = '/user/createWithArray';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($user)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user));
+ } else {
+ $httpBody = $user;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation createUsersWithListInput
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function createUsersWithListInput($user)
+ {
+ $this->createUsersWithListInputWithHttpInfo($user);
+ }
+
+ /**
+ * Operation createUsersWithListInputWithHttpInfo
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function createUsersWithListInputWithHttpInfo($user)
+ {
+ $request = $this->createUsersWithListInputRequest($user);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation createUsersWithListInputAsync
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function createUsersWithListInputAsync($user)
+ {
+ return $this->createUsersWithListInputAsyncWithHttpInfo($user)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation createUsersWithListInputAsyncWithHttpInfo
+ *
+ * Creates list of users with given input array
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function createUsersWithListInputAsyncWithHttpInfo($user)
+ {
+ $returnType = '';
+ $request = $this->createUsersWithListInputRequest($user);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'createUsersWithListInput'
+ *
+ * @param \OpenAPI\Client\Model\User[] $user List of user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function createUsersWithListInputRequest($user)
+ {
+ // verify the required parameter 'user' is set
+ if ($user === null || (is_array($user) && count($user) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $user when calling createUsersWithListInput'
+ );
+ }
+
+ $resourcePath = '/user/createWithList';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($user)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user));
+ } else {
+ $httpBody = $user;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('POST', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation deleteUser
+ *
+ * Delete user
+ *
+ * @param string $username The name that needs to be deleted (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function deleteUser($username)
+ {
+ $this->deleteUserWithHttpInfo($username);
+ }
+
+ /**
+ * Operation deleteUserWithHttpInfo
+ *
+ * Delete user
+ *
+ * @param string $username The name that needs to be deleted (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function deleteUserWithHttpInfo($username)
+ {
+ $request = $this->deleteUserRequest($username);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation deleteUserAsync
+ *
+ * Delete user
+ *
+ * @param string $username The name that needs to be deleted (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function deleteUserAsync($username)
+ {
+ return $this->deleteUserAsyncWithHttpInfo($username)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation deleteUserAsyncWithHttpInfo
+ *
+ * Delete user
+ *
+ * @param string $username The name that needs to be deleted (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function deleteUserAsyncWithHttpInfo($username)
+ {
+ $returnType = '';
+ $request = $this->deleteUserRequest($username);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'deleteUser'
+ *
+ * @param string $username The name that needs to be deleted (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function deleteUserRequest($username)
+ {
+ // verify the required parameter 'username' is set
+ if ($username === null || (is_array($username) && count($username) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $username when calling deleteUser'
+ );
+ }
+
+ $resourcePath = '/user/{username}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($username !== null) {
+ $resourcePath = str_replace(
+ '{' . 'username' . '}',
+ ObjectSerializer::toPathValue($username),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('DELETE', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation getUserByName
+ *
+ * Get user by user name
+ *
+ * @param string $username The name that needs to be fetched. Use user1 for testing. (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return \OpenAPI\Client\Model\User
+ */
+ public function getUserByName($username)
+ {
+ list($response) = $this->getUserByNameWithHttpInfo($username);
+ return $response;
+ }
+
+ /**
+ * Operation getUserByNameWithHttpInfo
+ *
+ * Get user by user name
+ *
+ * @param string $username The name that needs to be fetched. Use user1 for testing. (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of \OpenAPI\Client\Model\User, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function getUserByNameWithHttpInfo($username)
+ {
+ $request = $this->getUserByNameRequest($username);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('\OpenAPI\Client\Model\User' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, '\OpenAPI\Client\Model\User', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = '\OpenAPI\Client\Model\User';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ '\OpenAPI\Client\Model\User',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation getUserByNameAsync
+ *
+ * Get user by user name
+ *
+ * @param string $username The name that needs to be fetched. Use user1 for testing. (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getUserByNameAsync($username)
+ {
+ return $this->getUserByNameAsyncWithHttpInfo($username)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation getUserByNameAsyncWithHttpInfo
+ *
+ * Get user by user name
+ *
+ * @param string $username The name that needs to be fetched. Use user1 for testing. (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function getUserByNameAsyncWithHttpInfo($username)
+ {
+ $returnType = '\OpenAPI\Client\Model\User';
+ $request = $this->getUserByNameRequest($username);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'getUserByName'
+ *
+ * @param string $username The name that needs to be fetched. Use user1 for testing. (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function getUserByNameRequest($username)
+ {
+ // verify the required parameter 'username' is set
+ if ($username === null || (is_array($username) && count($username) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $username when calling getUserByName'
+ );
+ }
+
+ $resourcePath = '/user/{username}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($username !== null) {
+ $resourcePath = str_replace(
+ '{' . 'username' . '}',
+ ObjectSerializer::toPathValue($username),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation loginUser
+ *
+ * Logs user into the system
+ *
+ * @param string $username The user name for login (required)
+ * @param string $password The password for login in clear text (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return string
+ */
+ public function loginUser($username, $password)
+ {
+ list($response) = $this->loginUserWithHttpInfo($username, $password);
+ return $response;
+ }
+
+ /**
+ * Operation loginUserWithHttpInfo
+ *
+ * Logs user into the system
+ *
+ * @param string $username The user name for login (required)
+ * @param string $password The password for login in clear text (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of string, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function loginUserWithHttpInfo($username, $password)
+ {
+ $request = $this->loginUserRequest($username, $password);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ switch($statusCode) {
+ case 200:
+ if ('string' === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, 'string', []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ }
+
+ $returnType = 'string';
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ case 200:
+ $data = ObjectSerializer::deserialize(
+ $e->getResponseBody(),
+ 'string',
+ $e->getResponseHeaders()
+ );
+ $e->setResponseObject($data);
+ break;
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation loginUserAsync
+ *
+ * Logs user into the system
+ *
+ * @param string $username The user name for login (required)
+ * @param string $password The password for login in clear text (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function loginUserAsync($username, $password)
+ {
+ return $this->loginUserAsyncWithHttpInfo($username, $password)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation loginUserAsyncWithHttpInfo
+ *
+ * Logs user into the system
+ *
+ * @param string $username The user name for login (required)
+ * @param string $password The password for login in clear text (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function loginUserAsyncWithHttpInfo($username, $password)
+ {
+ $returnType = 'string';
+ $request = $this->loginUserRequest($username, $password);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ if ($returnType === '\SplFileObject') {
+ $content = $response->getBody(); //stream goes to serializer
+ } else {
+ $content = (string) $response->getBody();
+ }
+
+ return [
+ ObjectSerializer::deserialize($content, $returnType, []),
+ $response->getStatusCode(),
+ $response->getHeaders()
+ ];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'loginUser'
+ *
+ * @param string $username The user name for login (required)
+ * @param string $password The password for login in clear text (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function loginUserRequest($username, $password)
+ {
+ // verify the required parameter 'username' is set
+ if ($username === null || (is_array($username) && count($username) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $username when calling loginUser'
+ );
+ }
+ // verify the required parameter 'password' is set
+ if ($password === null || (is_array($password) && count($password) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $password when calling loginUser'
+ );
+ }
+
+ $resourcePath = '/user/login';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+ // query params
+ if ($username !== null) {
+ if('form' === 'form' && is_array($username)) {
+ foreach($username as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['username'] = $username;
+ }
+ }
+ // query params
+ if ($password !== null) {
+ if('form' === 'form' && is_array($password)) {
+ foreach($password as $key => $value) {
+ $queryParams[$key] = $value;
+ }
+ }
+ else {
+ $queryParams['password'] = $password;
+ }
+ }
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ ['application/xml', 'application/json']
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ ['application/xml', 'application/json'],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation logoutUser
+ *
+ * Logs out current logged in user session
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function logoutUser()
+ {
+ $this->logoutUserWithHttpInfo();
+ }
+
+ /**
+ * Operation logoutUserWithHttpInfo
+ *
+ * Logs out current logged in user session
+ *
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function logoutUserWithHttpInfo()
+ {
+ $request = $this->logoutUserRequest();
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation logoutUserAsync
+ *
+ * Logs out current logged in user session
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function logoutUserAsync()
+ {
+ return $this->logoutUserAsyncWithHttpInfo()
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation logoutUserAsyncWithHttpInfo
+ *
+ * Logs out current logged in user session
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function logoutUserAsyncWithHttpInfo()
+ {
+ $returnType = '';
+ $request = $this->logoutUserRequest();
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'logoutUser'
+ *
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function logoutUserRequest()
+ {
+
+ $resourcePath = '/user/logout';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ []
+ );
+ }
+
+ // for model (json/xml)
+ if (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('GET', $uri, $headers, $httpBody);
+ }
+
+ /**
+ * Operation updateUser
+ *
+ * Updated user
+ *
+ * @param string $username name that need to be deleted (required)
+ * @param \OpenAPI\Client\Model\User $user Updated user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return void
+ */
+ public function updateUser($username, $user)
+ {
+ $this->updateUserWithHttpInfo($username, $user);
+ }
+
+ /**
+ * Operation updateUserWithHttpInfo
+ *
+ * Updated user
+ *
+ * @param string $username name that need to be deleted (required)
+ * @param \OpenAPI\Client\Model\User $user Updated user object (required)
+ *
+ * @throws \OpenAPI\Client\ApiException on non-2xx response
+ * @throws \InvalidArgumentException
+ * @return array of null, HTTP status code, HTTP response headers (array of strings)
+ */
+ public function updateUserWithHttpInfo($username, $user)
+ {
+ $request = $this->updateUserRequest($username, $user);
+
+ try {
+ try {
+ $response = $this->httpClient->sendRequest($request);
+ } catch (HttpException $e) {
+ $response = $e->getResponse();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $response->getStatusCode(),
+ (string) $request->getUri()
+ ),
+ $request,
+ $response,
+ $e
+ );
+ } catch (ClientExceptionInterface $e) {
+ throw new ApiException(
+ "[{$e->getCode()}] {$e->getMessage()}",
+ $request,
+ null,
+ $e
+ );
+ }
+
+ $statusCode = $response->getStatusCode();
+
+ return [null, $statusCode, $response->getHeaders()];
+
+ } catch (ApiException $e) {
+ switch ($e->getCode()) {
+ }
+ throw $e;
+ }
+ }
+
+ /**
+ * Operation updateUserAsync
+ *
+ * Updated user
+ *
+ * @param string $username name that need to be deleted (required)
+ * @param \OpenAPI\Client\Model\User $user Updated user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function updateUserAsync($username, $user)
+ {
+ return $this->updateUserAsyncWithHttpInfo($username, $user)
+ ->then(
+ function ($response) {
+ return $response[0];
+ }
+ );
+ }
+
+ /**
+ * Operation updateUserAsyncWithHttpInfo
+ *
+ * Updated user
+ *
+ * @param string $username name that need to be deleted (required)
+ * @param \OpenAPI\Client\Model\User $user Updated user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return Promise
+ */
+ public function updateUserAsyncWithHttpInfo($username, $user)
+ {
+ $returnType = '';
+ $request = $this->updateUserRequest($username, $user);
+
+ return $this->httpAsyncClient->sendAsyncRequest($request)
+ ->then(
+ function ($response) use ($returnType) {
+ return [null, $response->getStatusCode(), $response->getHeaders()];
+ },
+ function (HttpException $exception) {
+ $response = $exception->getResponse();
+ $statusCode = $response->getStatusCode();
+ throw new ApiException(
+ sprintf(
+ '[%d] Error connecting to the API (%s)',
+ $statusCode,
+ $exception->getRequest()->getUri()
+ ),
+ $exception->getRequest(),
+ $exception->getResponse(),
+ $exception
+ );
+ }
+ );
+ }
+
+ /**
+ * Create request for operation 'updateUser'
+ *
+ * @param string $username name that need to be deleted (required)
+ * @param \OpenAPI\Client\Model\User $user Updated user object (required)
+ *
+ * @throws \InvalidArgumentException
+ * @return RequestInterface
+ */
+ public function updateUserRequest($username, $user)
+ {
+ // verify the required parameter 'username' is set
+ if ($username === null || (is_array($username) && count($username) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $username when calling updateUser'
+ );
+ }
+ // verify the required parameter 'user' is set
+ if ($user === null || (is_array($user) && count($user) === 0)) {
+ throw new \InvalidArgumentException(
+ 'Missing the required parameter $user when calling updateUser'
+ );
+ }
+
+ $resourcePath = '/user/{username}';
+ $formParams = [];
+ $queryParams = [];
+ $headerParams = [];
+ $httpBody = null;
+ $multipart = false;
+
+
+
+ // path params
+ if ($username !== null) {
+ $resourcePath = str_replace(
+ '{' . 'username' . '}',
+ ObjectSerializer::toPathValue($username),
+ $resourcePath
+ );
+ }
+
+
+ if ($multipart) {
+ $headers = $this->headerSelector->selectHeadersForMultipart(
+ []
+ );
+ } else {
+ $headers = $this->headerSelector->selectHeaders(
+ [],
+ ['application/json']
+ );
+ }
+
+ // for model (json/xml)
+ if (isset($user)) {
+ if ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode(ObjectSerializer::sanitizeForSerialization($user));
+ } else {
+ $httpBody = $user;
+ }
+ } elseif (count($formParams) > 0) {
+ if ($multipart) {
+ $multipartContents = [];
+ foreach ($formParams as $formParamName => $formParamValue) {
+ $formParamValueItems = is_array($formParamValue) ? $formParamValue : [$formParamValue];
+ foreach ($formParamValueItems as $formParamValueItem) {
+ $multipartContents[] = [
+ 'name' => $formParamName,
+ 'contents' => $formParamValueItem
+ ];
+ }
+ }
+ // for HTTP post (form)
+ $httpBody = new MultipartStream($multipartContents);
+
+ } elseif ($headers['Content-Type'] === 'application/json') {
+ $httpBody = json_encode($formParams);
+
+ } else {
+ // for HTTP post (form)
+ $httpBody = Query::build($formParams);
+ }
+ }
+
+
+ $defaultHeaders = [];
+ if ($this->config->getUserAgent()) {
+ $defaultHeaders['User-Agent'] = $this->config->getUserAgent();
+ }
+
+ $headers = array_merge(
+ $defaultHeaders,
+ $headerParams,
+ $headers
+ );
+
+ $operationHost = $this->config->getHost();
+
+ $uri = $this->createUri($operationHost, $resourcePath, $queryParams);
+
+ return $this->createRequest('PUT', $uri, $headers, $httpBody);
+ }
+
+
+ /**
+ * @param string $method
+ * @param string|UriInterface $uri
+ * @param array $headers
+ * @param string|StreamInterface|null $body
+ *
+ * @return RequestInterface
+ */
+ protected function createRequest(string $method, $uri, array $headers = [], $body = null): RequestInterface
+ {
+ if ($this->requestFactory instanceof RequestFactory) {
+ return $this->requestFactory->createRequest(
+ $method,
+ $uri,
+ $headers,
+ $body
+ );
+ }
+
+ if (is_string($body) && '' !== $body && null === $this->streamFactory) {
+ throw new \RuntimeException('Cannot create request: A stream factory is required to create a request with a non-empty string body.');
+ }
+
+ $request = $this->requestFactory->createRequest($method, $uri);
+
+ foreach ($headers as $key => $value) {
+ $request = $request->withHeader($key, $value);
+ }
+
+ if (null !== $body && '' !== $body) {
+ $request = $request->withBody(
+ is_string($body) ? $this->streamFactory->createStream($body) : $body
+ );
+ }
+
+ return $request;
+ }
+
+ private function createUri(
+ string $operationHost,
+ string $resourcePath,
+ array $queryParams
+ ): UriInterface {
+ $parsedUrl = parse_url($operationHost);
+
+ $host = $parsedUrl['host'] ?? null;
+ $scheme = $parsedUrl['scheme'] ?? null;
+ $basePath = $parsedUrl['path'] ?? null;
+ $port = $parsedUrl['port'] ?? null;
+ $user = $parsedUrl['user'] ?? null;
+ $password = $parsedUrl['pass'] ?? null;
+
+ $uri = $this->uriFactory->createUri($basePath . $resourcePath)
+ ->withHost($host)
+ ->withScheme($scheme)
+ ->withPort($port)
+ ->withQuery(Query::build($queryParams));
+
+ if ($user) {
+ $uri = $uri->withUserInfo($user, $password);
+ }
+
+ return $uri;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/ApiException.php b/samples/client/petstore/php/psr-18/lib/ApiException.php
new file mode 100644
index 0000000000..521e59a802
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/ApiException.php
@@ -0,0 +1,122 @@
+responseHeaders = $response->getHeaders();
+ $this->responseBody = (string) $response->getBody();
+ $this->code = $response->getStatusCode();
+ }
+ }
+
+ /**
+ * Gets the HTTP response header
+ *
+ * @return string[]|null HTTP response header
+ */
+ public function getResponseHeaders()
+ {
+ return $this->responseHeaders;
+ }
+
+ /**
+ * Gets the HTTP body of the server response either as Json or string
+ *
+ * @return \stdClass|string|null HTTP body of the server response either as \stdClass or string
+ */
+ public function getResponseBody()
+ {
+ return $this->responseBody;
+ }
+
+ /**
+ * Sets the deseralized response object (during deserialization)
+ *
+ * @param mixed $obj Deserialized response object
+ *
+ * @return void
+ */
+ public function setResponseObject($obj)
+ {
+ $this->responseObject = $obj;
+ }
+
+ /**
+ * Gets the deseralized response object (during deserialization)
+ *
+ * @return mixed the deserialized response object
+ */
+ public function getResponseObject()
+ {
+ return $this->responseObject;
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Configuration.php b/samples/client/petstore/php/psr-18/lib/Configuration.php
new file mode 100644
index 0000000000..afa867f44e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Configuration.php
@@ -0,0 +1,568 @@
+tempFolderPath = sys_get_temp_dir();
+ }
+
+ /**
+ * Sets API key
+ *
+ * @param string $apiKeyIdentifier API key identifier (authentication scheme)
+ * @param string $key API key or token
+ *
+ * @return $this
+ */
+ public function setApiKey($apiKeyIdentifier, $key)
+ {
+ $this->apiKeys[$apiKeyIdentifier] = $key;
+ return $this;
+ }
+
+ /**
+ * Gets API key
+ *
+ * @param string $apiKeyIdentifier API key identifier (authentication scheme)
+ *
+ * @return null|string API key or token
+ */
+ public function getApiKey($apiKeyIdentifier)
+ {
+ return isset($this->apiKeys[$apiKeyIdentifier]) ? $this->apiKeys[$apiKeyIdentifier] : null;
+ }
+
+ /**
+ * Sets the prefix for API key (e.g. Bearer)
+ *
+ * @param string $apiKeyIdentifier API key identifier (authentication scheme)
+ * @param string $prefix API key prefix, e.g. Bearer
+ *
+ * @return $this
+ */
+ public function setApiKeyPrefix($apiKeyIdentifier, $prefix)
+ {
+ $this->apiKeyPrefixes[$apiKeyIdentifier] = $prefix;
+ return $this;
+ }
+
+ /**
+ * Gets API key prefix
+ *
+ * @param string $apiKeyIdentifier API key identifier (authentication scheme)
+ *
+ * @return null|string
+ */
+ public function getApiKeyPrefix($apiKeyIdentifier)
+ {
+ return isset($this->apiKeyPrefixes[$apiKeyIdentifier]) ? $this->apiKeyPrefixes[$apiKeyIdentifier] : null;
+ }
+
+ /**
+ * Sets the access token for OAuth
+ *
+ * @param string $accessToken Token for OAuth
+ *
+ * @return $this
+ */
+ public function setAccessToken($accessToken)
+ {
+ $this->accessToken = $accessToken;
+ return $this;
+ }
+
+ /**
+ * Gets the access token for OAuth
+ *
+ * @return string Access token for OAuth
+ */
+ public function getAccessToken()
+ {
+ return $this->accessToken;
+ }
+
+ /**
+ * Sets boolean format for query string.
+ *
+ * @param string $booleanFormatForQueryString Boolean format for query string
+ *
+ * @return $this
+ */
+ public function setBooleanFormatForQueryString(string $booleanFormat)
+ {
+ $this->booleanFormatForQueryString = $booleanFormat;
+
+ return $this;
+ }
+
+ /**
+ * Gets boolean format for query string.
+ *
+ * @return string Boolean format for query string
+ */
+ public function getBooleanFormatForQueryString(): string
+ {
+ return $this->booleanFormatForQueryString;
+ }
+
+ /**
+ * Sets the username for HTTP basic authentication
+ *
+ * @param string $username Username for HTTP basic authentication
+ *
+ * @return $this
+ */
+ public function setUsername($username)
+ {
+ $this->username = $username;
+ return $this;
+ }
+
+ /**
+ * Gets the username for HTTP basic authentication
+ *
+ * @return string Username for HTTP basic authentication
+ */
+ public function getUsername()
+ {
+ return $this->username;
+ }
+
+ /**
+ * Sets the password for HTTP basic authentication
+ *
+ * @param string $password Password for HTTP basic authentication
+ *
+ * @return $this
+ */
+ public function setPassword($password)
+ {
+ $this->password = $password;
+ return $this;
+ }
+
+ /**
+ * Gets the password for HTTP basic authentication
+ *
+ * @return string Password for HTTP basic authentication
+ */
+ public function getPassword()
+ {
+ return $this->password;
+ }
+
+ /**
+ * Sets the host
+ *
+ * @param string $host Host
+ *
+ * @return $this
+ */
+ public function setHost($host)
+ {
+ $this->host = $host;
+ return $this;
+ }
+
+ /**
+ * Gets the host
+ *
+ * @return string Host
+ */
+ public function getHost()
+ {
+ return $this->host;
+ }
+
+ /**
+ * Sets the user agent of the api client
+ *
+ * @param string $userAgent the user agent of the api client
+ *
+ * @throws \InvalidArgumentException
+ * @return $this
+ */
+ public function setUserAgent($userAgent)
+ {
+ if (!is_string($userAgent)) {
+ throw new \InvalidArgumentException('User-agent must be a string.');
+ }
+
+ $this->userAgent = $userAgent;
+ return $this;
+ }
+
+ /**
+ * Gets the user agent of the api client
+ *
+ * @return string user agent
+ */
+ public function getUserAgent()
+ {
+ return $this->userAgent;
+ }
+
+ /**
+ * Sets debug flag
+ *
+ * @param bool $debug Debug flag
+ *
+ * @return $this
+ */
+ public function setDebug($debug)
+ {
+ $this->debug = $debug;
+ return $this;
+ }
+
+ /**
+ * Gets the debug flag
+ *
+ * @return bool
+ */
+ public function getDebug()
+ {
+ return $this->debug;
+ }
+
+ /**
+ * Sets the debug file
+ *
+ * @param string $debugFile Debug file
+ *
+ * @return $this
+ */
+ public function setDebugFile($debugFile)
+ {
+ $this->debugFile = $debugFile;
+ return $this;
+ }
+
+ /**
+ * Gets the debug file
+ *
+ * @return string
+ */
+ public function getDebugFile()
+ {
+ return $this->debugFile;
+ }
+
+ /**
+ * Sets the temp folder path
+ *
+ * @param string $tempFolderPath Temp folder path
+ *
+ * @return $this
+ */
+ public function setTempFolderPath($tempFolderPath)
+ {
+ $this->tempFolderPath = $tempFolderPath;
+ return $this;
+ }
+
+ /**
+ * Gets the temp folder path
+ *
+ * @return string Temp folder path
+ */
+ public function getTempFolderPath()
+ {
+ return $this->tempFolderPath;
+ }
+
+ /**
+ * Gets the default configuration instance
+ *
+ * @return Configuration
+ */
+ public static function getDefaultConfiguration()
+ {
+ if (self::$defaultConfiguration === null) {
+ self::$defaultConfiguration = new Configuration();
+ }
+
+ return self::$defaultConfiguration;
+ }
+
+ /**
+ * Sets the default configuration instance
+ *
+ * @param Configuration $config An instance of the Configuration Object
+ *
+ * @return void
+ */
+ public static function setDefaultConfiguration(Configuration $config)
+ {
+ self::$defaultConfiguration = $config;
+ }
+
+ /**
+ * Gets the essential information for debugging
+ *
+ * @return string The report for debugging
+ */
+ public static function toDebugReport()
+ {
+ $report = 'PHP SDK (OpenAPI\Client) Debug Report:' . PHP_EOL;
+ $report .= ' OS: ' . php_uname() . PHP_EOL;
+ $report .= ' PHP Version: ' . PHP_VERSION . PHP_EOL;
+ $report .= ' The version of the OpenAPI document: 1.0.0' . PHP_EOL;
+ $report .= ' Temp Folder Path: ' . self::getDefaultConfiguration()->getTempFolderPath() . PHP_EOL;
+
+ return $report;
+ }
+
+ /**
+ * Get API key (with prefix if set)
+ *
+ * @param string $apiKeyIdentifier name of apikey
+ *
+ * @return null|string API key with the prefix
+ */
+ public function getApiKeyWithPrefix($apiKeyIdentifier)
+ {
+ $prefix = $this->getApiKeyPrefix($apiKeyIdentifier);
+ $apiKey = $this->getApiKey($apiKeyIdentifier);
+
+ if ($apiKey === null) {
+ return null;
+ }
+
+ if ($prefix === null) {
+ $keyWithPrefix = $apiKey;
+ } else {
+ $keyWithPrefix = $prefix . ' ' . $apiKey;
+ }
+
+ return $keyWithPrefix;
+ }
+
+ /**
+ * Returns an array of host settings
+ *
+ * @return array an array of host settings
+ */
+ public function getHostSettings()
+ {
+ return [
+ [
+ "url" => "http://{server}.swagger.io:{port}/v2",
+ "description" => "petstore server",
+ "variables" => [
+ "server" => [
+ "description" => "No description provided",
+ "default_value" => "petstore",
+ "enum_values" => [
+ "petstore",
+ "qa-petstore",
+ "dev-petstore"
+ ]
+ ],
+ "port" => [
+ "description" => "No description provided",
+ "default_value" => "80",
+ "enum_values" => [
+ "80",
+ "8080"
+ ]
+ ]
+ ]
+ ],
+ [
+ "url" => "https://localhost:8080/{version}",
+ "description" => "The local server",
+ "variables" => [
+ "version" => [
+ "description" => "No description provided",
+ "default_value" => "v2",
+ "enum_values" => [
+ "v1",
+ "v2"
+ ]
+ ]
+ ]
+ ],
+ [
+ "url" => "https://127.0.0.1/no_varaible",
+ "description" => "The local server without variables",
+ ]
+ ];
+ }
+
+ /**
+ * Returns URL based on host settings, index and variables
+ *
+ * @param array $hostSettings array of host settings, generated from getHostSettings() or equivalent from the API clients
+ * @param int $hostIndex index of the host settings
+ * @param array|null $variables hash of variable and the corresponding value (optional)
+ * @return string URL based on host settings
+ */
+ public static function getHostString(array $hostsSettings, $hostIndex, array $variables = null)
+ {
+ if (null === $variables) {
+ $variables = [];
+ }
+
+ // check array index out of bound
+ if ($hostIndex < 0 || $hostIndex >= count($hostsSettings)) {
+ throw new \InvalidArgumentException("Invalid index $hostIndex when selecting the host. Must be less than ".count($hostsSettings));
+ }
+
+ $host = $hostsSettings[$hostIndex];
+ $url = $host["url"];
+
+ // go through variable and assign a value
+ foreach ($host["variables"] ?? [] as $name => $variable) {
+ if (array_key_exists($name, $variables)) { // check to see if it's in the variables provided by the user
+ if (!isset($variable['enum_values']) || in_array($variables[$name], $variable["enum_values"], true)) { // check to see if the value is in the enum
+ $url = str_replace("{".$name."}", $variables[$name], $url);
+ } else {
+ throw new \InvalidArgumentException("The variable `$name` in the host URL has invalid value ".$variables[$name].". Must be ".join(',', $variable["enum_values"]).".");
+ }
+ } else {
+ // use default value
+ $url = str_replace("{".$name."}", $variable["default_value"], $url);
+ }
+ }
+
+ return $url;
+ }
+
+ /**
+ * Returns URL based on the index and variables
+ *
+ * @param int $index index of the host settings
+ * @param array|null $variables hash of variable and the corresponding value (optional)
+ * @return string URL based on host settings
+ */
+ public function getHostFromSettings($index, $variables = null)
+ {
+ return self::getHostString($this->getHostSettings(), $index, $variables);
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/DebugPlugin.php b/samples/client/petstore/php/psr-18/lib/DebugPlugin.php
new file mode 100644
index 0000000000..6d628b868c
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/DebugPlugin.php
@@ -0,0 +1,101 @@
+output = $output;
+ }
+
+ public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
+ {
+ return $next($request)->then(
+ function (ResponseInterface $response) use ($request) {
+ $this->logSuccess($request, $response);
+
+ return $response;
+ },
+ function (ClientExceptionInterface $exception) use ($request) {
+ $this->logError($request, $exception);
+
+ throw $exception;
+ }
+ );
+ }
+
+ private function logSuccess(RequestInterface $request, ResponseInterface $response): void
+ {
+ $methodAndPath = $request->getMethod() . ' ' . $request->getUri()->getPath();
+ $protocol = $response->getProtocolVersion();
+ $responseCode = $response->getStatusCode();
+ \fprintf($this->output, '<%s HTTP/%s> %s', $methodAndPath, $protocol, $responseCode);
+ \fwrite($this->output, "\n");
+ }
+
+ private function logError(RequestInterface $request, ClientExceptionInterface $exception): void
+ {
+ $methodAndPath = $request->getMethod() . ' ' . $request->getUri()->getPath();
+ $protocol = $request->getProtocolVersion();
+ $error = $exception->getMessage();
+ $responseCode = $exception->getCode();
+ \fprintf($this->output, '<%s HTTP/%s> %s %s', $methodAndPath, $responseCode, $error, $protocol);
+ \fwrite($this->output, "\n");
+ }
+}
\ No newline at end of file
diff --git a/samples/client/petstore/php/psr-18/lib/HeaderSelector.php b/samples/client/petstore/php/psr-18/lib/HeaderSelector.php
new file mode 100644
index 0000000000..1160db10ef
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/HeaderSelector.php
@@ -0,0 +1,245 @@
+selectAcceptHeader($accept);
+ if ($accept !== null) {
+ $headers['Accept'] = $accept;
+ }
+
+ if (!$isMultipart) {
+ if($contentType === '') {
+ $contentType = 'application/json';
+ }
+
+ $headers['Content-Type'] = $contentType;
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Return the header 'Accept' based on an array of Accept provided.
+ *
+ * @param string[] $accept Array of header
+ *
+ * @return null|string Accept (e.g. application/json)
+ */
+ private function selectAcceptHeader(array $accept): ?string
+ {
+ # filter out empty entries
+ $accept = array_filter($accept);
+
+ if (count($accept) === 0) {
+ return null;
+ }
+
+ # If there's only one Accept header, just use it
+ if (count($accept) === 1) {
+ return reset($accept);
+ }
+
+ # If none of the available Accept headers is of type "json", then just use all them
+ $headersWithJson = preg_grep('~(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$~', $accept);
+ if (count($headersWithJson) === 0) {
+ return implode(',', $accept);
+ }
+
+ # If we got here, then we need add quality values (weight), as described in IETF RFC 9110, Items 12.4.2/12.5.1,
+ # to give the highest priority to json-like headers - recalculating the existing ones, if needed
+ return $this->getAcceptHeaderWithAdjustedWeight($accept, $headersWithJson);
+ }
+
+ /**
+ * Create an Accept header string from the given "Accept" headers array, recalculating all weights
+ *
+ * @param string[] $accept Array of Accept Headers
+ * @param string[] $headersWithJson Array of Accept Headers of type "json"
+ *
+ * @return string "Accept" Header (e.g. "application/json, text/html; q=0.9")
+ */
+ private function getAcceptHeaderWithAdjustedWeight(array $accept, array $headersWithJson): string
+ {
+ $processedHeaders = [
+ 'withApplicationJson' => [],
+ 'withJson' => [],
+ 'withoutJson' => [],
+ ];
+
+ foreach ($accept as $header) {
+
+ $headerData = $this->getHeaderAndWeight($header);
+
+ if (stripos($headerData['header'], 'application/json') === 0) {
+ $processedHeaders['withApplicationJson'][] = $headerData;
+ } elseif (in_array($header, $headersWithJson, true)) {
+ $processedHeaders['withJson'][] = $headerData;
+ } else {
+ $processedHeaders['withoutJson'][] = $headerData;
+ }
+ }
+
+ $acceptHeaders = [];
+ $currentWeight = 1000;
+
+ $hasMoreThan28Headers = count($accept) > 28;
+
+ foreach($processedHeaders as $headers) {
+ if (count($headers) > 0) {
+ $acceptHeaders[] = $this->adjustWeight($headers, $currentWeight, $hasMoreThan28Headers);
+ }
+ }
+
+ $acceptHeaders = array_merge(...$acceptHeaders);
+
+ return implode(',', $acceptHeaders);
+ }
+
+ /**
+ * Given an Accept header, returns an associative array splitting the header and its weight
+ *
+ * @param string $header "Accept" Header
+ *
+ * @return array with the header and its weight
+ */
+ private function getHeaderAndWeight(string $header): array
+ {
+ # matches headers with weight, splitting the header and the weight in $outputArray
+ if (preg_match('/(.*);\s*q=(1(?:\.0+)?|0\.\d+)$/', $header, $outputArray) === 1) {
+ $headerData = [
+ 'header' => $outputArray[1],
+ 'weight' => (int)($outputArray[2] * 1000),
+ ];
+ } else {
+ $headerData = [
+ 'header' => trim($header),
+ 'weight' => 1000,
+ ];
+ }
+
+ return $headerData;
+ }
+
+ /**
+ * @param array[] $headers
+ * @param float $currentWeight
+ * @param bool $hasMoreThan28Headers
+ * @return string[] array of adjusted "Accept" headers
+ */
+ private function adjustWeight(array $headers, float &$currentWeight, bool $hasMoreThan28Headers): array
+ {
+ usort($headers, function (array $a, array $b) {
+ return $b['weight'] - $a['weight'];
+ });
+
+ $acceptHeaders = [];
+ foreach ($headers as $index => $header) {
+ if($index > 0 && $headers[$index - 1]['weight'] > $header['weight'])
+ {
+ $currentWeight = $this->getNextWeight($currentWeight, $hasMoreThan28Headers);
+ }
+
+ $weight = $currentWeight;
+
+ $acceptHeaders[] = $this->buildAcceptHeader($header['header'], $weight);
+ }
+
+ $currentWeight = $this->getNextWeight($currentWeight, $hasMoreThan28Headers);
+
+ return $acceptHeaders;
+ }
+
+ /**
+ * @param string $header
+ * @param int $weight
+ * @return string
+ */
+ private function buildAcceptHeader(string $header, int $weight): string
+ {
+ if($weight === 1000) {
+ return $header;
+ }
+
+ return trim($header, '; ') . ';q=' . rtrim(sprintf('%0.3f', $weight / 1000), '0');
+ }
+
+ /**
+ * Calculate the next weight, based on the current one.
+ *
+ * If there are less than 28 "Accept" headers, the weights will be decreased by 1 on its highest significant digit, using the
+ * following formula:
+ *
+ * next weight = current weight - 10 ^ (floor(log(current weight - 1)))
+ *
+ * ( current weight minus ( 10 raised to the power of ( floor of (log to the base 10 of ( current weight minus 1 ) ) ) ) )
+ *
+ * Starting from 1000, this generates the following series:
+ *
+ * 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
+ *
+ * The resulting quality codes are closer to the average "normal" usage of them (like "q=0.9", "q=0.8" and so on), but it only works
+ * if there is a maximum of 28 "Accept" headers. If we have more than that (which is extremely unlikely), then we fall back to a 1-by-1
+ * decrement rule, which will result in quality codes like "q=0.999", "q=0.998" etc.
+ *
+ * @param int $currentWeight varying from 1 to 1000 (will be divided by 1000 to build the quality value)
+ * @param bool $hasMoreThan28Headers
+ * @return int
+ */
+ public function getNextWeight(int $currentWeight, bool $hasMoreThan28Headers): int
+ {
+ if ($currentWeight <= 1) {
+ return 1;
+ }
+
+ if ($hasMoreThan28Headers) {
+ return $currentWeight - 1;
+ }
+
+ return $currentWeight - 10 ** floor( log10($currentWeight - 1) );
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/lib/Model/AdditionalPropertiesClass.php b/samples/client/petstore/php/psr-18/lib/Model/AdditionalPropertiesClass.php
new file mode 100644
index 0000000000..5cce5069dc
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/AdditionalPropertiesClass.php
@@ -0,0 +1,443 @@
+
+ */
+class AdditionalPropertiesClass implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'AdditionalPropertiesClass';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'map_property' => 'array',
+ 'map_of_map_property' => 'array>'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'map_property' => null,
+ 'map_of_map_property' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'map_property' => false,
+ 'map_of_map_property' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'map_property' => 'map_property',
+ 'map_of_map_property' => 'map_of_map_property'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'map_property' => 'setMapProperty',
+ 'map_of_map_property' => 'setMapOfMapProperty'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'map_property' => 'getMapProperty',
+ 'map_of_map_property' => 'getMapOfMapProperty'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('map_property', $data ?? [], null);
+ $this->setIfExists('map_of_map_property', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets map_property
+ *
+ * @return array|null
+ */
+ public function getMapProperty()
+ {
+ return $this->container['map_property'];
+ }
+
+ /**
+ * Sets map_property
+ *
+ * @param array|null $map_property map_property
+ *
+ * @return self
+ */
+ public function setMapProperty($map_property)
+ {
+ if (is_null($map_property)) {
+ throw new \InvalidArgumentException('non-nullable map_property cannot be null');
+ }
+ $this->container['map_property'] = $map_property;
+
+ return $this;
+ }
+
+ /**
+ * Gets map_of_map_property
+ *
+ * @return array>|null
+ */
+ public function getMapOfMapProperty()
+ {
+ return $this->container['map_of_map_property'];
+ }
+
+ /**
+ * Sets map_of_map_property
+ *
+ * @param array>|null $map_of_map_property map_of_map_property
+ *
+ * @return self
+ */
+ public function setMapOfMapProperty($map_of_map_property)
+ {
+ if (is_null($map_of_map_property)) {
+ throw new \InvalidArgumentException('non-nullable map_of_map_property cannot be null');
+ }
+ $this->container['map_of_map_property'] = $map_of_map_property;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/AllOfWithSingleRef.php b/samples/client/petstore/php/psr-18/lib/Model/AllOfWithSingleRef.php
new file mode 100644
index 0000000000..d280974683
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/AllOfWithSingleRef.php
@@ -0,0 +1,443 @@
+
+ */
+class AllOfWithSingleRef implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'AllOfWithSingleRef';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'username' => 'string',
+ 'single_ref_type' => '\OpenAPI\Client\Model\SingleRefType'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'username' => null,
+ 'single_ref_type' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'username' => false,
+ 'single_ref_type' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'username' => 'username',
+ 'single_ref_type' => 'SingleRefType'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'username' => 'setUsername',
+ 'single_ref_type' => 'setSingleRefType'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'username' => 'getUsername',
+ 'single_ref_type' => 'getSingleRefType'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('username', $data ?? [], null);
+ $this->setIfExists('single_ref_type', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets username
+ *
+ * @return string|null
+ */
+ public function getUsername()
+ {
+ return $this->container['username'];
+ }
+
+ /**
+ * Sets username
+ *
+ * @param string|null $username username
+ *
+ * @return self
+ */
+ public function setUsername($username)
+ {
+ if (is_null($username)) {
+ throw new \InvalidArgumentException('non-nullable username cannot be null');
+ }
+ $this->container['username'] = $username;
+
+ return $this;
+ }
+
+ /**
+ * Gets single_ref_type
+ *
+ * @return \OpenAPI\Client\Model\SingleRefType|null
+ */
+ public function getSingleRefType()
+ {
+ return $this->container['single_ref_type'];
+ }
+
+ /**
+ * Sets single_ref_type
+ *
+ * @param \OpenAPI\Client\Model\SingleRefType|null $single_ref_type single_ref_type
+ *
+ * @return self
+ */
+ public function setSingleRefType($single_ref_type)
+ {
+ if (is_null($single_ref_type)) {
+ throw new \InvalidArgumentException('non-nullable single_ref_type cannot be null');
+ }
+ $this->container['single_ref_type'] = $single_ref_type;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Animal.php b/samples/client/petstore/php/psr-18/lib/Model/Animal.php
new file mode 100644
index 0000000000..fe58a797f1
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Animal.php
@@ -0,0 +1,449 @@
+
+ */
+class Animal implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = 'class_name';
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Animal';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'class_name' => 'string',
+ 'color' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'class_name' => null,
+ 'color' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'class_name' => false,
+ 'color' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'class_name' => 'className',
+ 'color' => 'color'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'class_name' => 'setClassName',
+ 'color' => 'setColor'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'class_name' => 'getClassName',
+ 'color' => 'getColor'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('class_name', $data ?? [], null);
+ $this->setIfExists('color', $data ?? [], 'red');
+
+ // Initialize discriminator property with the model name.
+ $this->container['class_name'] = static::$openAPIModelName;
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if ($this->container['class_name'] === null) {
+ $invalidProperties[] = "'class_name' can't be null";
+ }
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets class_name
+ *
+ * @return string
+ */
+ public function getClassName()
+ {
+ return $this->container['class_name'];
+ }
+
+ /**
+ * Sets class_name
+ *
+ * @param string $class_name class_name
+ *
+ * @return self
+ */
+ public function setClassName($class_name)
+ {
+ if (is_null($class_name)) {
+ throw new \InvalidArgumentException('non-nullable class_name cannot be null');
+ }
+ $this->container['class_name'] = $class_name;
+
+ return $this;
+ }
+
+ /**
+ * Gets color
+ *
+ * @return string|null
+ */
+ public function getColor()
+ {
+ return $this->container['color'];
+ }
+
+ /**
+ * Sets color
+ *
+ * @param string|null $color color
+ *
+ * @return self
+ */
+ public function setColor($color)
+ {
+ if (is_null($color)) {
+ throw new \InvalidArgumentException('non-nullable color cannot be null');
+ }
+ $this->container['color'] = $color;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ApiResponse.php b/samples/client/petstore/php/psr-18/lib/Model/ApiResponse.php
new file mode 100644
index 0000000000..f1ae1dc877
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ApiResponse.php
@@ -0,0 +1,477 @@
+
+ */
+class ApiResponse implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ApiResponse';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'code' => 'int',
+ 'type' => 'string',
+ 'message' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'code' => 'int32',
+ 'type' => null,
+ 'message' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'code' => false,
+ 'type' => false,
+ 'message' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'code' => 'code',
+ 'type' => 'type',
+ 'message' => 'message'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'code' => 'setCode',
+ 'type' => 'setType',
+ 'message' => 'setMessage'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'code' => 'getCode',
+ 'type' => 'getType',
+ 'message' => 'getMessage'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('code', $data ?? [], null);
+ $this->setIfExists('type', $data ?? [], null);
+ $this->setIfExists('message', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets code
+ *
+ * @return int|null
+ */
+ public function getCode()
+ {
+ return $this->container['code'];
+ }
+
+ /**
+ * Sets code
+ *
+ * @param int|null $code code
+ *
+ * @return self
+ */
+ public function setCode($code)
+ {
+ if (is_null($code)) {
+ throw new \InvalidArgumentException('non-nullable code cannot be null');
+ }
+ $this->container['code'] = $code;
+
+ return $this;
+ }
+
+ /**
+ * Gets type
+ *
+ * @return string|null
+ */
+ public function getType()
+ {
+ return $this->container['type'];
+ }
+
+ /**
+ * Sets type
+ *
+ * @param string|null $type type
+ *
+ * @return self
+ */
+ public function setType($type)
+ {
+ if (is_null($type)) {
+ throw new \InvalidArgumentException('non-nullable type cannot be null');
+ }
+ $this->container['type'] = $type;
+
+ return $this;
+ }
+
+ /**
+ * Gets message
+ *
+ * @return string|null
+ */
+ public function getMessage()
+ {
+ return $this->container['message'];
+ }
+
+ /**
+ * Sets message
+ *
+ * @param string|null $message message
+ *
+ * @return self
+ */
+ public function setMessage($message)
+ {
+ if (is_null($message)) {
+ throw new \InvalidArgumentException('non-nullable message cannot be null');
+ }
+ $this->container['message'] = $message;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ArrayOfArrayOfNumberOnly.php b/samples/client/petstore/php/psr-18/lib/Model/ArrayOfArrayOfNumberOnly.php
new file mode 100644
index 0000000000..33acc1a6c1
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ArrayOfArrayOfNumberOnly.php
@@ -0,0 +1,409 @@
+
+ */
+class ArrayOfArrayOfNumberOnly implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ArrayOfArrayOfNumberOnly';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'array_array_number' => 'float[][]'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'array_array_number' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'array_array_number' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'array_array_number' => 'ArrayArrayNumber'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'array_array_number' => 'setArrayArrayNumber'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'array_array_number' => 'getArrayArrayNumber'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('array_array_number', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets array_array_number
+ *
+ * @return float[][]|null
+ */
+ public function getArrayArrayNumber()
+ {
+ return $this->container['array_array_number'];
+ }
+
+ /**
+ * Sets array_array_number
+ *
+ * @param float[][]|null $array_array_number array_array_number
+ *
+ * @return self
+ */
+ public function setArrayArrayNumber($array_array_number)
+ {
+ if (is_null($array_array_number)) {
+ throw new \InvalidArgumentException('non-nullable array_array_number cannot be null');
+ }
+ $this->container['array_array_number'] = $array_array_number;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ArrayOfNumberOnly.php b/samples/client/petstore/php/psr-18/lib/Model/ArrayOfNumberOnly.php
new file mode 100644
index 0000000000..fd61c9166f
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ArrayOfNumberOnly.php
@@ -0,0 +1,409 @@
+
+ */
+class ArrayOfNumberOnly implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ArrayOfNumberOnly';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'array_number' => 'float[]'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'array_number' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'array_number' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'array_number' => 'ArrayNumber'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'array_number' => 'setArrayNumber'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'array_number' => 'getArrayNumber'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('array_number', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets array_number
+ *
+ * @return float[]|null
+ */
+ public function getArrayNumber()
+ {
+ return $this->container['array_number'];
+ }
+
+ /**
+ * Sets array_number
+ *
+ * @param float[]|null $array_number array_number
+ *
+ * @return self
+ */
+ public function setArrayNumber($array_number)
+ {
+ if (is_null($array_number)) {
+ throw new \InvalidArgumentException('non-nullable array_number cannot be null');
+ }
+ $this->container['array_number'] = $array_number;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ArrayTest.php b/samples/client/petstore/php/psr-18/lib/Model/ArrayTest.php
new file mode 100644
index 0000000000..a77d6249dd
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ArrayTest.php
@@ -0,0 +1,492 @@
+
+ */
+class ArrayTest implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ArrayTest';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'array_of_string' => 'string[]',
+ 'array_array_of_integer' => 'int[][]',
+ 'array_array_of_model' => '\OpenAPI\Client\Model\ReadOnlyFirst[][]'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'array_of_string' => null,
+ 'array_array_of_integer' => 'int64',
+ 'array_array_of_model' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'array_of_string' => false,
+ 'array_array_of_integer' => false,
+ 'array_array_of_model' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'array_of_string' => 'array_of_string',
+ 'array_array_of_integer' => 'array_array_of_integer',
+ 'array_array_of_model' => 'array_array_of_model'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'array_of_string' => 'setArrayOfString',
+ 'array_array_of_integer' => 'setArrayArrayOfInteger',
+ 'array_array_of_model' => 'setArrayArrayOfModel'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'array_of_string' => 'getArrayOfString',
+ 'array_array_of_integer' => 'getArrayArrayOfInteger',
+ 'array_array_of_model' => 'getArrayArrayOfModel'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('array_of_string', $data ?? [], null);
+ $this->setIfExists('array_array_of_integer', $data ?? [], null);
+ $this->setIfExists('array_array_of_model', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if (!is_null($this->container['array_of_string']) && (count($this->container['array_of_string']) > 3)) {
+ $invalidProperties[] = "invalid value for 'array_of_string', number of items must be less than or equal to 3.";
+ }
+
+ if (!is_null($this->container['array_of_string']) && (count($this->container['array_of_string']) < 0)) {
+ $invalidProperties[] = "invalid value for 'array_of_string', number of items must be greater than or equal to 0.";
+ }
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets array_of_string
+ *
+ * @return string[]|null
+ */
+ public function getArrayOfString()
+ {
+ return $this->container['array_of_string'];
+ }
+
+ /**
+ * Sets array_of_string
+ *
+ * @param string[]|null $array_of_string array_of_string
+ *
+ * @return self
+ */
+ public function setArrayOfString($array_of_string)
+ {
+ if (is_null($array_of_string)) {
+ throw new \InvalidArgumentException('non-nullable array_of_string cannot be null');
+ }
+
+ if ((count($array_of_string) > 3)) {
+ throw new \InvalidArgumentException('invalid value for $array_of_string when calling ArrayTest., number of items must be less than or equal to 3.');
+ }
+ if ((count($array_of_string) < 0)) {
+ throw new \InvalidArgumentException('invalid length for $array_of_string when calling ArrayTest., number of items must be greater than or equal to 0.');
+ }
+ $this->container['array_of_string'] = $array_of_string;
+
+ return $this;
+ }
+
+ /**
+ * Gets array_array_of_integer
+ *
+ * @return int[][]|null
+ */
+ public function getArrayArrayOfInteger()
+ {
+ return $this->container['array_array_of_integer'];
+ }
+
+ /**
+ * Sets array_array_of_integer
+ *
+ * @param int[][]|null $array_array_of_integer array_array_of_integer
+ *
+ * @return self
+ */
+ public function setArrayArrayOfInteger($array_array_of_integer)
+ {
+ if (is_null($array_array_of_integer)) {
+ throw new \InvalidArgumentException('non-nullable array_array_of_integer cannot be null');
+ }
+ $this->container['array_array_of_integer'] = $array_array_of_integer;
+
+ return $this;
+ }
+
+ /**
+ * Gets array_array_of_model
+ *
+ * @return \OpenAPI\Client\Model\ReadOnlyFirst[][]|null
+ */
+ public function getArrayArrayOfModel()
+ {
+ return $this->container['array_array_of_model'];
+ }
+
+ /**
+ * Sets array_array_of_model
+ *
+ * @param \OpenAPI\Client\Model\ReadOnlyFirst[][]|null $array_array_of_model array_array_of_model
+ *
+ * @return self
+ */
+ public function setArrayArrayOfModel($array_array_of_model)
+ {
+ if (is_null($array_array_of_model)) {
+ throw new \InvalidArgumentException('non-nullable array_array_of_model cannot be null');
+ }
+ $this->container['array_array_of_model'] = $array_array_of_model;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Capitalization.php b/samples/client/petstore/php/psr-18/lib/Model/Capitalization.php
new file mode 100644
index 0000000000..862049945d
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Capitalization.php
@@ -0,0 +1,579 @@
+
+ */
+class Capitalization implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Capitalization';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'small_camel' => 'string',
+ 'capital_camel' => 'string',
+ 'small_snake' => 'string',
+ 'capital_snake' => 'string',
+ 'sca_eth_flow_points' => 'string',
+ 'att_name' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'small_camel' => null,
+ 'capital_camel' => null,
+ 'small_snake' => null,
+ 'capital_snake' => null,
+ 'sca_eth_flow_points' => null,
+ 'att_name' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'small_camel' => false,
+ 'capital_camel' => false,
+ 'small_snake' => false,
+ 'capital_snake' => false,
+ 'sca_eth_flow_points' => false,
+ 'att_name' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'small_camel' => 'smallCamel',
+ 'capital_camel' => 'CapitalCamel',
+ 'small_snake' => 'small_Snake',
+ 'capital_snake' => 'Capital_Snake',
+ 'sca_eth_flow_points' => 'SCA_ETH_Flow_Points',
+ 'att_name' => 'ATT_NAME'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'small_camel' => 'setSmallCamel',
+ 'capital_camel' => 'setCapitalCamel',
+ 'small_snake' => 'setSmallSnake',
+ 'capital_snake' => 'setCapitalSnake',
+ 'sca_eth_flow_points' => 'setScaEthFlowPoints',
+ 'att_name' => 'setAttName'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'small_camel' => 'getSmallCamel',
+ 'capital_camel' => 'getCapitalCamel',
+ 'small_snake' => 'getSmallSnake',
+ 'capital_snake' => 'getCapitalSnake',
+ 'sca_eth_flow_points' => 'getScaEthFlowPoints',
+ 'att_name' => 'getAttName'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('small_camel', $data ?? [], null);
+ $this->setIfExists('capital_camel', $data ?? [], null);
+ $this->setIfExists('small_snake', $data ?? [], null);
+ $this->setIfExists('capital_snake', $data ?? [], null);
+ $this->setIfExists('sca_eth_flow_points', $data ?? [], null);
+ $this->setIfExists('att_name', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets small_camel
+ *
+ * @return string|null
+ */
+ public function getSmallCamel()
+ {
+ return $this->container['small_camel'];
+ }
+
+ /**
+ * Sets small_camel
+ *
+ * @param string|null $small_camel small_camel
+ *
+ * @return self
+ */
+ public function setSmallCamel($small_camel)
+ {
+ if (is_null($small_camel)) {
+ throw new \InvalidArgumentException('non-nullable small_camel cannot be null');
+ }
+ $this->container['small_camel'] = $small_camel;
+
+ return $this;
+ }
+
+ /**
+ * Gets capital_camel
+ *
+ * @return string|null
+ */
+ public function getCapitalCamel()
+ {
+ return $this->container['capital_camel'];
+ }
+
+ /**
+ * Sets capital_camel
+ *
+ * @param string|null $capital_camel capital_camel
+ *
+ * @return self
+ */
+ public function setCapitalCamel($capital_camel)
+ {
+ if (is_null($capital_camel)) {
+ throw new \InvalidArgumentException('non-nullable capital_camel cannot be null');
+ }
+ $this->container['capital_camel'] = $capital_camel;
+
+ return $this;
+ }
+
+ /**
+ * Gets small_snake
+ *
+ * @return string|null
+ */
+ public function getSmallSnake()
+ {
+ return $this->container['small_snake'];
+ }
+
+ /**
+ * Sets small_snake
+ *
+ * @param string|null $small_snake small_snake
+ *
+ * @return self
+ */
+ public function setSmallSnake($small_snake)
+ {
+ if (is_null($small_snake)) {
+ throw new \InvalidArgumentException('non-nullable small_snake cannot be null');
+ }
+ $this->container['small_snake'] = $small_snake;
+
+ return $this;
+ }
+
+ /**
+ * Gets capital_snake
+ *
+ * @return string|null
+ */
+ public function getCapitalSnake()
+ {
+ return $this->container['capital_snake'];
+ }
+
+ /**
+ * Sets capital_snake
+ *
+ * @param string|null $capital_snake capital_snake
+ *
+ * @return self
+ */
+ public function setCapitalSnake($capital_snake)
+ {
+ if (is_null($capital_snake)) {
+ throw new \InvalidArgumentException('non-nullable capital_snake cannot be null');
+ }
+ $this->container['capital_snake'] = $capital_snake;
+
+ return $this;
+ }
+
+ /**
+ * Gets sca_eth_flow_points
+ *
+ * @return string|null
+ */
+ public function getScaEthFlowPoints()
+ {
+ return $this->container['sca_eth_flow_points'];
+ }
+
+ /**
+ * Sets sca_eth_flow_points
+ *
+ * @param string|null $sca_eth_flow_points sca_eth_flow_points
+ *
+ * @return self
+ */
+ public function setScaEthFlowPoints($sca_eth_flow_points)
+ {
+ if (is_null($sca_eth_flow_points)) {
+ throw new \InvalidArgumentException('non-nullable sca_eth_flow_points cannot be null');
+ }
+ $this->container['sca_eth_flow_points'] = $sca_eth_flow_points;
+
+ return $this;
+ }
+
+ /**
+ * Gets att_name
+ *
+ * @return string|null
+ */
+ public function getAttName()
+ {
+ return $this->container['att_name'];
+ }
+
+ /**
+ * Sets att_name
+ *
+ * @param string|null $att_name Name of the pet
+ *
+ * @return self
+ */
+ public function setAttName($att_name)
+ {
+ if (is_null($att_name)) {
+ throw new \InvalidArgumentException('non-nullable att_name cannot be null');
+ }
+ $this->container['att_name'] = $att_name;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Cat.php b/samples/client/petstore/php/psr-18/lib/Model/Cat.php
new file mode 100644
index 0000000000..395d7c1cfa
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Cat.php
@@ -0,0 +1,403 @@
+
+ */
+class Cat extends Animal
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Cat';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'declawed' => 'bool'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'declawed' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'declawed' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes + parent::openAPITypes();
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats + parent::openAPIFormats();
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables + parent::openAPINullables();
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'declawed' => 'declawed'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'declawed' => 'setDeclawed'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'declawed' => 'getDeclawed'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return parent::attributeMap() + self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return parent::setters() + self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return parent::getters() + self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ parent::__construct($data);
+
+ $this->setIfExists('declawed', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = parent::listInvalidProperties();
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets declawed
+ *
+ * @return bool|null
+ */
+ public function getDeclawed()
+ {
+ return $this->container['declawed'];
+ }
+
+ /**
+ * Sets declawed
+ *
+ * @param bool|null $declawed declawed
+ *
+ * @return self
+ */
+ public function setDeclawed($declawed)
+ {
+ if (is_null($declawed)) {
+ throw new \InvalidArgumentException('non-nullable declawed cannot be null');
+ }
+ $this->container['declawed'] = $declawed;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Category.php b/samples/client/petstore/php/psr-18/lib/Model/Category.php
new file mode 100644
index 0000000000..234efc10f4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Category.php
@@ -0,0 +1,446 @@
+
+ */
+class Category implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Category';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'id' => 'int',
+ 'name' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'id' => 'int64',
+ 'name' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'id' => false,
+ 'name' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'id' => 'id',
+ 'name' => 'name'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'id' => 'setId',
+ 'name' => 'setName'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'id' => 'getId',
+ 'name' => 'getName'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('id', $data ?? [], null);
+ $this->setIfExists('name', $data ?? [], 'default-name');
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if ($this->container['name'] === null) {
+ $invalidProperties[] = "'name' can't be null";
+ }
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets id
+ *
+ * @return int|null
+ */
+ public function getId()
+ {
+ return $this->container['id'];
+ }
+
+ /**
+ * Sets id
+ *
+ * @param int|null $id id
+ *
+ * @return self
+ */
+ public function setId($id)
+ {
+ if (is_null($id)) {
+ throw new \InvalidArgumentException('non-nullable id cannot be null');
+ }
+ $this->container['id'] = $id;
+
+ return $this;
+ }
+
+ /**
+ * Gets name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->container['name'];
+ }
+
+ /**
+ * Sets name
+ *
+ * @param string $name name
+ *
+ * @return self
+ */
+ public function setName($name)
+ {
+ if (is_null($name)) {
+ throw new \InvalidArgumentException('non-nullable name cannot be null');
+ }
+ $this->container['name'] = $name;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ClassModel.php b/samples/client/petstore/php/psr-18/lib/Model/ClassModel.php
new file mode 100644
index 0000000000..493f2d8dcb
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ClassModel.php
@@ -0,0 +1,410 @@
+
+ */
+class ClassModel implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ClassModel';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ '_class' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ '_class' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ '_class' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ '_class' => '_class'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ '_class' => 'setClass'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ '_class' => 'getClass'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('_class', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets _class
+ *
+ * @return string|null
+ */
+ public function getClass()
+ {
+ return $this->container['_class'];
+ }
+
+ /**
+ * Sets _class
+ *
+ * @param string|null $_class _class
+ *
+ * @return self
+ */
+ public function setClass($_class)
+ {
+ if (is_null($_class)) {
+ throw new \InvalidArgumentException('non-nullable _class cannot be null');
+ }
+ $this->container['_class'] = $_class;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Client.php b/samples/client/petstore/php/psr-18/lib/Model/Client.php
new file mode 100644
index 0000000000..21cdecebd2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Client.php
@@ -0,0 +1,409 @@
+
+ */
+class Client implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Client';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'client' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'client' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'client' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'client' => 'client'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'client' => 'setClient'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'client' => 'getClient'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('client', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets client
+ *
+ * @return string|null
+ */
+ public function getClient()
+ {
+ return $this->container['client'];
+ }
+
+ /**
+ * Sets client
+ *
+ * @param string|null $client client
+ *
+ * @return self
+ */
+ public function setClient($client)
+ {
+ if (is_null($client)) {
+ throw new \InvalidArgumentException('non-nullable client cannot be null');
+ }
+ $this->container['client'] = $client;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/DeprecatedObject.php b/samples/client/petstore/php/psr-18/lib/Model/DeprecatedObject.php
new file mode 100644
index 0000000000..4e6beca054
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/DeprecatedObject.php
@@ -0,0 +1,409 @@
+
+ */
+class DeprecatedObject implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'DeprecatedObject';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'name' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'name' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'name' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'name' => 'name'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'name' => 'setName'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'name' => 'getName'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('name', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets name
+ *
+ * @return string|null
+ */
+ public function getName()
+ {
+ return $this->container['name'];
+ }
+
+ /**
+ * Sets name
+ *
+ * @param string|null $name name
+ *
+ * @return self
+ */
+ public function setName($name)
+ {
+ if (is_null($name)) {
+ throw new \InvalidArgumentException('non-nullable name cannot be null');
+ }
+ $this->container['name'] = $name;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Dog.php b/samples/client/petstore/php/psr-18/lib/Model/Dog.php
new file mode 100644
index 0000000000..1e8279206b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Dog.php
@@ -0,0 +1,403 @@
+
+ */
+class Dog extends Animal
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Dog';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'breed' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'breed' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'breed' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes + parent::openAPITypes();
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats + parent::openAPIFormats();
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables + parent::openAPINullables();
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'breed' => 'breed'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'breed' => 'setBreed'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'breed' => 'getBreed'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return parent::attributeMap() + self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return parent::setters() + self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return parent::getters() + self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ parent::__construct($data);
+
+ $this->setIfExists('breed', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = parent::listInvalidProperties();
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets breed
+ *
+ * @return string|null
+ */
+ public function getBreed()
+ {
+ return $this->container['breed'];
+ }
+
+ /**
+ * Sets breed
+ *
+ * @param string|null $breed breed
+ *
+ * @return self
+ */
+ public function setBreed($breed)
+ {
+ if (is_null($breed)) {
+ throw new \InvalidArgumentException('non-nullable breed cannot be null');
+ }
+ $this->container['breed'] = $breed;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/EnumArrays.php b/samples/client/petstore/php/psr-18/lib/Model/EnumArrays.php
new file mode 100644
index 0000000000..61abc5c592
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/EnumArrays.php
@@ -0,0 +1,501 @@
+
+ */
+class EnumArrays implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'EnumArrays';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'just_symbol' => 'string',
+ 'array_enum' => 'string[]'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'just_symbol' => null,
+ 'array_enum' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'just_symbol' => false,
+ 'array_enum' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'just_symbol' => 'just_symbol',
+ 'array_enum' => 'array_enum'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'just_symbol' => 'setJustSymbol',
+ 'array_enum' => 'setArrayEnum'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'just_symbol' => 'getJustSymbol',
+ 'array_enum' => 'getArrayEnum'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+ public const JUST_SYMBOL_GREATER_THAN_OR_EQUAL_TO = '>=';
+ public const JUST_SYMBOL_DOLLAR = '$';
+ public const ARRAY_ENUM_FISH = 'fish';
+ public const ARRAY_ENUM_CRAB = 'crab';
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getJustSymbolAllowableValues()
+ {
+ return [
+ self::JUST_SYMBOL_GREATER_THAN_OR_EQUAL_TO,
+ self::JUST_SYMBOL_DOLLAR,
+ ];
+ }
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getArrayEnumAllowableValues()
+ {
+ return [
+ self::ARRAY_ENUM_FISH,
+ self::ARRAY_ENUM_CRAB,
+ ];
+ }
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('just_symbol', $data ?? [], null);
+ $this->setIfExists('array_enum', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ $allowedValues = $this->getJustSymbolAllowableValues();
+ if (!is_null($this->container['just_symbol']) && !in_array($this->container['just_symbol'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'just_symbol', must be one of '%s'",
+ $this->container['just_symbol'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets just_symbol
+ *
+ * @return string|null
+ */
+ public function getJustSymbol()
+ {
+ return $this->container['just_symbol'];
+ }
+
+ /**
+ * Sets just_symbol
+ *
+ * @param string|null $just_symbol just_symbol
+ *
+ * @return self
+ */
+ public function setJustSymbol($just_symbol)
+ {
+ if (is_null($just_symbol)) {
+ throw new \InvalidArgumentException('non-nullable just_symbol cannot be null');
+ }
+ $allowedValues = $this->getJustSymbolAllowableValues();
+ if (!in_array($just_symbol, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'just_symbol', must be one of '%s'",
+ $just_symbol,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['just_symbol'] = $just_symbol;
+
+ return $this;
+ }
+
+ /**
+ * Gets array_enum
+ *
+ * @return string[]|null
+ */
+ public function getArrayEnum()
+ {
+ return $this->container['array_enum'];
+ }
+
+ /**
+ * Sets array_enum
+ *
+ * @param string[]|null $array_enum array_enum
+ *
+ * @return self
+ */
+ public function setArrayEnum($array_enum)
+ {
+ if (is_null($array_enum)) {
+ throw new \InvalidArgumentException('non-nullable array_enum cannot be null');
+ }
+ $allowedValues = $this->getArrayEnumAllowableValues();
+ if (array_diff($array_enum, $allowedValues)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value for 'array_enum', must be one of '%s'",
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['array_enum'] = $array_enum;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/EnumClass.php b/samples/client/petstore/php/psr-18/lib/Model/EnumClass.php
new file mode 100644
index 0000000000..3622d47661
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/EnumClass.php
@@ -0,0 +1,65 @@
+
+ */
+class EnumTest implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Enum_Test';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'enum_string' => 'string',
+ 'enum_string_required' => 'string',
+ 'enum_integer' => 'int',
+ 'enum_number' => 'float',
+ 'outer_enum' => '\OpenAPI\Client\Model\OuterEnum',
+ 'outer_enum_integer' => '\OpenAPI\Client\Model\OuterEnumInteger',
+ 'outer_enum_default_value' => '\OpenAPI\Client\Model\OuterEnumDefaultValue',
+ 'outer_enum_integer_default_value' => '\OpenAPI\Client\Model\OuterEnumIntegerDefaultValue'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'enum_string' => null,
+ 'enum_string_required' => null,
+ 'enum_integer' => 'int32',
+ 'enum_number' => 'double',
+ 'outer_enum' => null,
+ 'outer_enum_integer' => null,
+ 'outer_enum_default_value' => null,
+ 'outer_enum_integer_default_value' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'enum_string' => false,
+ 'enum_string_required' => false,
+ 'enum_integer' => false,
+ 'enum_number' => false,
+ 'outer_enum' => true,
+ 'outer_enum_integer' => false,
+ 'outer_enum_default_value' => false,
+ 'outer_enum_integer_default_value' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'enum_string' => 'enum_string',
+ 'enum_string_required' => 'enum_string_required',
+ 'enum_integer' => 'enum_integer',
+ 'enum_number' => 'enum_number',
+ 'outer_enum' => 'outerEnum',
+ 'outer_enum_integer' => 'outerEnumInteger',
+ 'outer_enum_default_value' => 'outerEnumDefaultValue',
+ 'outer_enum_integer_default_value' => 'outerEnumIntegerDefaultValue'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'enum_string' => 'setEnumString',
+ 'enum_string_required' => 'setEnumStringRequired',
+ 'enum_integer' => 'setEnumInteger',
+ 'enum_number' => 'setEnumNumber',
+ 'outer_enum' => 'setOuterEnum',
+ 'outer_enum_integer' => 'setOuterEnumInteger',
+ 'outer_enum_default_value' => 'setOuterEnumDefaultValue',
+ 'outer_enum_integer_default_value' => 'setOuterEnumIntegerDefaultValue'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'enum_string' => 'getEnumString',
+ 'enum_string_required' => 'getEnumStringRequired',
+ 'enum_integer' => 'getEnumInteger',
+ 'enum_number' => 'getEnumNumber',
+ 'outer_enum' => 'getOuterEnum',
+ 'outer_enum_integer' => 'getOuterEnumInteger',
+ 'outer_enum_default_value' => 'getOuterEnumDefaultValue',
+ 'outer_enum_integer_default_value' => 'getOuterEnumIntegerDefaultValue'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+ public const ENUM_STRING_UPPER = 'UPPER';
+ public const ENUM_STRING_LOWER = 'lower';
+ public const ENUM_STRING_EMPTY = '';
+ public const ENUM_STRING_REQUIRED_UPPER = 'UPPER';
+ public const ENUM_STRING_REQUIRED_LOWER = 'lower';
+ public const ENUM_STRING_REQUIRED_EMPTY = '';
+ public const ENUM_INTEGER_1 = 1;
+ public const ENUM_INTEGER_MINUS_1 = -1;
+ public const ENUM_NUMBER_1_DOT_1 = 1.1;
+ public const ENUM_NUMBER_MINUS_1_DOT_2 = -1.2;
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getEnumStringAllowableValues()
+ {
+ return [
+ self::ENUM_STRING_UPPER,
+ self::ENUM_STRING_LOWER,
+ self::ENUM_STRING_EMPTY,
+ ];
+ }
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getEnumStringRequiredAllowableValues()
+ {
+ return [
+ self::ENUM_STRING_REQUIRED_UPPER,
+ self::ENUM_STRING_REQUIRED_LOWER,
+ self::ENUM_STRING_REQUIRED_EMPTY,
+ ];
+ }
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getEnumIntegerAllowableValues()
+ {
+ return [
+ self::ENUM_INTEGER_1,
+ self::ENUM_INTEGER_MINUS_1,
+ ];
+ }
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getEnumNumberAllowableValues()
+ {
+ return [
+ self::ENUM_NUMBER_1_DOT_1,
+ self::ENUM_NUMBER_MINUS_1_DOT_2,
+ ];
+ }
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('enum_string', $data ?? [], null);
+ $this->setIfExists('enum_string_required', $data ?? [], null);
+ $this->setIfExists('enum_integer', $data ?? [], null);
+ $this->setIfExists('enum_number', $data ?? [], null);
+ $this->setIfExists('outer_enum', $data ?? [], null);
+ $this->setIfExists('outer_enum_integer', $data ?? [], null);
+ $this->setIfExists('outer_enum_default_value', $data ?? [], null);
+ $this->setIfExists('outer_enum_integer_default_value', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ $allowedValues = $this->getEnumStringAllowableValues();
+ if (!is_null($this->container['enum_string']) && !in_array($this->container['enum_string'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'enum_string', must be one of '%s'",
+ $this->container['enum_string'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ if ($this->container['enum_string_required'] === null) {
+ $invalidProperties[] = "'enum_string_required' can't be null";
+ }
+ $allowedValues = $this->getEnumStringRequiredAllowableValues();
+ if (!is_null($this->container['enum_string_required']) && !in_array($this->container['enum_string_required'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'enum_string_required', must be one of '%s'",
+ $this->container['enum_string_required'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ $allowedValues = $this->getEnumIntegerAllowableValues();
+ if (!is_null($this->container['enum_integer']) && !in_array($this->container['enum_integer'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'enum_integer', must be one of '%s'",
+ $this->container['enum_integer'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ $allowedValues = $this->getEnumNumberAllowableValues();
+ if (!is_null($this->container['enum_number']) && !in_array($this->container['enum_number'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'enum_number', must be one of '%s'",
+ $this->container['enum_number'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets enum_string
+ *
+ * @return string|null
+ */
+ public function getEnumString()
+ {
+ return $this->container['enum_string'];
+ }
+
+ /**
+ * Sets enum_string
+ *
+ * @param string|null $enum_string enum_string
+ *
+ * @return self
+ */
+ public function setEnumString($enum_string)
+ {
+ if (is_null($enum_string)) {
+ throw new \InvalidArgumentException('non-nullable enum_string cannot be null');
+ }
+ $allowedValues = $this->getEnumStringAllowableValues();
+ if (!in_array($enum_string, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'enum_string', must be one of '%s'",
+ $enum_string,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['enum_string'] = $enum_string;
+
+ return $this;
+ }
+
+ /**
+ * Gets enum_string_required
+ *
+ * @return string
+ */
+ public function getEnumStringRequired()
+ {
+ return $this->container['enum_string_required'];
+ }
+
+ /**
+ * Sets enum_string_required
+ *
+ * @param string $enum_string_required enum_string_required
+ *
+ * @return self
+ */
+ public function setEnumStringRequired($enum_string_required)
+ {
+ if (is_null($enum_string_required)) {
+ throw new \InvalidArgumentException('non-nullable enum_string_required cannot be null');
+ }
+ $allowedValues = $this->getEnumStringRequiredAllowableValues();
+ if (!in_array($enum_string_required, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'enum_string_required', must be one of '%s'",
+ $enum_string_required,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['enum_string_required'] = $enum_string_required;
+
+ return $this;
+ }
+
+ /**
+ * Gets enum_integer
+ *
+ * @return int|null
+ */
+ public function getEnumInteger()
+ {
+ return $this->container['enum_integer'];
+ }
+
+ /**
+ * Sets enum_integer
+ *
+ * @param int|null $enum_integer enum_integer
+ *
+ * @return self
+ */
+ public function setEnumInteger($enum_integer)
+ {
+ if (is_null($enum_integer)) {
+ throw new \InvalidArgumentException('non-nullable enum_integer cannot be null');
+ }
+ $allowedValues = $this->getEnumIntegerAllowableValues();
+ if (!in_array($enum_integer, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'enum_integer', must be one of '%s'",
+ $enum_integer,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['enum_integer'] = $enum_integer;
+
+ return $this;
+ }
+
+ /**
+ * Gets enum_number
+ *
+ * @return float|null
+ */
+ public function getEnumNumber()
+ {
+ return $this->container['enum_number'];
+ }
+
+ /**
+ * Sets enum_number
+ *
+ * @param float|null $enum_number enum_number
+ *
+ * @return self
+ */
+ public function setEnumNumber($enum_number)
+ {
+ if (is_null($enum_number)) {
+ throw new \InvalidArgumentException('non-nullable enum_number cannot be null');
+ }
+ $allowedValues = $this->getEnumNumberAllowableValues();
+ if (!in_array($enum_number, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'enum_number', must be one of '%s'",
+ $enum_number,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['enum_number'] = $enum_number;
+
+ return $this;
+ }
+
+ /**
+ * Gets outer_enum
+ *
+ * @return \OpenAPI\Client\Model\OuterEnum|null
+ */
+ public function getOuterEnum()
+ {
+ return $this->container['outer_enum'];
+ }
+
+ /**
+ * Sets outer_enum
+ *
+ * @param \OpenAPI\Client\Model\OuterEnum|null $outer_enum outer_enum
+ *
+ * @return self
+ */
+ public function setOuterEnum($outer_enum)
+ {
+ if (is_null($outer_enum)) {
+ array_push($this->openAPINullablesSetToNull, 'outer_enum');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('outer_enum', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['outer_enum'] = $outer_enum;
+
+ return $this;
+ }
+
+ /**
+ * Gets outer_enum_integer
+ *
+ * @return \OpenAPI\Client\Model\OuterEnumInteger|null
+ */
+ public function getOuterEnumInteger()
+ {
+ return $this->container['outer_enum_integer'];
+ }
+
+ /**
+ * Sets outer_enum_integer
+ *
+ * @param \OpenAPI\Client\Model\OuterEnumInteger|null $outer_enum_integer outer_enum_integer
+ *
+ * @return self
+ */
+ public function setOuterEnumInteger($outer_enum_integer)
+ {
+ if (is_null($outer_enum_integer)) {
+ throw new \InvalidArgumentException('non-nullable outer_enum_integer cannot be null');
+ }
+ $this->container['outer_enum_integer'] = $outer_enum_integer;
+
+ return $this;
+ }
+
+ /**
+ * Gets outer_enum_default_value
+ *
+ * @return \OpenAPI\Client\Model\OuterEnumDefaultValue|null
+ */
+ public function getOuterEnumDefaultValue()
+ {
+ return $this->container['outer_enum_default_value'];
+ }
+
+ /**
+ * Sets outer_enum_default_value
+ *
+ * @param \OpenAPI\Client\Model\OuterEnumDefaultValue|null $outer_enum_default_value outer_enum_default_value
+ *
+ * @return self
+ */
+ public function setOuterEnumDefaultValue($outer_enum_default_value)
+ {
+ if (is_null($outer_enum_default_value)) {
+ throw new \InvalidArgumentException('non-nullable outer_enum_default_value cannot be null');
+ }
+ $this->container['outer_enum_default_value'] = $outer_enum_default_value;
+
+ return $this;
+ }
+
+ /**
+ * Gets outer_enum_integer_default_value
+ *
+ * @return \OpenAPI\Client\Model\OuterEnumIntegerDefaultValue|null
+ */
+ public function getOuterEnumIntegerDefaultValue()
+ {
+ return $this->container['outer_enum_integer_default_value'];
+ }
+
+ /**
+ * Sets outer_enum_integer_default_value
+ *
+ * @param \OpenAPI\Client\Model\OuterEnumIntegerDefaultValue|null $outer_enum_integer_default_value outer_enum_integer_default_value
+ *
+ * @return self
+ */
+ public function setOuterEnumIntegerDefaultValue($outer_enum_integer_default_value)
+ {
+ if (is_null($outer_enum_integer_default_value)) {
+ throw new \InvalidArgumentException('non-nullable outer_enum_integer_default_value cannot be null');
+ }
+ $this->container['outer_enum_integer_default_value'] = $outer_enum_integer_default_value;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/FakeBigDecimalMap200Response.php b/samples/client/petstore/php/psr-18/lib/Model/FakeBigDecimalMap200Response.php
new file mode 100644
index 0000000000..05a00d232b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/FakeBigDecimalMap200Response.php
@@ -0,0 +1,443 @@
+
+ */
+class FakeBigDecimalMap200Response implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'fakeBigDecimalMap_200_response';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'some_id' => 'float',
+ 'some_map' => 'array'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'some_id' => null,
+ 'some_map' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'some_id' => false,
+ 'some_map' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'some_id' => 'someId',
+ 'some_map' => 'someMap'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'some_id' => 'setSomeId',
+ 'some_map' => 'setSomeMap'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'some_id' => 'getSomeId',
+ 'some_map' => 'getSomeMap'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('some_id', $data ?? [], null);
+ $this->setIfExists('some_map', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets some_id
+ *
+ * @return float|null
+ */
+ public function getSomeId()
+ {
+ return $this->container['some_id'];
+ }
+
+ /**
+ * Sets some_id
+ *
+ * @param float|null $some_id some_id
+ *
+ * @return self
+ */
+ public function setSomeId($some_id)
+ {
+ if (is_null($some_id)) {
+ throw new \InvalidArgumentException('non-nullable some_id cannot be null');
+ }
+ $this->container['some_id'] = $some_id;
+
+ return $this;
+ }
+
+ /**
+ * Gets some_map
+ *
+ * @return array|null
+ */
+ public function getSomeMap()
+ {
+ return $this->container['some_map'];
+ }
+
+ /**
+ * Sets some_map
+ *
+ * @param array|null $some_map some_map
+ *
+ * @return self
+ */
+ public function setSomeMap($some_map)
+ {
+ if (is_null($some_map)) {
+ throw new \InvalidArgumentException('non-nullable some_map cannot be null');
+ }
+ $this->container['some_map'] = $some_map;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/File.php b/samples/client/petstore/php/psr-18/lib/Model/File.php
new file mode 100644
index 0000000000..92f5070dea
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/File.php
@@ -0,0 +1,410 @@
+
+ */
+class File implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'File';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'source_uri' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'source_uri' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'source_uri' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'source_uri' => 'sourceURI'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'source_uri' => 'setSourceUri'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'source_uri' => 'getSourceUri'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('source_uri', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets source_uri
+ *
+ * @return string|null
+ */
+ public function getSourceUri()
+ {
+ return $this->container['source_uri'];
+ }
+
+ /**
+ * Sets source_uri
+ *
+ * @param string|null $source_uri Test capitalization
+ *
+ * @return self
+ */
+ public function setSourceUri($source_uri)
+ {
+ if (is_null($source_uri)) {
+ throw new \InvalidArgumentException('non-nullable source_uri cannot be null');
+ }
+ $this->container['source_uri'] = $source_uri;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/FileSchemaTestClass.php b/samples/client/petstore/php/psr-18/lib/Model/FileSchemaTestClass.php
new file mode 100644
index 0000000000..fb46435b1e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/FileSchemaTestClass.php
@@ -0,0 +1,443 @@
+
+ */
+class FileSchemaTestClass implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'FileSchemaTestClass';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'file' => '\OpenAPI\Client\Model\File',
+ 'files' => '\OpenAPI\Client\Model\File[]'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'file' => null,
+ 'files' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'file' => false,
+ 'files' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'file' => 'file',
+ 'files' => 'files'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'file' => 'setFile',
+ 'files' => 'setFiles'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'file' => 'getFile',
+ 'files' => 'getFiles'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('file', $data ?? [], null);
+ $this->setIfExists('files', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets file
+ *
+ * @return \OpenAPI\Client\Model\File|null
+ */
+ public function getFile()
+ {
+ return $this->container['file'];
+ }
+
+ /**
+ * Sets file
+ *
+ * @param \OpenAPI\Client\Model\File|null $file file
+ *
+ * @return self
+ */
+ public function setFile($file)
+ {
+ if (is_null($file)) {
+ throw new \InvalidArgumentException('non-nullable file cannot be null');
+ }
+ $this->container['file'] = $file;
+
+ return $this;
+ }
+
+ /**
+ * Gets files
+ *
+ * @return \OpenAPI\Client\Model\File[]|null
+ */
+ public function getFiles()
+ {
+ return $this->container['files'];
+ }
+
+ /**
+ * Sets files
+ *
+ * @param \OpenAPI\Client\Model\File[]|null $files files
+ *
+ * @return self
+ */
+ public function setFiles($files)
+ {
+ if (is_null($files)) {
+ throw new \InvalidArgumentException('non-nullable files cannot be null');
+ }
+ $this->container['files'] = $files;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Foo.php b/samples/client/petstore/php/psr-18/lib/Model/Foo.php
new file mode 100644
index 0000000000..a6b649d45e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Foo.php
@@ -0,0 +1,409 @@
+
+ */
+class Foo implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Foo';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'bar' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'bar' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'bar' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'bar' => 'bar'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'bar' => 'setBar'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'bar' => 'getBar'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('bar', $data ?? [], 'bar');
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets bar
+ *
+ * @return string|null
+ */
+ public function getBar()
+ {
+ return $this->container['bar'];
+ }
+
+ /**
+ * Sets bar
+ *
+ * @param string|null $bar bar
+ *
+ * @return self
+ */
+ public function setBar($bar)
+ {
+ if (is_null($bar)) {
+ throw new \InvalidArgumentException('non-nullable bar cannot be null');
+ }
+ $this->container['bar'] = $bar;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/FooGetDefaultResponse.php b/samples/client/petstore/php/psr-18/lib/Model/FooGetDefaultResponse.php
new file mode 100644
index 0000000000..373052266a
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/FooGetDefaultResponse.php
@@ -0,0 +1,409 @@
+
+ */
+class FooGetDefaultResponse implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = '_foo_get_default_response';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'string' => '\OpenAPI\Client\Model\Foo'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'string' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'string' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'string' => 'string'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'string' => 'setString'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'string' => 'getString'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('string', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets string
+ *
+ * @return \OpenAPI\Client\Model\Foo|null
+ */
+ public function getString()
+ {
+ return $this->container['string'];
+ }
+
+ /**
+ * Sets string
+ *
+ * @param \OpenAPI\Client\Model\Foo|null $string string
+ *
+ * @return self
+ */
+ public function setString($string)
+ {
+ if (is_null($string)) {
+ throw new \InvalidArgumentException('non-nullable string cannot be null');
+ }
+ $this->container['string'] = $string;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/FormatTest.php b/samples/client/petstore/php/psr-18/lib/Model/FormatTest.php
new file mode 100644
index 0000000000..a9f72019ec
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/FormatTest.php
@@ -0,0 +1,1053 @@
+
+ */
+class FormatTest implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'format_test';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'integer' => 'int',
+ 'int32' => 'int',
+ 'int64' => 'int',
+ 'number' => 'float',
+ 'float' => 'float',
+ 'double' => 'float',
+ 'decimal' => 'float',
+ 'string' => 'string',
+ 'byte' => 'string',
+ 'binary' => '\SplFileObject',
+ 'date' => '\DateTime',
+ 'date_time' => '\DateTime',
+ 'uuid' => 'string',
+ 'password' => 'string',
+ 'pattern_with_digits' => 'string',
+ 'pattern_with_digits_and_delimiter' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'integer' => null,
+ 'int32' => 'int32',
+ 'int64' => 'int64',
+ 'number' => null,
+ 'float' => 'float',
+ 'double' => 'double',
+ 'decimal' => 'number',
+ 'string' => null,
+ 'byte' => 'byte',
+ 'binary' => 'binary',
+ 'date' => 'date',
+ 'date_time' => 'date-time',
+ 'uuid' => 'uuid',
+ 'password' => 'password',
+ 'pattern_with_digits' => null,
+ 'pattern_with_digits_and_delimiter' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'integer' => false,
+ 'int32' => false,
+ 'int64' => false,
+ 'number' => false,
+ 'float' => false,
+ 'double' => false,
+ 'decimal' => false,
+ 'string' => false,
+ 'byte' => false,
+ 'binary' => false,
+ 'date' => false,
+ 'date_time' => false,
+ 'uuid' => false,
+ 'password' => false,
+ 'pattern_with_digits' => false,
+ 'pattern_with_digits_and_delimiter' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'integer' => 'integer',
+ 'int32' => 'int32',
+ 'int64' => 'int64',
+ 'number' => 'number',
+ 'float' => 'float',
+ 'double' => 'double',
+ 'decimal' => 'decimal',
+ 'string' => 'string',
+ 'byte' => 'byte',
+ 'binary' => 'binary',
+ 'date' => 'date',
+ 'date_time' => 'dateTime',
+ 'uuid' => 'uuid',
+ 'password' => 'password',
+ 'pattern_with_digits' => 'pattern_with_digits',
+ 'pattern_with_digits_and_delimiter' => 'pattern_with_digits_and_delimiter'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'integer' => 'setInteger',
+ 'int32' => 'setInt32',
+ 'int64' => 'setInt64',
+ 'number' => 'setNumber',
+ 'float' => 'setFloat',
+ 'double' => 'setDouble',
+ 'decimal' => 'setDecimal',
+ 'string' => 'setString',
+ 'byte' => 'setByte',
+ 'binary' => 'setBinary',
+ 'date' => 'setDate',
+ 'date_time' => 'setDateTime',
+ 'uuid' => 'setUuid',
+ 'password' => 'setPassword',
+ 'pattern_with_digits' => 'setPatternWithDigits',
+ 'pattern_with_digits_and_delimiter' => 'setPatternWithDigitsAndDelimiter'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'integer' => 'getInteger',
+ 'int32' => 'getInt32',
+ 'int64' => 'getInt64',
+ 'number' => 'getNumber',
+ 'float' => 'getFloat',
+ 'double' => 'getDouble',
+ 'decimal' => 'getDecimal',
+ 'string' => 'getString',
+ 'byte' => 'getByte',
+ 'binary' => 'getBinary',
+ 'date' => 'getDate',
+ 'date_time' => 'getDateTime',
+ 'uuid' => 'getUuid',
+ 'password' => 'getPassword',
+ 'pattern_with_digits' => 'getPatternWithDigits',
+ 'pattern_with_digits_and_delimiter' => 'getPatternWithDigitsAndDelimiter'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('integer', $data ?? [], null);
+ $this->setIfExists('int32', $data ?? [], null);
+ $this->setIfExists('int64', $data ?? [], null);
+ $this->setIfExists('number', $data ?? [], null);
+ $this->setIfExists('float', $data ?? [], null);
+ $this->setIfExists('double', $data ?? [], null);
+ $this->setIfExists('decimal', $data ?? [], null);
+ $this->setIfExists('string', $data ?? [], null);
+ $this->setIfExists('byte', $data ?? [], null);
+ $this->setIfExists('binary', $data ?? [], null);
+ $this->setIfExists('date', $data ?? [], null);
+ $this->setIfExists('date_time', $data ?? [], null);
+ $this->setIfExists('uuid', $data ?? [], null);
+ $this->setIfExists('password', $data ?? [], null);
+ $this->setIfExists('pattern_with_digits', $data ?? [], null);
+ $this->setIfExists('pattern_with_digits_and_delimiter', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if (!is_null($this->container['integer']) && ($this->container['integer'] > 100)) {
+ $invalidProperties[] = "invalid value for 'integer', must be smaller than or equal to 100.";
+ }
+
+ if (!is_null($this->container['integer']) && ($this->container['integer'] < 10)) {
+ $invalidProperties[] = "invalid value for 'integer', must be bigger than or equal to 10.";
+ }
+
+ if (!is_null($this->container['int32']) && ($this->container['int32'] > 200)) {
+ $invalidProperties[] = "invalid value for 'int32', must be smaller than or equal to 200.";
+ }
+
+ if (!is_null($this->container['int32']) && ($this->container['int32'] < 20)) {
+ $invalidProperties[] = "invalid value for 'int32', must be bigger than or equal to 20.";
+ }
+
+ if ($this->container['number'] === null) {
+ $invalidProperties[] = "'number' can't be null";
+ }
+ if (($this->container['number'] > 543.2)) {
+ $invalidProperties[] = "invalid value for 'number', must be smaller than or equal to 543.2.";
+ }
+
+ if (($this->container['number'] < 32.1)) {
+ $invalidProperties[] = "invalid value for 'number', must be bigger than or equal to 32.1.";
+ }
+
+ if (!is_null($this->container['float']) && ($this->container['float'] > 987.6)) {
+ $invalidProperties[] = "invalid value for 'float', must be smaller than or equal to 987.6.";
+ }
+
+ if (!is_null($this->container['float']) && ($this->container['float'] < 54.3)) {
+ $invalidProperties[] = "invalid value for 'float', must be bigger than or equal to 54.3.";
+ }
+
+ if (!is_null($this->container['double']) && ($this->container['double'] > 123.4)) {
+ $invalidProperties[] = "invalid value for 'double', must be smaller than or equal to 123.4.";
+ }
+
+ if (!is_null($this->container['double']) && ($this->container['double'] < 67.8)) {
+ $invalidProperties[] = "invalid value for 'double', must be bigger than or equal to 67.8.";
+ }
+
+ if (!is_null($this->container['string']) && !preg_match("/[a-z]/i", $this->container['string'])) {
+ $invalidProperties[] = "invalid value for 'string', must be conform to the pattern /[a-z]/i.";
+ }
+
+ if ($this->container['byte'] === null) {
+ $invalidProperties[] = "'byte' can't be null";
+ }
+ if ($this->container['date'] === null) {
+ $invalidProperties[] = "'date' can't be null";
+ }
+ if ($this->container['password'] === null) {
+ $invalidProperties[] = "'password' can't be null";
+ }
+ if ((mb_strlen($this->container['password']) > 64)) {
+ $invalidProperties[] = "invalid value for 'password', the character length must be smaller than or equal to 64.";
+ }
+
+ if ((mb_strlen($this->container['password']) < 10)) {
+ $invalidProperties[] = "invalid value for 'password', the character length must be bigger than or equal to 10.";
+ }
+
+ if (!is_null($this->container['pattern_with_digits']) && !preg_match("/^\\d{10}$/", $this->container['pattern_with_digits'])) {
+ $invalidProperties[] = "invalid value for 'pattern_with_digits', must be conform to the pattern /^\\d{10}$/.";
+ }
+
+ if (!is_null($this->container['pattern_with_digits_and_delimiter']) && !preg_match("/^image_\\d{1,3}$/i", $this->container['pattern_with_digits_and_delimiter'])) {
+ $invalidProperties[] = "invalid value for 'pattern_with_digits_and_delimiter', must be conform to the pattern /^image_\\d{1,3}$/i.";
+ }
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets integer
+ *
+ * @return int|null
+ */
+ public function getInteger()
+ {
+ return $this->container['integer'];
+ }
+
+ /**
+ * Sets integer
+ *
+ * @param int|null $integer integer
+ *
+ * @return self
+ */
+ public function setInteger($integer)
+ {
+ if (is_null($integer)) {
+ throw new \InvalidArgumentException('non-nullable integer cannot be null');
+ }
+
+ if (($integer > 100)) {
+ throw new \InvalidArgumentException('invalid value for $integer when calling FormatTest., must be smaller than or equal to 100.');
+ }
+ if (($integer < 10)) {
+ throw new \InvalidArgumentException('invalid value for $integer when calling FormatTest., must be bigger than or equal to 10.');
+ }
+
+ $this->container['integer'] = $integer;
+
+ return $this;
+ }
+
+ /**
+ * Gets int32
+ *
+ * @return int|null
+ */
+ public function getInt32()
+ {
+ return $this->container['int32'];
+ }
+
+ /**
+ * Sets int32
+ *
+ * @param int|null $int32 int32
+ *
+ * @return self
+ */
+ public function setInt32($int32)
+ {
+ if (is_null($int32)) {
+ throw new \InvalidArgumentException('non-nullable int32 cannot be null');
+ }
+
+ if (($int32 > 200)) {
+ throw new \InvalidArgumentException('invalid value for $int32 when calling FormatTest., must be smaller than or equal to 200.');
+ }
+ if (($int32 < 20)) {
+ throw new \InvalidArgumentException('invalid value for $int32 when calling FormatTest., must be bigger than or equal to 20.');
+ }
+
+ $this->container['int32'] = $int32;
+
+ return $this;
+ }
+
+ /**
+ * Gets int64
+ *
+ * @return int|null
+ */
+ public function getInt64()
+ {
+ return $this->container['int64'];
+ }
+
+ /**
+ * Sets int64
+ *
+ * @param int|null $int64 int64
+ *
+ * @return self
+ */
+ public function setInt64($int64)
+ {
+ if (is_null($int64)) {
+ throw new \InvalidArgumentException('non-nullable int64 cannot be null');
+ }
+ $this->container['int64'] = $int64;
+
+ return $this;
+ }
+
+ /**
+ * Gets number
+ *
+ * @return float
+ */
+ public function getNumber()
+ {
+ return $this->container['number'];
+ }
+
+ /**
+ * Sets number
+ *
+ * @param float $number number
+ *
+ * @return self
+ */
+ public function setNumber($number)
+ {
+ if (is_null($number)) {
+ throw new \InvalidArgumentException('non-nullable number cannot be null');
+ }
+
+ if (($number > 543.2)) {
+ throw new \InvalidArgumentException('invalid value for $number when calling FormatTest., must be smaller than or equal to 543.2.');
+ }
+ if (($number < 32.1)) {
+ throw new \InvalidArgumentException('invalid value for $number when calling FormatTest., must be bigger than or equal to 32.1.');
+ }
+
+ $this->container['number'] = $number;
+
+ return $this;
+ }
+
+ /**
+ * Gets float
+ *
+ * @return float|null
+ */
+ public function getFloat()
+ {
+ return $this->container['float'];
+ }
+
+ /**
+ * Sets float
+ *
+ * @param float|null $float float
+ *
+ * @return self
+ */
+ public function setFloat($float)
+ {
+ if (is_null($float)) {
+ throw new \InvalidArgumentException('non-nullable float cannot be null');
+ }
+
+ if (($float > 987.6)) {
+ throw new \InvalidArgumentException('invalid value for $float when calling FormatTest., must be smaller than or equal to 987.6.');
+ }
+ if (($float < 54.3)) {
+ throw new \InvalidArgumentException('invalid value for $float when calling FormatTest., must be bigger than or equal to 54.3.');
+ }
+
+ $this->container['float'] = $float;
+
+ return $this;
+ }
+
+ /**
+ * Gets double
+ *
+ * @return float|null
+ */
+ public function getDouble()
+ {
+ return $this->container['double'];
+ }
+
+ /**
+ * Sets double
+ *
+ * @param float|null $double double
+ *
+ * @return self
+ */
+ public function setDouble($double)
+ {
+ if (is_null($double)) {
+ throw new \InvalidArgumentException('non-nullable double cannot be null');
+ }
+
+ if (($double > 123.4)) {
+ throw new \InvalidArgumentException('invalid value for $double when calling FormatTest., must be smaller than or equal to 123.4.');
+ }
+ if (($double < 67.8)) {
+ throw new \InvalidArgumentException('invalid value for $double when calling FormatTest., must be bigger than or equal to 67.8.');
+ }
+
+ $this->container['double'] = $double;
+
+ return $this;
+ }
+
+ /**
+ * Gets decimal
+ *
+ * @return float|null
+ */
+ public function getDecimal()
+ {
+ return $this->container['decimal'];
+ }
+
+ /**
+ * Sets decimal
+ *
+ * @param float|null $decimal decimal
+ *
+ * @return self
+ */
+ public function setDecimal($decimal)
+ {
+ if (is_null($decimal)) {
+ throw new \InvalidArgumentException('non-nullable decimal cannot be null');
+ }
+ $this->container['decimal'] = $decimal;
+
+ return $this;
+ }
+
+ /**
+ * Gets string
+ *
+ * @return string|null
+ */
+ public function getString()
+ {
+ return $this->container['string'];
+ }
+
+ /**
+ * Sets string
+ *
+ * @param string|null $string string
+ *
+ * @return self
+ */
+ public function setString($string)
+ {
+ if (is_null($string)) {
+ throw new \InvalidArgumentException('non-nullable string cannot be null');
+ }
+
+ if ((!preg_match("/[a-z]/i", $string))) {
+ throw new \InvalidArgumentException("invalid value for \$string when calling FormatTest., must conform to the pattern /[a-z]/i.");
+ }
+
+ $this->container['string'] = $string;
+
+ return $this;
+ }
+
+ /**
+ * Gets byte
+ *
+ * @return string
+ */
+ public function getByte()
+ {
+ return $this->container['byte'];
+ }
+
+ /**
+ * Sets byte
+ *
+ * @param string $byte byte
+ *
+ * @return self
+ */
+ public function setByte($byte)
+ {
+ if (is_null($byte)) {
+ throw new \InvalidArgumentException('non-nullable byte cannot be null');
+ }
+ $this->container['byte'] = $byte;
+
+ return $this;
+ }
+
+ /**
+ * Gets binary
+ *
+ * @return \SplFileObject|null
+ */
+ public function getBinary()
+ {
+ return $this->container['binary'];
+ }
+
+ /**
+ * Sets binary
+ *
+ * @param \SplFileObject|null $binary binary
+ *
+ * @return self
+ */
+ public function setBinary($binary)
+ {
+ if (is_null($binary)) {
+ throw new \InvalidArgumentException('non-nullable binary cannot be null');
+ }
+ $this->container['binary'] = $binary;
+
+ return $this;
+ }
+
+ /**
+ * Gets date
+ *
+ * @return \DateTime
+ */
+ public function getDate()
+ {
+ return $this->container['date'];
+ }
+
+ /**
+ * Sets date
+ *
+ * @param \DateTime $date date
+ *
+ * @return self
+ */
+ public function setDate($date)
+ {
+ if (is_null($date)) {
+ throw new \InvalidArgumentException('non-nullable date cannot be null');
+ }
+ $this->container['date'] = $date;
+
+ return $this;
+ }
+
+ /**
+ * Gets date_time
+ *
+ * @return \DateTime|null
+ */
+ public function getDateTime()
+ {
+ return $this->container['date_time'];
+ }
+
+ /**
+ * Sets date_time
+ *
+ * @param \DateTime|null $date_time date_time
+ *
+ * @return self
+ */
+ public function setDateTime($date_time)
+ {
+ if (is_null($date_time)) {
+ throw new \InvalidArgumentException('non-nullable date_time cannot be null');
+ }
+ $this->container['date_time'] = $date_time;
+
+ return $this;
+ }
+
+ /**
+ * Gets uuid
+ *
+ * @return string|null
+ */
+ public function getUuid()
+ {
+ return $this->container['uuid'];
+ }
+
+ /**
+ * Sets uuid
+ *
+ * @param string|null $uuid uuid
+ *
+ * @return self
+ */
+ public function setUuid($uuid)
+ {
+ if (is_null($uuid)) {
+ throw new \InvalidArgumentException('non-nullable uuid cannot be null');
+ }
+ $this->container['uuid'] = $uuid;
+
+ return $this;
+ }
+
+ /**
+ * Gets password
+ *
+ * @return string
+ */
+ public function getPassword()
+ {
+ return $this->container['password'];
+ }
+
+ /**
+ * Sets password
+ *
+ * @param string $password password
+ *
+ * @return self
+ */
+ public function setPassword($password)
+ {
+ if (is_null($password)) {
+ throw new \InvalidArgumentException('non-nullable password cannot be null');
+ }
+ if ((mb_strlen($password) > 64)) {
+ throw new \InvalidArgumentException('invalid length for $password when calling FormatTest., must be smaller than or equal to 64.');
+ }
+ if ((mb_strlen($password) < 10)) {
+ throw new \InvalidArgumentException('invalid length for $password when calling FormatTest., must be bigger than or equal to 10.');
+ }
+
+ $this->container['password'] = $password;
+
+ return $this;
+ }
+
+ /**
+ * Gets pattern_with_digits
+ *
+ * @return string|null
+ */
+ public function getPatternWithDigits()
+ {
+ return $this->container['pattern_with_digits'];
+ }
+
+ /**
+ * Sets pattern_with_digits
+ *
+ * @param string|null $pattern_with_digits A string that is a 10 digit number. Can have leading zeros.
+ *
+ * @return self
+ */
+ public function setPatternWithDigits($pattern_with_digits)
+ {
+ if (is_null($pattern_with_digits)) {
+ throw new \InvalidArgumentException('non-nullable pattern_with_digits cannot be null');
+ }
+
+ if ((!preg_match("/^\\d{10}$/", $pattern_with_digits))) {
+ throw new \InvalidArgumentException("invalid value for \$pattern_with_digits when calling FormatTest., must conform to the pattern /^\\d{10}$/.");
+ }
+
+ $this->container['pattern_with_digits'] = $pattern_with_digits;
+
+ return $this;
+ }
+
+ /**
+ * Gets pattern_with_digits_and_delimiter
+ *
+ * @return string|null
+ */
+ public function getPatternWithDigitsAndDelimiter()
+ {
+ return $this->container['pattern_with_digits_and_delimiter'];
+ }
+
+ /**
+ * Sets pattern_with_digits_and_delimiter
+ *
+ * @param string|null $pattern_with_digits_and_delimiter A string starting with 'image_' (case insensitive) and one to three digits following i.e. Image_01.
+ *
+ * @return self
+ */
+ public function setPatternWithDigitsAndDelimiter($pattern_with_digits_and_delimiter)
+ {
+ if (is_null($pattern_with_digits_and_delimiter)) {
+ throw new \InvalidArgumentException('non-nullable pattern_with_digits_and_delimiter cannot be null');
+ }
+
+ if ((!preg_match("/^image_\\d{1,3}$/i", $pattern_with_digits_and_delimiter))) {
+ throw new \InvalidArgumentException("invalid value for \$pattern_with_digits_and_delimiter when calling FormatTest., must conform to the pattern /^image_\\d{1,3}$/i.");
+ }
+
+ $this->container['pattern_with_digits_and_delimiter'] = $pattern_with_digits_and_delimiter;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/HasOnlyReadOnly.php b/samples/client/petstore/php/psr-18/lib/Model/HasOnlyReadOnly.php
new file mode 100644
index 0000000000..de00596678
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/HasOnlyReadOnly.php
@@ -0,0 +1,443 @@
+
+ */
+class HasOnlyReadOnly implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'hasOnlyReadOnly';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'bar' => 'string',
+ 'foo' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'bar' => null,
+ 'foo' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'bar' => false,
+ 'foo' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'bar' => 'bar',
+ 'foo' => 'foo'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'bar' => 'setBar',
+ 'foo' => 'setFoo'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'bar' => 'getBar',
+ 'foo' => 'getFoo'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('bar', $data ?? [], null);
+ $this->setIfExists('foo', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets bar
+ *
+ * @return string|null
+ */
+ public function getBar()
+ {
+ return $this->container['bar'];
+ }
+
+ /**
+ * Sets bar
+ *
+ * @param string|null $bar bar
+ *
+ * @return self
+ */
+ public function setBar($bar)
+ {
+ if (is_null($bar)) {
+ throw new \InvalidArgumentException('non-nullable bar cannot be null');
+ }
+ $this->container['bar'] = $bar;
+
+ return $this;
+ }
+
+ /**
+ * Gets foo
+ *
+ * @return string|null
+ */
+ public function getFoo()
+ {
+ return $this->container['foo'];
+ }
+
+ /**
+ * Sets foo
+ *
+ * @param string|null $foo foo
+ *
+ * @return self
+ */
+ public function setFoo($foo)
+ {
+ if (is_null($foo)) {
+ throw new \InvalidArgumentException('non-nullable foo cannot be null');
+ }
+ $this->container['foo'] = $foo;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/HealthCheckResult.php b/samples/client/petstore/php/psr-18/lib/Model/HealthCheckResult.php
new file mode 100644
index 0000000000..76f261d19d
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/HealthCheckResult.php
@@ -0,0 +1,417 @@
+
+ */
+class HealthCheckResult implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'HealthCheckResult';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'nullable_message' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'nullable_message' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'nullable_message' => true
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'nullable_message' => 'NullableMessage'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'nullable_message' => 'setNullableMessage'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'nullable_message' => 'getNullableMessage'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('nullable_message', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets nullable_message
+ *
+ * @return string|null
+ */
+ public function getNullableMessage()
+ {
+ return $this->container['nullable_message'];
+ }
+
+ /**
+ * Sets nullable_message
+ *
+ * @param string|null $nullable_message nullable_message
+ *
+ * @return self
+ */
+ public function setNullableMessage($nullable_message)
+ {
+ if (is_null($nullable_message)) {
+ array_push($this->openAPINullablesSetToNull, 'nullable_message');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('nullable_message', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['nullable_message'] = $nullable_message;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/MapTest.php b/samples/client/petstore/php/psr-18/lib/Model/MapTest.php
new file mode 100644
index 0000000000..4003def521
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/MapTest.php
@@ -0,0 +1,535 @@
+
+ */
+class MapTest implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'MapTest';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'map_map_of_string' => 'array>',
+ 'map_of_enum_string' => 'array',
+ 'direct_map' => 'array',
+ 'indirect_map' => 'array'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'map_map_of_string' => null,
+ 'map_of_enum_string' => null,
+ 'direct_map' => null,
+ 'indirect_map' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'map_map_of_string' => false,
+ 'map_of_enum_string' => false,
+ 'direct_map' => false,
+ 'indirect_map' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'map_map_of_string' => 'map_map_of_string',
+ 'map_of_enum_string' => 'map_of_enum_string',
+ 'direct_map' => 'direct_map',
+ 'indirect_map' => 'indirect_map'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'map_map_of_string' => 'setMapMapOfString',
+ 'map_of_enum_string' => 'setMapOfEnumString',
+ 'direct_map' => 'setDirectMap',
+ 'indirect_map' => 'setIndirectMap'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'map_map_of_string' => 'getMapMapOfString',
+ 'map_of_enum_string' => 'getMapOfEnumString',
+ 'direct_map' => 'getDirectMap',
+ 'indirect_map' => 'getIndirectMap'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+ public const MAP_OF_ENUM_STRING_UPPER = 'UPPER';
+ public const MAP_OF_ENUM_STRING_LOWER = 'lower';
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getMapOfEnumStringAllowableValues()
+ {
+ return [
+ self::MAP_OF_ENUM_STRING_UPPER,
+ self::MAP_OF_ENUM_STRING_LOWER,
+ ];
+ }
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('map_map_of_string', $data ?? [], null);
+ $this->setIfExists('map_of_enum_string', $data ?? [], null);
+ $this->setIfExists('direct_map', $data ?? [], null);
+ $this->setIfExists('indirect_map', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets map_map_of_string
+ *
+ * @return array>|null
+ */
+ public function getMapMapOfString()
+ {
+ return $this->container['map_map_of_string'];
+ }
+
+ /**
+ * Sets map_map_of_string
+ *
+ * @param array>|null $map_map_of_string map_map_of_string
+ *
+ * @return self
+ */
+ public function setMapMapOfString($map_map_of_string)
+ {
+ if (is_null($map_map_of_string)) {
+ throw new \InvalidArgumentException('non-nullable map_map_of_string cannot be null');
+ }
+ $this->container['map_map_of_string'] = $map_map_of_string;
+
+ return $this;
+ }
+
+ /**
+ * Gets map_of_enum_string
+ *
+ * @return array|null
+ */
+ public function getMapOfEnumString()
+ {
+ return $this->container['map_of_enum_string'];
+ }
+
+ /**
+ * Sets map_of_enum_string
+ *
+ * @param array|null $map_of_enum_string map_of_enum_string
+ *
+ * @return self
+ */
+ public function setMapOfEnumString($map_of_enum_string)
+ {
+ if (is_null($map_of_enum_string)) {
+ throw new \InvalidArgumentException('non-nullable map_of_enum_string cannot be null');
+ }
+ $allowedValues = $this->getMapOfEnumStringAllowableValues();
+ if (array_diff($map_of_enum_string, $allowedValues)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value for 'map_of_enum_string', must be one of '%s'",
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['map_of_enum_string'] = $map_of_enum_string;
+
+ return $this;
+ }
+
+ /**
+ * Gets direct_map
+ *
+ * @return array|null
+ */
+ public function getDirectMap()
+ {
+ return $this->container['direct_map'];
+ }
+
+ /**
+ * Sets direct_map
+ *
+ * @param array|null $direct_map direct_map
+ *
+ * @return self
+ */
+ public function setDirectMap($direct_map)
+ {
+ if (is_null($direct_map)) {
+ throw new \InvalidArgumentException('non-nullable direct_map cannot be null');
+ }
+ $this->container['direct_map'] = $direct_map;
+
+ return $this;
+ }
+
+ /**
+ * Gets indirect_map
+ *
+ * @return array|null
+ */
+ public function getIndirectMap()
+ {
+ return $this->container['indirect_map'];
+ }
+
+ /**
+ * Sets indirect_map
+ *
+ * @param array|null $indirect_map indirect_map
+ *
+ * @return self
+ */
+ public function setIndirectMap($indirect_map)
+ {
+ if (is_null($indirect_map)) {
+ throw new \InvalidArgumentException('non-nullable indirect_map cannot be null');
+ }
+ $this->container['indirect_map'] = $indirect_map;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php b/samples/client/petstore/php/psr-18/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php
new file mode 100644
index 0000000000..34619525c9
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/MixedPropertiesAndAdditionalPropertiesClass.php
@@ -0,0 +1,477 @@
+
+ */
+class MixedPropertiesAndAdditionalPropertiesClass implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'MixedPropertiesAndAdditionalPropertiesClass';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'uuid' => 'string',
+ 'date_time' => '\DateTime',
+ 'map' => 'array'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'uuid' => 'uuid',
+ 'date_time' => 'date-time',
+ 'map' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'uuid' => false,
+ 'date_time' => false,
+ 'map' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'uuid' => 'uuid',
+ 'date_time' => 'dateTime',
+ 'map' => 'map'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'uuid' => 'setUuid',
+ 'date_time' => 'setDateTime',
+ 'map' => 'setMap'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'uuid' => 'getUuid',
+ 'date_time' => 'getDateTime',
+ 'map' => 'getMap'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('uuid', $data ?? [], null);
+ $this->setIfExists('date_time', $data ?? [], null);
+ $this->setIfExists('map', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets uuid
+ *
+ * @return string|null
+ */
+ public function getUuid()
+ {
+ return $this->container['uuid'];
+ }
+
+ /**
+ * Sets uuid
+ *
+ * @param string|null $uuid uuid
+ *
+ * @return self
+ */
+ public function setUuid($uuid)
+ {
+ if (is_null($uuid)) {
+ throw new \InvalidArgumentException('non-nullable uuid cannot be null');
+ }
+ $this->container['uuid'] = $uuid;
+
+ return $this;
+ }
+
+ /**
+ * Gets date_time
+ *
+ * @return \DateTime|null
+ */
+ public function getDateTime()
+ {
+ return $this->container['date_time'];
+ }
+
+ /**
+ * Sets date_time
+ *
+ * @param \DateTime|null $date_time date_time
+ *
+ * @return self
+ */
+ public function setDateTime($date_time)
+ {
+ if (is_null($date_time)) {
+ throw new \InvalidArgumentException('non-nullable date_time cannot be null');
+ }
+ $this->container['date_time'] = $date_time;
+
+ return $this;
+ }
+
+ /**
+ * Gets map
+ *
+ * @return array|null
+ */
+ public function getMap()
+ {
+ return $this->container['map'];
+ }
+
+ /**
+ * Sets map
+ *
+ * @param array|null $map map
+ *
+ * @return self
+ */
+ public function setMap($map)
+ {
+ if (is_null($map)) {
+ throw new \InvalidArgumentException('non-nullable map cannot be null');
+ }
+ $this->container['map'] = $map;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Model200Response.php b/samples/client/petstore/php/psr-18/lib/Model/Model200Response.php
new file mode 100644
index 0000000000..ee5654dce5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Model200Response.php
@@ -0,0 +1,444 @@
+
+ */
+class Model200Response implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = '200_response';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'name' => 'int',
+ 'class' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'name' => 'int32',
+ 'class' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'name' => false,
+ 'class' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'name' => 'name',
+ 'class' => 'class'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'name' => 'setName',
+ 'class' => 'setClass'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'name' => 'getName',
+ 'class' => 'getClass'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('name', $data ?? [], null);
+ $this->setIfExists('class', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets name
+ *
+ * @return int|null
+ */
+ public function getName()
+ {
+ return $this->container['name'];
+ }
+
+ /**
+ * Sets name
+ *
+ * @param int|null $name name
+ *
+ * @return self
+ */
+ public function setName($name)
+ {
+ if (is_null($name)) {
+ throw new \InvalidArgumentException('non-nullable name cannot be null');
+ }
+ $this->container['name'] = $name;
+
+ return $this;
+ }
+
+ /**
+ * Gets class
+ *
+ * @return string|null
+ */
+ public function getClass()
+ {
+ return $this->container['class'];
+ }
+
+ /**
+ * Sets class
+ *
+ * @param string|null $class class
+ *
+ * @return self
+ */
+ public function setClass($class)
+ {
+ if (is_null($class)) {
+ throw new \InvalidArgumentException('non-nullable class cannot be null');
+ }
+ $this->container['class'] = $class;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ModelInterface.php b/samples/client/petstore/php/psr-18/lib/Model/ModelInterface.php
new file mode 100644
index 0000000000..22481e4e99
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ModelInterface.php
@@ -0,0 +1,111 @@
+
+ */
+class ModelList implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'List';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ '_123_list' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ '_123_list' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ '_123_list' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ '_123_list' => '123-list'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ '_123_list' => 'set123List'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ '_123_list' => 'get123List'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('_123_list', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets _123_list
+ *
+ * @return string|null
+ */
+ public function get123List()
+ {
+ return $this->container['_123_list'];
+ }
+
+ /**
+ * Sets _123_list
+ *
+ * @param string|null $_123_list _123_list
+ *
+ * @return self
+ */
+ public function set123List($_123_list)
+ {
+ if (is_null($_123_list)) {
+ throw new \InvalidArgumentException('non-nullable _123_list cannot be null');
+ }
+ $this->container['_123_list'] = $_123_list;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ModelReturn.php b/samples/client/petstore/php/psr-18/lib/Model/ModelReturn.php
new file mode 100644
index 0000000000..f0fee58bb9
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ModelReturn.php
@@ -0,0 +1,410 @@
+
+ */
+class ModelReturn implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Return';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'return' => 'int'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'return' => 'int32'
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'return' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'return' => 'return'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'return' => 'setReturn'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'return' => 'getReturn'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('return', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets return
+ *
+ * @return int|null
+ */
+ public function getReturn()
+ {
+ return $this->container['return'];
+ }
+
+ /**
+ * Sets return
+ *
+ * @param int|null $return return
+ *
+ * @return self
+ */
+ public function setReturn($return)
+ {
+ if (is_null($return)) {
+ throw new \InvalidArgumentException('non-nullable return cannot be null');
+ }
+ $this->container['return'] = $return;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Name.php b/samples/client/petstore/php/psr-18/lib/Model/Name.php
new file mode 100644
index 0000000000..93ac4a5cb5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Name.php
@@ -0,0 +1,515 @@
+
+ */
+class Name implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Name';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'name' => 'int',
+ 'snake_case' => 'int',
+ 'property' => 'string',
+ '_123_number' => 'int'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'name' => 'int32',
+ 'snake_case' => 'int32',
+ 'property' => null,
+ '_123_number' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'name' => false,
+ 'snake_case' => false,
+ 'property' => false,
+ '_123_number' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'name' => 'name',
+ 'snake_case' => 'snake_case',
+ 'property' => 'property',
+ '_123_number' => '123Number'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'name' => 'setName',
+ 'snake_case' => 'setSnakeCase',
+ 'property' => 'setProperty',
+ '_123_number' => 'set123Number'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'name' => 'getName',
+ 'snake_case' => 'getSnakeCase',
+ 'property' => 'getProperty',
+ '_123_number' => 'get123Number'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('name', $data ?? [], null);
+ $this->setIfExists('snake_case', $data ?? [], null);
+ $this->setIfExists('property', $data ?? [], null);
+ $this->setIfExists('_123_number', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if ($this->container['name'] === null) {
+ $invalidProperties[] = "'name' can't be null";
+ }
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets name
+ *
+ * @return int
+ */
+ public function getName()
+ {
+ return $this->container['name'];
+ }
+
+ /**
+ * Sets name
+ *
+ * @param int $name name
+ *
+ * @return self
+ */
+ public function setName($name)
+ {
+ if (is_null($name)) {
+ throw new \InvalidArgumentException('non-nullable name cannot be null');
+ }
+ $this->container['name'] = $name;
+
+ return $this;
+ }
+
+ /**
+ * Gets snake_case
+ *
+ * @return int|null
+ */
+ public function getSnakeCase()
+ {
+ return $this->container['snake_case'];
+ }
+
+ /**
+ * Sets snake_case
+ *
+ * @param int|null $snake_case snake_case
+ *
+ * @return self
+ */
+ public function setSnakeCase($snake_case)
+ {
+ if (is_null($snake_case)) {
+ throw new \InvalidArgumentException('non-nullable snake_case cannot be null');
+ }
+ $this->container['snake_case'] = $snake_case;
+
+ return $this;
+ }
+
+ /**
+ * Gets property
+ *
+ * @return string|null
+ */
+ public function getProperty()
+ {
+ return $this->container['property'];
+ }
+
+ /**
+ * Sets property
+ *
+ * @param string|null $property property
+ *
+ * @return self
+ */
+ public function setProperty($property)
+ {
+ if (is_null($property)) {
+ throw new \InvalidArgumentException('non-nullable property cannot be null');
+ }
+ $this->container['property'] = $property;
+
+ return $this;
+ }
+
+ /**
+ * Gets _123_number
+ *
+ * @return int|null
+ */
+ public function get123Number()
+ {
+ return $this->container['_123_number'];
+ }
+
+ /**
+ * Sets _123_number
+ *
+ * @param int|null $_123_number _123_number
+ *
+ * @return self
+ */
+ public function set123Number($_123_number)
+ {
+ if (is_null($_123_number)) {
+ throw new \InvalidArgumentException('non-nullable _123_number cannot be null');
+ }
+ $this->container['_123_number'] = $_123_number;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/NullableClass.php b/samples/client/petstore/php/psr-18/lib/Model/NullableClass.php
new file mode 100644
index 0000000000..6aa85351d0
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/NullableClass.php
@@ -0,0 +1,853 @@
+
+ */
+class NullableClass implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'NullableClass';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'integer_prop' => 'int',
+ 'number_prop' => 'float',
+ 'boolean_prop' => 'bool',
+ 'string_prop' => 'string',
+ 'date_prop' => '\DateTime',
+ 'datetime_prop' => '\DateTime',
+ 'array_nullable_prop' => 'object[]',
+ 'array_and_items_nullable_prop' => 'object[]',
+ 'array_items_nullable' => 'object[]',
+ 'object_nullable_prop' => 'array',
+ 'object_and_items_nullable_prop' => 'array',
+ 'object_items_nullable' => 'array'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'integer_prop' => null,
+ 'number_prop' => null,
+ 'boolean_prop' => null,
+ 'string_prop' => null,
+ 'date_prop' => 'date',
+ 'datetime_prop' => 'date-time',
+ 'array_nullable_prop' => null,
+ 'array_and_items_nullable_prop' => null,
+ 'array_items_nullable' => null,
+ 'object_nullable_prop' => null,
+ 'object_and_items_nullable_prop' => null,
+ 'object_items_nullable' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'integer_prop' => true,
+ 'number_prop' => true,
+ 'boolean_prop' => true,
+ 'string_prop' => true,
+ 'date_prop' => true,
+ 'datetime_prop' => true,
+ 'array_nullable_prop' => true,
+ 'array_and_items_nullable_prop' => true,
+ 'array_items_nullable' => false,
+ 'object_nullable_prop' => true,
+ 'object_and_items_nullable_prop' => true,
+ 'object_items_nullable' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'integer_prop' => 'integer_prop',
+ 'number_prop' => 'number_prop',
+ 'boolean_prop' => 'boolean_prop',
+ 'string_prop' => 'string_prop',
+ 'date_prop' => 'date_prop',
+ 'datetime_prop' => 'datetime_prop',
+ 'array_nullable_prop' => 'array_nullable_prop',
+ 'array_and_items_nullable_prop' => 'array_and_items_nullable_prop',
+ 'array_items_nullable' => 'array_items_nullable',
+ 'object_nullable_prop' => 'object_nullable_prop',
+ 'object_and_items_nullable_prop' => 'object_and_items_nullable_prop',
+ 'object_items_nullable' => 'object_items_nullable'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'integer_prop' => 'setIntegerProp',
+ 'number_prop' => 'setNumberProp',
+ 'boolean_prop' => 'setBooleanProp',
+ 'string_prop' => 'setStringProp',
+ 'date_prop' => 'setDateProp',
+ 'datetime_prop' => 'setDatetimeProp',
+ 'array_nullable_prop' => 'setArrayNullableProp',
+ 'array_and_items_nullable_prop' => 'setArrayAndItemsNullableProp',
+ 'array_items_nullable' => 'setArrayItemsNullable',
+ 'object_nullable_prop' => 'setObjectNullableProp',
+ 'object_and_items_nullable_prop' => 'setObjectAndItemsNullableProp',
+ 'object_items_nullable' => 'setObjectItemsNullable'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'integer_prop' => 'getIntegerProp',
+ 'number_prop' => 'getNumberProp',
+ 'boolean_prop' => 'getBooleanProp',
+ 'string_prop' => 'getStringProp',
+ 'date_prop' => 'getDateProp',
+ 'datetime_prop' => 'getDatetimeProp',
+ 'array_nullable_prop' => 'getArrayNullableProp',
+ 'array_and_items_nullable_prop' => 'getArrayAndItemsNullableProp',
+ 'array_items_nullable' => 'getArrayItemsNullable',
+ 'object_nullable_prop' => 'getObjectNullableProp',
+ 'object_and_items_nullable_prop' => 'getObjectAndItemsNullableProp',
+ 'object_items_nullable' => 'getObjectItemsNullable'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('integer_prop', $data ?? [], null);
+ $this->setIfExists('number_prop', $data ?? [], null);
+ $this->setIfExists('boolean_prop', $data ?? [], null);
+ $this->setIfExists('string_prop', $data ?? [], null);
+ $this->setIfExists('date_prop', $data ?? [], null);
+ $this->setIfExists('datetime_prop', $data ?? [], null);
+ $this->setIfExists('array_nullable_prop', $data ?? [], null);
+ $this->setIfExists('array_and_items_nullable_prop', $data ?? [], null);
+ $this->setIfExists('array_items_nullable', $data ?? [], null);
+ $this->setIfExists('object_nullable_prop', $data ?? [], null);
+ $this->setIfExists('object_and_items_nullable_prop', $data ?? [], null);
+ $this->setIfExists('object_items_nullable', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets integer_prop
+ *
+ * @return int|null
+ */
+ public function getIntegerProp()
+ {
+ return $this->container['integer_prop'];
+ }
+
+ /**
+ * Sets integer_prop
+ *
+ * @param int|null $integer_prop integer_prop
+ *
+ * @return self
+ */
+ public function setIntegerProp($integer_prop)
+ {
+ if (is_null($integer_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'integer_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('integer_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['integer_prop'] = $integer_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets number_prop
+ *
+ * @return float|null
+ */
+ public function getNumberProp()
+ {
+ return $this->container['number_prop'];
+ }
+
+ /**
+ * Sets number_prop
+ *
+ * @param float|null $number_prop number_prop
+ *
+ * @return self
+ */
+ public function setNumberProp($number_prop)
+ {
+ if (is_null($number_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'number_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('number_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['number_prop'] = $number_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets boolean_prop
+ *
+ * @return bool|null
+ */
+ public function getBooleanProp()
+ {
+ return $this->container['boolean_prop'];
+ }
+
+ /**
+ * Sets boolean_prop
+ *
+ * @param bool|null $boolean_prop boolean_prop
+ *
+ * @return self
+ */
+ public function setBooleanProp($boolean_prop)
+ {
+ if (is_null($boolean_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'boolean_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('boolean_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['boolean_prop'] = $boolean_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets string_prop
+ *
+ * @return string|null
+ */
+ public function getStringProp()
+ {
+ return $this->container['string_prop'];
+ }
+
+ /**
+ * Sets string_prop
+ *
+ * @param string|null $string_prop string_prop
+ *
+ * @return self
+ */
+ public function setStringProp($string_prop)
+ {
+ if (is_null($string_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'string_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('string_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['string_prop'] = $string_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets date_prop
+ *
+ * @return \DateTime|null
+ */
+ public function getDateProp()
+ {
+ return $this->container['date_prop'];
+ }
+
+ /**
+ * Sets date_prop
+ *
+ * @param \DateTime|null $date_prop date_prop
+ *
+ * @return self
+ */
+ public function setDateProp($date_prop)
+ {
+ if (is_null($date_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'date_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('date_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['date_prop'] = $date_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets datetime_prop
+ *
+ * @return \DateTime|null
+ */
+ public function getDatetimeProp()
+ {
+ return $this->container['datetime_prop'];
+ }
+
+ /**
+ * Sets datetime_prop
+ *
+ * @param \DateTime|null $datetime_prop datetime_prop
+ *
+ * @return self
+ */
+ public function setDatetimeProp($datetime_prop)
+ {
+ if (is_null($datetime_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'datetime_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('datetime_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['datetime_prop'] = $datetime_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets array_nullable_prop
+ *
+ * @return object[]|null
+ */
+ public function getArrayNullableProp()
+ {
+ return $this->container['array_nullable_prop'];
+ }
+
+ /**
+ * Sets array_nullable_prop
+ *
+ * @param object[]|null $array_nullable_prop array_nullable_prop
+ *
+ * @return self
+ */
+ public function setArrayNullableProp($array_nullable_prop)
+ {
+ if (is_null($array_nullable_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'array_nullable_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('array_nullable_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['array_nullable_prop'] = $array_nullable_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets array_and_items_nullable_prop
+ *
+ * @return object[]|null
+ */
+ public function getArrayAndItemsNullableProp()
+ {
+ return $this->container['array_and_items_nullable_prop'];
+ }
+
+ /**
+ * Sets array_and_items_nullable_prop
+ *
+ * @param object[]|null $array_and_items_nullable_prop array_and_items_nullable_prop
+ *
+ * @return self
+ */
+ public function setArrayAndItemsNullableProp($array_and_items_nullable_prop)
+ {
+ if (is_null($array_and_items_nullable_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'array_and_items_nullable_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('array_and_items_nullable_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['array_and_items_nullable_prop'] = $array_and_items_nullable_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets array_items_nullable
+ *
+ * @return object[]|null
+ */
+ public function getArrayItemsNullable()
+ {
+ return $this->container['array_items_nullable'];
+ }
+
+ /**
+ * Sets array_items_nullable
+ *
+ * @param object[]|null $array_items_nullable array_items_nullable
+ *
+ * @return self
+ */
+ public function setArrayItemsNullable($array_items_nullable)
+ {
+ if (is_null($array_items_nullable)) {
+ throw new \InvalidArgumentException('non-nullable array_items_nullable cannot be null');
+ }
+ $this->container['array_items_nullable'] = $array_items_nullable;
+
+ return $this;
+ }
+
+ /**
+ * Gets object_nullable_prop
+ *
+ * @return array|null
+ */
+ public function getObjectNullableProp()
+ {
+ return $this->container['object_nullable_prop'];
+ }
+
+ /**
+ * Sets object_nullable_prop
+ *
+ * @param array|null $object_nullable_prop object_nullable_prop
+ *
+ * @return self
+ */
+ public function setObjectNullableProp($object_nullable_prop)
+ {
+ if (is_null($object_nullable_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'object_nullable_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('object_nullable_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['object_nullable_prop'] = $object_nullable_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets object_and_items_nullable_prop
+ *
+ * @return array|null
+ */
+ public function getObjectAndItemsNullableProp()
+ {
+ return $this->container['object_and_items_nullable_prop'];
+ }
+
+ /**
+ * Sets object_and_items_nullable_prop
+ *
+ * @param array|null $object_and_items_nullable_prop object_and_items_nullable_prop
+ *
+ * @return self
+ */
+ public function setObjectAndItemsNullableProp($object_and_items_nullable_prop)
+ {
+ if (is_null($object_and_items_nullable_prop)) {
+ array_push($this->openAPINullablesSetToNull, 'object_and_items_nullable_prop');
+ } else {
+ $nullablesSetToNull = $this->getOpenAPINullablesSetToNull();
+ $index = array_search('object_and_items_nullable_prop', $nullablesSetToNull);
+ if ($index !== FALSE) {
+ unset($nullablesSetToNull[$index]);
+ $this->setOpenAPINullablesSetToNull($nullablesSetToNull);
+ }
+ }
+ $this->container['object_and_items_nullable_prop'] = $object_and_items_nullable_prop;
+
+ return $this;
+ }
+
+ /**
+ * Gets object_items_nullable
+ *
+ * @return array|null
+ */
+ public function getObjectItemsNullable()
+ {
+ return $this->container['object_items_nullable'];
+ }
+
+ /**
+ * Sets object_items_nullable
+ *
+ * @param array|null $object_items_nullable object_items_nullable
+ *
+ * @return self
+ */
+ public function setObjectItemsNullable($object_items_nullable)
+ {
+ if (is_null($object_items_nullable)) {
+ throw new \InvalidArgumentException('non-nullable object_items_nullable cannot be null');
+ }
+ $this->container['object_items_nullable'] = $object_items_nullable;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/NumberOnly.php b/samples/client/petstore/php/psr-18/lib/Model/NumberOnly.php
new file mode 100644
index 0000000000..d77baefcc4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/NumberOnly.php
@@ -0,0 +1,409 @@
+
+ */
+class NumberOnly implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'NumberOnly';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'just_number' => 'float'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'just_number' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'just_number' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'just_number' => 'JustNumber'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'just_number' => 'setJustNumber'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'just_number' => 'getJustNumber'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('just_number', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets just_number
+ *
+ * @return float|null
+ */
+ public function getJustNumber()
+ {
+ return $this->container['just_number'];
+ }
+
+ /**
+ * Sets just_number
+ *
+ * @param float|null $just_number just_number
+ *
+ * @return self
+ */
+ public function setJustNumber($just_number)
+ {
+ if (is_null($just_number)) {
+ throw new \InvalidArgumentException('non-nullable just_number cannot be null');
+ }
+ $this->container['just_number'] = $just_number;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ObjectWithDeprecatedFields.php b/samples/client/petstore/php/psr-18/lib/Model/ObjectWithDeprecatedFields.php
new file mode 100644
index 0000000000..dfc711fa33
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ObjectWithDeprecatedFields.php
@@ -0,0 +1,517 @@
+
+ */
+class ObjectWithDeprecatedFields implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ObjectWithDeprecatedFields';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'uuid' => 'string',
+ 'id' => 'float',
+ 'deprecated_ref' => '\OpenAPI\Client\Model\DeprecatedObject',
+ 'bars' => 'string[]'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'uuid' => null,
+ 'id' => null,
+ 'deprecated_ref' => null,
+ 'bars' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'uuid' => false,
+ 'id' => false,
+ 'deprecated_ref' => false,
+ 'bars' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'uuid' => 'uuid',
+ 'id' => 'id',
+ 'deprecated_ref' => 'deprecatedRef',
+ 'bars' => 'bars'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'uuid' => 'setUuid',
+ 'id' => 'setId',
+ 'deprecated_ref' => 'setDeprecatedRef',
+ 'bars' => 'setBars'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'uuid' => 'getUuid',
+ 'id' => 'getId',
+ 'deprecated_ref' => 'getDeprecatedRef',
+ 'bars' => 'getBars'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('uuid', $data ?? [], null);
+ $this->setIfExists('id', $data ?? [], null);
+ $this->setIfExists('deprecated_ref', $data ?? [], null);
+ $this->setIfExists('bars', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets uuid
+ *
+ * @return string|null
+ */
+ public function getUuid()
+ {
+ return $this->container['uuid'];
+ }
+
+ /**
+ * Sets uuid
+ *
+ * @param string|null $uuid uuid
+ *
+ * @return self
+ */
+ public function setUuid($uuid)
+ {
+ if (is_null($uuid)) {
+ throw new \InvalidArgumentException('non-nullable uuid cannot be null');
+ }
+ $this->container['uuid'] = $uuid;
+
+ return $this;
+ }
+
+ /**
+ * Gets id
+ *
+ * @return float|null
+ * @deprecated
+ */
+ public function getId()
+ {
+ return $this->container['id'];
+ }
+
+ /**
+ * Sets id
+ *
+ * @param float|null $id id
+ *
+ * @return self
+ * @deprecated
+ */
+ public function setId($id)
+ {
+ if (is_null($id)) {
+ throw new \InvalidArgumentException('non-nullable id cannot be null');
+ }
+ $this->container['id'] = $id;
+
+ return $this;
+ }
+
+ /**
+ * Gets deprecated_ref
+ *
+ * @return \OpenAPI\Client\Model\DeprecatedObject|null
+ * @deprecated
+ */
+ public function getDeprecatedRef()
+ {
+ return $this->container['deprecated_ref'];
+ }
+
+ /**
+ * Sets deprecated_ref
+ *
+ * @param \OpenAPI\Client\Model\DeprecatedObject|null $deprecated_ref deprecated_ref
+ *
+ * @return self
+ * @deprecated
+ */
+ public function setDeprecatedRef($deprecated_ref)
+ {
+ if (is_null($deprecated_ref)) {
+ throw new \InvalidArgumentException('non-nullable deprecated_ref cannot be null');
+ }
+ $this->container['deprecated_ref'] = $deprecated_ref;
+
+ return $this;
+ }
+
+ /**
+ * Gets bars
+ *
+ * @return string[]|null
+ * @deprecated
+ */
+ public function getBars()
+ {
+ return $this->container['bars'];
+ }
+
+ /**
+ * Sets bars
+ *
+ * @param string[]|null $bars bars
+ *
+ * @return self
+ * @deprecated
+ */
+ public function setBars($bars)
+ {
+ if (is_null($bars)) {
+ throw new \InvalidArgumentException('non-nullable bars cannot be null');
+ }
+ $this->container['bars'] = $bars;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Order.php b/samples/client/petstore/php/psr-18/lib/Model/Order.php
new file mode 100644
index 0000000000..61f2b98cc2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Order.php
@@ -0,0 +1,615 @@
+
+ */
+class Order implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Order';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'id' => 'int',
+ 'pet_id' => 'int',
+ 'quantity' => 'int',
+ 'ship_date' => '\DateTime',
+ 'status' => 'string',
+ 'complete' => 'bool'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'id' => 'int64',
+ 'pet_id' => 'int64',
+ 'quantity' => 'int32',
+ 'ship_date' => 'date-time',
+ 'status' => null,
+ 'complete' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'id' => false,
+ 'pet_id' => false,
+ 'quantity' => false,
+ 'ship_date' => false,
+ 'status' => false,
+ 'complete' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'id' => 'id',
+ 'pet_id' => 'petId',
+ 'quantity' => 'quantity',
+ 'ship_date' => 'shipDate',
+ 'status' => 'status',
+ 'complete' => 'complete'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'id' => 'setId',
+ 'pet_id' => 'setPetId',
+ 'quantity' => 'setQuantity',
+ 'ship_date' => 'setShipDate',
+ 'status' => 'setStatus',
+ 'complete' => 'setComplete'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'id' => 'getId',
+ 'pet_id' => 'getPetId',
+ 'quantity' => 'getQuantity',
+ 'ship_date' => 'getShipDate',
+ 'status' => 'getStatus',
+ 'complete' => 'getComplete'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+ public const STATUS_PLACED = 'placed';
+ public const STATUS_APPROVED = 'approved';
+ public const STATUS_DELIVERED = 'delivered';
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getStatusAllowableValues()
+ {
+ return [
+ self::STATUS_PLACED,
+ self::STATUS_APPROVED,
+ self::STATUS_DELIVERED,
+ ];
+ }
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('id', $data ?? [], null);
+ $this->setIfExists('pet_id', $data ?? [], null);
+ $this->setIfExists('quantity', $data ?? [], null);
+ $this->setIfExists('ship_date', $data ?? [], null);
+ $this->setIfExists('status', $data ?? [], null);
+ $this->setIfExists('complete', $data ?? [], false);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ $allowedValues = $this->getStatusAllowableValues();
+ if (!is_null($this->container['status']) && !in_array($this->container['status'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'status', must be one of '%s'",
+ $this->container['status'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets id
+ *
+ * @return int|null
+ */
+ public function getId()
+ {
+ return $this->container['id'];
+ }
+
+ /**
+ * Sets id
+ *
+ * @param int|null $id id
+ *
+ * @return self
+ */
+ public function setId($id)
+ {
+ if (is_null($id)) {
+ throw new \InvalidArgumentException('non-nullable id cannot be null');
+ }
+ $this->container['id'] = $id;
+
+ return $this;
+ }
+
+ /**
+ * Gets pet_id
+ *
+ * @return int|null
+ */
+ public function getPetId()
+ {
+ return $this->container['pet_id'];
+ }
+
+ /**
+ * Sets pet_id
+ *
+ * @param int|null $pet_id pet_id
+ *
+ * @return self
+ */
+ public function setPetId($pet_id)
+ {
+ if (is_null($pet_id)) {
+ throw new \InvalidArgumentException('non-nullable pet_id cannot be null');
+ }
+ $this->container['pet_id'] = $pet_id;
+
+ return $this;
+ }
+
+ /**
+ * Gets quantity
+ *
+ * @return int|null
+ */
+ public function getQuantity()
+ {
+ return $this->container['quantity'];
+ }
+
+ /**
+ * Sets quantity
+ *
+ * @param int|null $quantity quantity
+ *
+ * @return self
+ */
+ public function setQuantity($quantity)
+ {
+ if (is_null($quantity)) {
+ throw new \InvalidArgumentException('non-nullable quantity cannot be null');
+ }
+ $this->container['quantity'] = $quantity;
+
+ return $this;
+ }
+
+ /**
+ * Gets ship_date
+ *
+ * @return \DateTime|null
+ */
+ public function getShipDate()
+ {
+ return $this->container['ship_date'];
+ }
+
+ /**
+ * Sets ship_date
+ *
+ * @param \DateTime|null $ship_date ship_date
+ *
+ * @return self
+ */
+ public function setShipDate($ship_date)
+ {
+ if (is_null($ship_date)) {
+ throw new \InvalidArgumentException('non-nullable ship_date cannot be null');
+ }
+ $this->container['ship_date'] = $ship_date;
+
+ return $this;
+ }
+
+ /**
+ * Gets status
+ *
+ * @return string|null
+ */
+ public function getStatus()
+ {
+ return $this->container['status'];
+ }
+
+ /**
+ * Sets status
+ *
+ * @param string|null $status Order Status
+ *
+ * @return self
+ */
+ public function setStatus($status)
+ {
+ if (is_null($status)) {
+ throw new \InvalidArgumentException('non-nullable status cannot be null');
+ }
+ $allowedValues = $this->getStatusAllowableValues();
+ if (!in_array($status, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'status', must be one of '%s'",
+ $status,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['status'] = $status;
+
+ return $this;
+ }
+
+ /**
+ * Gets complete
+ *
+ * @return bool|null
+ */
+ public function getComplete()
+ {
+ return $this->container['complete'];
+ }
+
+ /**
+ * Sets complete
+ *
+ * @param bool|null $complete complete
+ *
+ * @return self
+ */
+ public function setComplete($complete)
+ {
+ if (is_null($complete)) {
+ throw new \InvalidArgumentException('non-nullable complete cannot be null');
+ }
+ $this->container['complete'] = $complete;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/OuterComposite.php b/samples/client/petstore/php/psr-18/lib/Model/OuterComposite.php
new file mode 100644
index 0000000000..889b532850
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/OuterComposite.php
@@ -0,0 +1,477 @@
+
+ */
+class OuterComposite implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'OuterComposite';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'my_number' => 'float',
+ 'my_string' => 'string',
+ 'my_boolean' => 'bool'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'my_number' => null,
+ 'my_string' => null,
+ 'my_boolean' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'my_number' => false,
+ 'my_string' => false,
+ 'my_boolean' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'my_number' => 'my_number',
+ 'my_string' => 'my_string',
+ 'my_boolean' => 'my_boolean'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'my_number' => 'setMyNumber',
+ 'my_string' => 'setMyString',
+ 'my_boolean' => 'setMyBoolean'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'my_number' => 'getMyNumber',
+ 'my_string' => 'getMyString',
+ 'my_boolean' => 'getMyBoolean'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('my_number', $data ?? [], null);
+ $this->setIfExists('my_string', $data ?? [], null);
+ $this->setIfExists('my_boolean', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets my_number
+ *
+ * @return float|null
+ */
+ public function getMyNumber()
+ {
+ return $this->container['my_number'];
+ }
+
+ /**
+ * Sets my_number
+ *
+ * @param float|null $my_number my_number
+ *
+ * @return self
+ */
+ public function setMyNumber($my_number)
+ {
+ if (is_null($my_number)) {
+ throw new \InvalidArgumentException('non-nullable my_number cannot be null');
+ }
+ $this->container['my_number'] = $my_number;
+
+ return $this;
+ }
+
+ /**
+ * Gets my_string
+ *
+ * @return string|null
+ */
+ public function getMyString()
+ {
+ return $this->container['my_string'];
+ }
+
+ /**
+ * Sets my_string
+ *
+ * @param string|null $my_string my_string
+ *
+ * @return self
+ */
+ public function setMyString($my_string)
+ {
+ if (is_null($my_string)) {
+ throw new \InvalidArgumentException('non-nullable my_string cannot be null');
+ }
+ $this->container['my_string'] = $my_string;
+
+ return $this;
+ }
+
+ /**
+ * Gets my_boolean
+ *
+ * @return bool|null
+ */
+ public function getMyBoolean()
+ {
+ return $this->container['my_boolean'];
+ }
+
+ /**
+ * Sets my_boolean
+ *
+ * @param bool|null $my_boolean my_boolean
+ *
+ * @return self
+ */
+ public function setMyBoolean($my_boolean)
+ {
+ if (is_null($my_boolean)) {
+ throw new \InvalidArgumentException('non-nullable my_boolean cannot be null');
+ }
+ $this->container['my_boolean'] = $my_boolean;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/OuterEnum.php b/samples/client/petstore/php/psr-18/lib/Model/OuterEnum.php
new file mode 100644
index 0000000000..58baa1c048
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/OuterEnum.php
@@ -0,0 +1,65 @@
+
+ */
+class OuterObjectWithEnumProperty implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'OuterObjectWithEnumProperty';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'value' => '\OpenAPI\Client\Model\OuterEnumInteger'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'value' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'value' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'value' => 'value'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'value' => 'setValue'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'value' => 'getValue'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('value', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if ($this->container['value'] === null) {
+ $invalidProperties[] = "'value' can't be null";
+ }
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets value
+ *
+ * @return \OpenAPI\Client\Model\OuterEnumInteger
+ */
+ public function getValue()
+ {
+ return $this->container['value'];
+ }
+
+ /**
+ * Sets value
+ *
+ * @param \OpenAPI\Client\Model\OuterEnumInteger $value value
+ *
+ * @return self
+ */
+ public function setValue($value)
+ {
+ if (is_null($value)) {
+ throw new \InvalidArgumentException('non-nullable value cannot be null');
+ }
+ $this->container['value'] = $value;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Pet.php b/samples/client/petstore/php/psr-18/lib/Model/Pet.php
new file mode 100644
index 0000000000..51bb6dbba3
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Pet.php
@@ -0,0 +1,623 @@
+
+ */
+class Pet implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Pet';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'id' => 'int',
+ 'category' => '\OpenAPI\Client\Model\Category',
+ 'name' => 'string',
+ 'photo_urls' => 'string[]',
+ 'tags' => '\OpenAPI\Client\Model\Tag[]',
+ 'status' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'id' => 'int64',
+ 'category' => null,
+ 'name' => null,
+ 'photo_urls' => null,
+ 'tags' => null,
+ 'status' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'id' => false,
+ 'category' => false,
+ 'name' => false,
+ 'photo_urls' => false,
+ 'tags' => false,
+ 'status' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'id' => 'id',
+ 'category' => 'category',
+ 'name' => 'name',
+ 'photo_urls' => 'photoUrls',
+ 'tags' => 'tags',
+ 'status' => 'status'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'id' => 'setId',
+ 'category' => 'setCategory',
+ 'name' => 'setName',
+ 'photo_urls' => 'setPhotoUrls',
+ 'tags' => 'setTags',
+ 'status' => 'setStatus'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'id' => 'getId',
+ 'category' => 'getCategory',
+ 'name' => 'getName',
+ 'photo_urls' => 'getPhotoUrls',
+ 'tags' => 'getTags',
+ 'status' => 'getStatus'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+ public const STATUS_AVAILABLE = 'available';
+ public const STATUS_PENDING = 'pending';
+ public const STATUS_SOLD = 'sold';
+
+ /**
+ * Gets allowable values of the enum
+ *
+ * @return string[]
+ */
+ public function getStatusAllowableValues()
+ {
+ return [
+ self::STATUS_AVAILABLE,
+ self::STATUS_PENDING,
+ self::STATUS_SOLD,
+ ];
+ }
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('id', $data ?? [], null);
+ $this->setIfExists('category', $data ?? [], null);
+ $this->setIfExists('name', $data ?? [], null);
+ $this->setIfExists('photo_urls', $data ?? [], null);
+ $this->setIfExists('tags', $data ?? [], null);
+ $this->setIfExists('status', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ if ($this->container['name'] === null) {
+ $invalidProperties[] = "'name' can't be null";
+ }
+ if ($this->container['photo_urls'] === null) {
+ $invalidProperties[] = "'photo_urls' can't be null";
+ }
+ $allowedValues = $this->getStatusAllowableValues();
+ if (!is_null($this->container['status']) && !in_array($this->container['status'], $allowedValues, true)) {
+ $invalidProperties[] = sprintf(
+ "invalid value '%s' for 'status', must be one of '%s'",
+ $this->container['status'],
+ implode("', '", $allowedValues)
+ );
+ }
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets id
+ *
+ * @return int|null
+ */
+ public function getId()
+ {
+ return $this->container['id'];
+ }
+
+ /**
+ * Sets id
+ *
+ * @param int|null $id id
+ *
+ * @return self
+ */
+ public function setId($id)
+ {
+ if (is_null($id)) {
+ throw new \InvalidArgumentException('non-nullable id cannot be null');
+ }
+ $this->container['id'] = $id;
+
+ return $this;
+ }
+
+ /**
+ * Gets category
+ *
+ * @return \OpenAPI\Client\Model\Category|null
+ */
+ public function getCategory()
+ {
+ return $this->container['category'];
+ }
+
+ /**
+ * Sets category
+ *
+ * @param \OpenAPI\Client\Model\Category|null $category category
+ *
+ * @return self
+ */
+ public function setCategory($category)
+ {
+ if (is_null($category)) {
+ throw new \InvalidArgumentException('non-nullable category cannot be null');
+ }
+ $this->container['category'] = $category;
+
+ return $this;
+ }
+
+ /**
+ * Gets name
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->container['name'];
+ }
+
+ /**
+ * Sets name
+ *
+ * @param string $name name
+ *
+ * @return self
+ */
+ public function setName($name)
+ {
+ if (is_null($name)) {
+ throw new \InvalidArgumentException('non-nullable name cannot be null');
+ }
+ $this->container['name'] = $name;
+
+ return $this;
+ }
+
+ /**
+ * Gets photo_urls
+ *
+ * @return string[]
+ */
+ public function getPhotoUrls()
+ {
+ return $this->container['photo_urls'];
+ }
+
+ /**
+ * Sets photo_urls
+ *
+ * @param string[] $photo_urls photo_urls
+ *
+ * @return self
+ */
+ public function setPhotoUrls($photo_urls)
+ {
+ if (is_null($photo_urls)) {
+ throw new \InvalidArgumentException('non-nullable photo_urls cannot be null');
+ }
+
+
+ $this->container['photo_urls'] = $photo_urls;
+
+ return $this;
+ }
+
+ /**
+ * Gets tags
+ *
+ * @return \OpenAPI\Client\Model\Tag[]|null
+ */
+ public function getTags()
+ {
+ return $this->container['tags'];
+ }
+
+ /**
+ * Sets tags
+ *
+ * @param \OpenAPI\Client\Model\Tag[]|null $tags tags
+ *
+ * @return self
+ */
+ public function setTags($tags)
+ {
+ if (is_null($tags)) {
+ throw new \InvalidArgumentException('non-nullable tags cannot be null');
+ }
+ $this->container['tags'] = $tags;
+
+ return $this;
+ }
+
+ /**
+ * Gets status
+ *
+ * @return string|null
+ */
+ public function getStatus()
+ {
+ return $this->container['status'];
+ }
+
+ /**
+ * Sets status
+ *
+ * @param string|null $status pet status in the store
+ *
+ * @return self
+ */
+ public function setStatus($status)
+ {
+ if (is_null($status)) {
+ throw new \InvalidArgumentException('non-nullable status cannot be null');
+ }
+ $allowedValues = $this->getStatusAllowableValues();
+ if (!in_array($status, $allowedValues, true)) {
+ throw new \InvalidArgumentException(
+ sprintf(
+ "Invalid value '%s' for 'status', must be one of '%s'",
+ $status,
+ implode("', '", $allowedValues)
+ )
+ );
+ }
+ $this->container['status'] = $status;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/PropertyNameMapping.php b/samples/client/petstore/php/psr-18/lib/Model/PropertyNameMapping.php
new file mode 100644
index 0000000000..2424f95810
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/PropertyNameMapping.php
@@ -0,0 +1,511 @@
+
+ */
+class PropertyNameMapping implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'PropertyNameMapping';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'http_debug_operation' => 'string',
+ 'underscore_type' => 'string',
+ 'type' => 'string',
+ 'type_with_underscore' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'http_debug_operation' => null,
+ 'underscore_type' => null,
+ 'type' => null,
+ 'type_with_underscore' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'http_debug_operation' => false,
+ 'underscore_type' => false,
+ 'type' => false,
+ 'type_with_underscore' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'http_debug_operation' => 'http_debug_operation',
+ 'underscore_type' => '_type',
+ 'type' => 'type',
+ 'type_with_underscore' => 'type_'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'http_debug_operation' => 'setHttpDebugOperation',
+ 'underscore_type' => 'setUnderscoreType',
+ 'type' => 'setType',
+ 'type_with_underscore' => 'setTypeWithUnderscore'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'http_debug_operation' => 'getHttpDebugOperation',
+ 'underscore_type' => 'getUnderscoreType',
+ 'type' => 'getType',
+ 'type_with_underscore' => 'getTypeWithUnderscore'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('http_debug_operation', $data ?? [], null);
+ $this->setIfExists('underscore_type', $data ?? [], null);
+ $this->setIfExists('type', $data ?? [], null);
+ $this->setIfExists('type_with_underscore', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets http_debug_operation
+ *
+ * @return string|null
+ */
+ public function getHttpDebugOperation()
+ {
+ return $this->container['http_debug_operation'];
+ }
+
+ /**
+ * Sets http_debug_operation
+ *
+ * @param string|null $http_debug_operation http_debug_operation
+ *
+ * @return self
+ */
+ public function setHttpDebugOperation($http_debug_operation)
+ {
+ if (is_null($http_debug_operation)) {
+ throw new \InvalidArgumentException('non-nullable http_debug_operation cannot be null');
+ }
+ $this->container['http_debug_operation'] = $http_debug_operation;
+
+ return $this;
+ }
+
+ /**
+ * Gets underscore_type
+ *
+ * @return string|null
+ */
+ public function getUnderscoreType()
+ {
+ return $this->container['underscore_type'];
+ }
+
+ /**
+ * Sets underscore_type
+ *
+ * @param string|null $underscore_type underscore_type
+ *
+ * @return self
+ */
+ public function setUnderscoreType($underscore_type)
+ {
+ if (is_null($underscore_type)) {
+ throw new \InvalidArgumentException('non-nullable underscore_type cannot be null');
+ }
+ $this->container['underscore_type'] = $underscore_type;
+
+ return $this;
+ }
+
+ /**
+ * Gets type
+ *
+ * @return string|null
+ */
+ public function getType()
+ {
+ return $this->container['type'];
+ }
+
+ /**
+ * Sets type
+ *
+ * @param string|null $type type
+ *
+ * @return self
+ */
+ public function setType($type)
+ {
+ if (is_null($type)) {
+ throw new \InvalidArgumentException('non-nullable type cannot be null');
+ }
+ $this->container['type'] = $type;
+
+ return $this;
+ }
+
+ /**
+ * Gets type_with_underscore
+ *
+ * @return string|null
+ */
+ public function getTypeWithUnderscore()
+ {
+ return $this->container['type_with_underscore'];
+ }
+
+ /**
+ * Sets type_with_underscore
+ *
+ * @param string|null $type_with_underscore type_with_underscore
+ *
+ * @return self
+ */
+ public function setTypeWithUnderscore($type_with_underscore)
+ {
+ if (is_null($type_with_underscore)) {
+ throw new \InvalidArgumentException('non-nullable type_with_underscore cannot be null');
+ }
+ $this->container['type_with_underscore'] = $type_with_underscore;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/ReadOnlyFirst.php b/samples/client/petstore/php/psr-18/lib/Model/ReadOnlyFirst.php
new file mode 100644
index 0000000000..5efdea4af1
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/ReadOnlyFirst.php
@@ -0,0 +1,443 @@
+
+ */
+class ReadOnlyFirst implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'ReadOnlyFirst';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'bar' => 'string',
+ 'baz' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'bar' => null,
+ 'baz' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'bar' => false,
+ 'baz' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'bar' => 'bar',
+ 'baz' => 'baz'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'bar' => 'setBar',
+ 'baz' => 'setBaz'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'bar' => 'getBar',
+ 'baz' => 'getBaz'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('bar', $data ?? [], null);
+ $this->setIfExists('baz', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets bar
+ *
+ * @return string|null
+ */
+ public function getBar()
+ {
+ return $this->container['bar'];
+ }
+
+ /**
+ * Sets bar
+ *
+ * @param string|null $bar bar
+ *
+ * @return self
+ */
+ public function setBar($bar)
+ {
+ if (is_null($bar)) {
+ throw new \InvalidArgumentException('non-nullable bar cannot be null');
+ }
+ $this->container['bar'] = $bar;
+
+ return $this;
+ }
+
+ /**
+ * Gets baz
+ *
+ * @return string|null
+ */
+ public function getBaz()
+ {
+ return $this->container['baz'];
+ }
+
+ /**
+ * Sets baz
+ *
+ * @param string|null $baz baz
+ *
+ * @return self
+ */
+ public function setBaz($baz)
+ {
+ if (is_null($baz)) {
+ throw new \InvalidArgumentException('non-nullable baz cannot be null');
+ }
+ $this->container['baz'] = $baz;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/SingleRefType.php b/samples/client/petstore/php/psr-18/lib/Model/SingleRefType.php
new file mode 100644
index 0000000000..ff083a359e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/SingleRefType.php
@@ -0,0 +1,62 @@
+
+ */
+class SpecialModelName implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = '_special_model.name_';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'special_property_name' => 'int'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'special_property_name' => 'int64'
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'special_property_name' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'special_property_name' => '$special[property.name]'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'special_property_name' => 'setSpecialPropertyName'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'special_property_name' => 'getSpecialPropertyName'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('special_property_name', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets special_property_name
+ *
+ * @return int|null
+ */
+ public function getSpecialPropertyName()
+ {
+ return $this->container['special_property_name'];
+ }
+
+ /**
+ * Sets special_property_name
+ *
+ * @param int|null $special_property_name special_property_name
+ *
+ * @return self
+ */
+ public function setSpecialPropertyName($special_property_name)
+ {
+ if (is_null($special_property_name)) {
+ throw new \InvalidArgumentException('non-nullable special_property_name cannot be null');
+ }
+ $this->container['special_property_name'] = $special_property_name;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/Tag.php b/samples/client/petstore/php/psr-18/lib/Model/Tag.php
new file mode 100644
index 0000000000..f37e96c597
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/Tag.php
@@ -0,0 +1,443 @@
+
+ */
+class Tag implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'Tag';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'id' => 'int',
+ 'name' => 'string'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'id' => 'int64',
+ 'name' => null
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'id' => false,
+ 'name' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'id' => 'id',
+ 'name' => 'name'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'id' => 'setId',
+ 'name' => 'setName'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'id' => 'getId',
+ 'name' => 'getName'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('id', $data ?? [], null);
+ $this->setIfExists('name', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets id
+ *
+ * @return int|null
+ */
+ public function getId()
+ {
+ return $this->container['id'];
+ }
+
+ /**
+ * Sets id
+ *
+ * @param int|null $id id
+ *
+ * @return self
+ */
+ public function setId($id)
+ {
+ if (is_null($id)) {
+ throw new \InvalidArgumentException('non-nullable id cannot be null');
+ }
+ $this->container['id'] = $id;
+
+ return $this;
+ }
+
+ /**
+ * Gets name
+ *
+ * @return string|null
+ */
+ public function getName()
+ {
+ return $this->container['name'];
+ }
+
+ /**
+ * Sets name
+ *
+ * @param string|null $name name
+ *
+ * @return self
+ */
+ public function setName($name)
+ {
+ if (is_null($name)) {
+ throw new \InvalidArgumentException('non-nullable name cannot be null');
+ }
+ $this->container['name'] = $name;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/Model/User.php b/samples/client/petstore/php/psr-18/lib/Model/User.php
new file mode 100644
index 0000000000..9cfa95f082
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/Model/User.php
@@ -0,0 +1,647 @@
+
+ */
+class User implements ModelInterface, ArrayAccess, \JsonSerializable
+{
+ public const DISCRIMINATOR = null;
+
+ /**
+ * The original name of the model.
+ *
+ * @var string
+ */
+ protected static $openAPIModelName = 'User';
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @var string[]
+ */
+ protected static $openAPITypes = [
+ 'id' => 'int',
+ 'username' => 'string',
+ 'first_name' => 'string',
+ 'last_name' => 'string',
+ 'email' => 'string',
+ 'password' => 'string',
+ 'phone' => 'string',
+ 'user_status' => 'int'
+ ];
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @var string[]
+ * @phpstan-var array
+ * @psalm-var array
+ */
+ protected static $openAPIFormats = [
+ 'id' => 'int64',
+ 'username' => null,
+ 'first_name' => null,
+ 'last_name' => null,
+ 'email' => null,
+ 'password' => null,
+ 'phone' => null,
+ 'user_status' => 'int32'
+ ];
+
+ /**
+ * Array of nullable properties. Used for (de)serialization
+ *
+ * @var boolean[]
+ */
+ protected static array $openAPINullables = [
+ 'id' => false,
+ 'username' => false,
+ 'first_name' => false,
+ 'last_name' => false,
+ 'email' => false,
+ 'password' => false,
+ 'phone' => false,
+ 'user_status' => false
+ ];
+
+ /**
+ * If a nullable field gets set to null, insert it here
+ *
+ * @var boolean[]
+ */
+ protected array $openAPINullablesSetToNull = [];
+
+ /**
+ * Array of property to type mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPITypes()
+ {
+ return self::$openAPITypes;
+ }
+
+ /**
+ * Array of property to format mappings. Used for (de)serialization
+ *
+ * @return array
+ */
+ public static function openAPIFormats()
+ {
+ return self::$openAPIFormats;
+ }
+
+ /**
+ * Array of nullable properties
+ *
+ * @return array
+ */
+ protected static function openAPINullables(): array
+ {
+ return self::$openAPINullables;
+ }
+
+ /**
+ * Array of nullable field names deliberately set to null
+ *
+ * @return boolean[]
+ */
+ private function getOpenAPINullablesSetToNull(): array
+ {
+ return $this->openAPINullablesSetToNull;
+ }
+
+ /**
+ * Setter - Array of nullable field names deliberately set to null
+ *
+ * @param boolean[] $openAPINullablesSetToNull
+ */
+ private function setOpenAPINullablesSetToNull(array $openAPINullablesSetToNull): void
+ {
+ $this->openAPINullablesSetToNull = $openAPINullablesSetToNull;
+ }
+
+ /**
+ * Checks if a property is nullable
+ *
+ * @param string $property
+ * @return bool
+ */
+ public static function isNullable(string $property): bool
+ {
+ return self::openAPINullables()[$property] ?? false;
+ }
+
+ /**
+ * Checks if a nullable property is set to null.
+ *
+ * @param string $property
+ * @return bool
+ */
+ public function isNullableSetToNull(string $property): bool
+ {
+ return in_array($property, $this->getOpenAPINullablesSetToNull(), true);
+ }
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @var string[]
+ */
+ protected static $attributeMap = [
+ 'id' => 'id',
+ 'username' => 'username',
+ 'first_name' => 'firstName',
+ 'last_name' => 'lastName',
+ 'email' => 'email',
+ 'password' => 'password',
+ 'phone' => 'phone',
+ 'user_status' => 'userStatus'
+ ];
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @var string[]
+ */
+ protected static $setters = [
+ 'id' => 'setId',
+ 'username' => 'setUsername',
+ 'first_name' => 'setFirstName',
+ 'last_name' => 'setLastName',
+ 'email' => 'setEmail',
+ 'password' => 'setPassword',
+ 'phone' => 'setPhone',
+ 'user_status' => 'setUserStatus'
+ ];
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @var string[]
+ */
+ protected static $getters = [
+ 'id' => 'getId',
+ 'username' => 'getUsername',
+ 'first_name' => 'getFirstName',
+ 'last_name' => 'getLastName',
+ 'email' => 'getEmail',
+ 'password' => 'getPassword',
+ 'phone' => 'getPhone',
+ 'user_status' => 'getUserStatus'
+ ];
+
+ /**
+ * Array of attributes where the key is the local name,
+ * and the value is the original name
+ *
+ * @return array
+ */
+ public static function attributeMap()
+ {
+ return self::$attributeMap;
+ }
+
+ /**
+ * Array of attributes to setter functions (for deserialization of responses)
+ *
+ * @return array
+ */
+ public static function setters()
+ {
+ return self::$setters;
+ }
+
+ /**
+ * Array of attributes to getter functions (for serialization of requests)
+ *
+ * @return array
+ */
+ public static function getters()
+ {
+ return self::$getters;
+ }
+
+ /**
+ * The original name of the model.
+ *
+ * @return string
+ */
+ public function getModelName()
+ {
+ return self::$openAPIModelName;
+ }
+
+
+ /**
+ * Associative array for storing property values
+ *
+ * @var mixed[]
+ */
+ protected $container = [];
+
+ /**
+ * Constructor
+ *
+ * @param mixed[] $data Associated array of property values
+ * initializing the model
+ */
+ public function __construct(array $data = null)
+ {
+ $this->setIfExists('id', $data ?? [], null);
+ $this->setIfExists('username', $data ?? [], null);
+ $this->setIfExists('first_name', $data ?? [], null);
+ $this->setIfExists('last_name', $data ?? [], null);
+ $this->setIfExists('email', $data ?? [], null);
+ $this->setIfExists('password', $data ?? [], null);
+ $this->setIfExists('phone', $data ?? [], null);
+ $this->setIfExists('user_status', $data ?? [], null);
+ }
+
+ /**
+ * Sets $this->container[$variableName] to the given data or to the given default Value; if $variableName
+ * is nullable and its value is set to null in the $fields array, then mark it as "set to null" in the
+ * $this->openAPINullablesSetToNull array
+ *
+ * @param string $variableName
+ * @param array $fields
+ * @param mixed $defaultValue
+ */
+ private function setIfExists(string $variableName, array $fields, $defaultValue): void
+ {
+ if (self::isNullable($variableName) && array_key_exists($variableName, $fields) && is_null($fields[$variableName])) {
+ $this->openAPINullablesSetToNull[] = $variableName;
+ }
+
+ $this->container[$variableName] = $fields[$variableName] ?? $defaultValue;
+ }
+
+ /**
+ * Show all the invalid properties with reasons.
+ *
+ * @return array invalid properties with reasons
+ */
+ public function listInvalidProperties()
+ {
+ $invalidProperties = [];
+
+ return $invalidProperties;
+ }
+
+ /**
+ * Validate all the properties in the model
+ * return true if all passed
+ *
+ * @return bool True if all properties are valid
+ */
+ public function valid()
+ {
+ return count($this->listInvalidProperties()) === 0;
+ }
+
+
+ /**
+ * Gets id
+ *
+ * @return int|null
+ */
+ public function getId()
+ {
+ return $this->container['id'];
+ }
+
+ /**
+ * Sets id
+ *
+ * @param int|null $id id
+ *
+ * @return self
+ */
+ public function setId($id)
+ {
+ if (is_null($id)) {
+ throw new \InvalidArgumentException('non-nullable id cannot be null');
+ }
+ $this->container['id'] = $id;
+
+ return $this;
+ }
+
+ /**
+ * Gets username
+ *
+ * @return string|null
+ */
+ public function getUsername()
+ {
+ return $this->container['username'];
+ }
+
+ /**
+ * Sets username
+ *
+ * @param string|null $username username
+ *
+ * @return self
+ */
+ public function setUsername($username)
+ {
+ if (is_null($username)) {
+ throw new \InvalidArgumentException('non-nullable username cannot be null');
+ }
+ $this->container['username'] = $username;
+
+ return $this;
+ }
+
+ /**
+ * Gets first_name
+ *
+ * @return string|null
+ */
+ public function getFirstName()
+ {
+ return $this->container['first_name'];
+ }
+
+ /**
+ * Sets first_name
+ *
+ * @param string|null $first_name first_name
+ *
+ * @return self
+ */
+ public function setFirstName($first_name)
+ {
+ if (is_null($first_name)) {
+ throw new \InvalidArgumentException('non-nullable first_name cannot be null');
+ }
+ $this->container['first_name'] = $first_name;
+
+ return $this;
+ }
+
+ /**
+ * Gets last_name
+ *
+ * @return string|null
+ */
+ public function getLastName()
+ {
+ return $this->container['last_name'];
+ }
+
+ /**
+ * Sets last_name
+ *
+ * @param string|null $last_name last_name
+ *
+ * @return self
+ */
+ public function setLastName($last_name)
+ {
+ if (is_null($last_name)) {
+ throw new \InvalidArgumentException('non-nullable last_name cannot be null');
+ }
+ $this->container['last_name'] = $last_name;
+
+ return $this;
+ }
+
+ /**
+ * Gets email
+ *
+ * @return string|null
+ */
+ public function getEmail()
+ {
+ return $this->container['email'];
+ }
+
+ /**
+ * Sets email
+ *
+ * @param string|null $email email
+ *
+ * @return self
+ */
+ public function setEmail($email)
+ {
+ if (is_null($email)) {
+ throw new \InvalidArgumentException('non-nullable email cannot be null');
+ }
+ $this->container['email'] = $email;
+
+ return $this;
+ }
+
+ /**
+ * Gets password
+ *
+ * @return string|null
+ */
+ public function getPassword()
+ {
+ return $this->container['password'];
+ }
+
+ /**
+ * Sets password
+ *
+ * @param string|null $password password
+ *
+ * @return self
+ */
+ public function setPassword($password)
+ {
+ if (is_null($password)) {
+ throw new \InvalidArgumentException('non-nullable password cannot be null');
+ }
+ $this->container['password'] = $password;
+
+ return $this;
+ }
+
+ /**
+ * Gets phone
+ *
+ * @return string|null
+ */
+ public function getPhone()
+ {
+ return $this->container['phone'];
+ }
+
+ /**
+ * Sets phone
+ *
+ * @param string|null $phone phone
+ *
+ * @return self
+ */
+ public function setPhone($phone)
+ {
+ if (is_null($phone)) {
+ throw new \InvalidArgumentException('non-nullable phone cannot be null');
+ }
+ $this->container['phone'] = $phone;
+
+ return $this;
+ }
+
+ /**
+ * Gets user_status
+ *
+ * @return int|null
+ */
+ public function getUserStatus()
+ {
+ return $this->container['user_status'];
+ }
+
+ /**
+ * Sets user_status
+ *
+ * @param int|null $user_status User Status
+ *
+ * @return self
+ */
+ public function setUserStatus($user_status)
+ {
+ if (is_null($user_status)) {
+ throw new \InvalidArgumentException('non-nullable user_status cannot be null');
+ }
+ $this->container['user_status'] = $user_status;
+
+ return $this;
+ }
+ /**
+ * Returns true if offset exists. False otherwise.
+ *
+ * @param integer $offset Offset
+ *
+ * @return boolean
+ */
+ public function offsetExists($offset): bool
+ {
+ return isset($this->container[$offset]);
+ }
+
+ /**
+ * Gets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return mixed|null
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->container[$offset] ?? null;
+ }
+
+ /**
+ * Sets value based on offset.
+ *
+ * @param int|null $offset Offset
+ * @param mixed $value Value to be set
+ *
+ * @return void
+ */
+ public function offsetSet($offset, $value): void
+ {
+ if (is_null($offset)) {
+ $this->container[] = $value;
+ } else {
+ $this->container[$offset] = $value;
+ }
+ }
+
+ /**
+ * Unsets offset.
+ *
+ * @param integer $offset Offset
+ *
+ * @return void
+ */
+ public function offsetUnset($offset): void
+ {
+ unset($this->container[$offset]);
+ }
+
+ /**
+ * Serializes the object to a value that can be serialized natively by json_encode().
+ * @link https://www.php.net/manual/en/jsonserializable.jsonserialize.php
+ *
+ * @return mixed Returns data which can be serialized by json_encode(), which is a value
+ * of any type other than a resource.
+ */
+ #[\ReturnTypeWillChange]
+ public function jsonSerialize()
+ {
+ return ObjectSerializer::sanitizeForSerialization($this);
+ }
+
+ /**
+ * Gets the string presentation of the object
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return json_encode(
+ ObjectSerializer::sanitizeForSerialization($this),
+ JSON_PRETTY_PRINT
+ );
+ }
+
+ /**
+ * Gets a header-safe presentation of the object
+ *
+ * @return string
+ */
+ public function toHeaderValue()
+ {
+ return json_encode(ObjectSerializer::sanitizeForSerialization($this));
+ }
+}
+
+
diff --git a/samples/client/petstore/php/psr-18/lib/ObjectSerializer.php b/samples/client/petstore/php/psr-18/lib/ObjectSerializer.php
new file mode 100644
index 0000000000..1a72a68221
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/lib/ObjectSerializer.php
@@ -0,0 +1,567 @@
+format('Y-m-d') : $data->format(self::$dateTimeFormat);
+ }
+
+ if (is_array($data)) {
+ foreach ($data as $property => $value) {
+ $data[$property] = self::sanitizeForSerialization($value);
+ }
+ return $data;
+ }
+
+ if (is_object($data)) {
+ $values = [];
+ if ($data instanceof ModelInterface) {
+ $formats = $data::openAPIFormats();
+ foreach ($data::openAPITypes() as $property => $openAPIType) {
+ $getter = $data::getters()[$property];
+ $value = $data->$getter();
+ if ($value !== null && !in_array($openAPIType, ['\DateTime', '\SplFileObject', 'array', 'bool', 'boolean', 'byte', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) {
+ $callable = [$openAPIType, 'getAllowableEnumValues'];
+ if (is_callable($callable)) {
+ /** array $callable */
+ $allowedEnumTypes = $callable();
+ if (!in_array($value, $allowedEnumTypes, true)) {
+ $imploded = implode("', '", $allowedEnumTypes);
+ throw new \InvalidArgumentException("Invalid value for enum '$openAPIType', must be one of: '$imploded'");
+ }
+ }
+ }
+ if (($data::isNullable($property) && $data->isNullableSetToNull($property)) || $value !== null) {
+ $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $openAPIType, $formats[$property]);
+ }
+ }
+ } else {
+ foreach($data as $property => $value) {
+ $values[$property] = self::sanitizeForSerialization($value);
+ }
+ }
+ return (object)$values;
+ } else {
+ return (string)$data;
+ }
+ }
+
+ /**
+ * Sanitize filename by removing path.
+ * e.g. ../../sun.gif becomes sun.gif
+ *
+ * @param string $filename filename to be sanitized
+ *
+ * @return string the sanitized filename
+ */
+ public static function sanitizeFilename($filename)
+ {
+ if (preg_match("/.*[\/\\\\](.*)$/", $filename, $match)) {
+ return $match[1];
+ } else {
+ return $filename;
+ }
+ }
+
+ /**
+ * Shorter timestamp microseconds to 6 digits length.
+ *
+ * @param string $timestamp Original timestamp
+ *
+ * @return string the shorten timestamp
+ */
+ public static function sanitizeTimestamp($timestamp)
+ {
+ if (!is_string($timestamp)) return $timestamp;
+
+ return preg_replace('/(:\d{2}.\d{6})\d*/', '$1', $timestamp);
+ }
+
+ /**
+ * Take value and turn it into a string suitable for inclusion in
+ * the path, by url-encoding.
+ *
+ * @param string $value a string which will be part of the path
+ *
+ * @return string the serialized object
+ */
+ public static function toPathValue($value)
+ {
+ return rawurlencode(self::toString($value));
+ }
+
+ /**
+ * Checks if a value is empty, based on its OpenAPI type.
+ *
+ * @param mixed $value
+ * @param string $openApiType
+ *
+ * @return bool true if $value is empty
+ */
+ private static function isEmptyValue($value, string $openApiType): bool
+ {
+ # If empty() returns false, it is not empty regardless of its type.
+ if (!empty($value)) {
+ return false;
+ }
+
+ # Null is always empty, as we cannot send a real "null" value in a query parameter.
+ if ($value === null) {
+ return true;
+ }
+
+ switch ($openApiType) {
+ # For numeric values, false and '' are considered empty.
+ # This comparison is safe for floating point values, since the previous call to empty() will
+ # filter out values that don't match 0.
+ case 'int':
+ case 'integer':
+ return $value !== 0;
+
+ case 'number':
+ case 'float':
+ return $value !== 0 && $value !== 0.0;
+
+ # For boolean values, '' is considered empty
+ case 'bool':
+ case 'boolean':
+ return !in_array($value, [false, 0], true);
+
+ # For all the other types, any value at this point can be considered empty.
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * Take query parameter properties and turn it into an array suitable for
+ * native http_build_query or GuzzleHttp\Psr7\Query::build.
+ *
+ * @param mixed $value Parameter value
+ * @param string $paramName Parameter name
+ * @param string $openApiType OpenAPIType eg. array or object
+ * @param string $style Parameter serialization style
+ * @param bool $explode Parameter explode option
+ * @param bool $required Whether query param is required or not
+ *
+ * @return array
+ */
+ public static function toQueryValue(
+ $value,
+ string $paramName,
+ string $openApiType = 'string',
+ string $style = 'form',
+ bool $explode = true,
+ bool $required = true
+ ): array {
+
+ # Check if we should omit this parameter from the query. This should only happen when:
+ # - Parameter is NOT required; AND
+ # - its value is set to a value that is equivalent to "empty", depending on its OpenAPI type. For
+ # example, 0 as "int" or "boolean" is NOT an empty value.
+ if (self::isEmptyValue($value, $openApiType)) {
+ if ($required) {
+ return ["{$paramName}" => ''];
+ } else {
+ return [];
+ }
+ }
+
+ # Handle DateTime objects in query
+ if($openApiType === "\\DateTime" && $value instanceof \DateTime) {
+ return ["{$paramName}" => $value->format(self::$dateTimeFormat)];
+ }
+
+ $query = [];
+ $value = (in_array($openApiType, ['object', 'array'], true)) ? (array)$value : $value;
+
+ // since \GuzzleHttp\Psr7\Query::build fails with nested arrays
+ // need to flatten array first
+ $flattenArray = function ($arr, $name, &$result = []) use (&$flattenArray, $style, $explode) {
+ if (!is_array($arr)) return $arr;
+
+ foreach ($arr as $k => $v) {
+ $prop = ($style === 'deepObject') ? $prop = "{$name}[{$k}]" : $k;
+
+ if (is_array($v)) {
+ $flattenArray($v, $prop, $result);
+ } else {
+ if ($style !== 'deepObject' && !$explode) {
+ // push key itself
+ $result[] = $prop;
+ }
+ $result[$prop] = $v;
+ }
+ }
+ return $result;
+ };
+
+ $value = $flattenArray($value, $paramName);
+
+ if ($openApiType === 'object' && ($style === 'deepObject' || $explode)) {
+ return $value;
+ }
+
+ if ('boolean' === $openApiType && is_bool($value)) {
+ $value = self::convertBoolToQueryStringFormat($value);
+ }
+
+ // handle style in serializeCollection
+ $query[$paramName] = ($explode) ? $value : self::serializeCollection((array)$value, $style);
+
+ return $query;
+ }
+
+ /**
+ * Convert boolean value to format for query string.
+ *
+ * @param bool $value Boolean value
+ *
+ * @return int|string Boolean value in format
+ */
+ public static function convertBoolToQueryStringFormat(bool $value)
+ {
+ if (Configuration::BOOLEAN_FORMAT_STRING == Configuration::getDefaultConfiguration()->getBooleanFormatForQueryString()) {
+ return $value ? 'true' : 'false';
+ }
+
+ return (int) $value;
+ }
+
+ /**
+ * Take value and turn it into a string suitable for inclusion in
+ * the header. If it's a string, pass through unchanged
+ * If it's a datetime object, format it in ISO8601
+ *
+ * @param string $value a string which will be part of the header
+ *
+ * @return string the header string
+ */
+ public static function toHeaderValue($value)
+ {
+ $callable = [$value, 'toHeaderValue'];
+ if (is_callable($callable)) {
+ return $callable();
+ }
+
+ return self::toString($value);
+ }
+
+ /**
+ * Take value and turn it into a string suitable for inclusion in
+ * the http body (form parameter). If it's a string, pass through unchanged
+ * If it's a datetime object, format it in ISO8601
+ *
+ * @param string|\SplFileObject $value the value of the form parameter
+ *
+ * @return string the form string
+ */
+ public static function toFormValue($value)
+ {
+ if ($value instanceof \SplFileObject) {
+ return $value->getRealPath();
+ } else {
+ return self::toString($value);
+ }
+ }
+
+ /**
+ * Take value and turn it into a string suitable for inclusion in
+ * the parameter. If it's a string, pass through unchanged
+ * If it's a datetime object, format it in ISO8601
+ * If it's a boolean, convert it to "true" or "false".
+ *
+ * @param string|bool|\DateTime $value the value of the parameter
+ *
+ * @return string the header string
+ */
+ public static function toString($value)
+ {
+ if ($value instanceof \DateTime) { // datetime in ISO8601 format
+ return $value->format(self::$dateTimeFormat);
+ } elseif (is_bool($value)) {
+ return $value ? 'true' : 'false';
+ } else {
+ return (string) $value;
+ }
+ }
+
+ /**
+ * Serialize an array to a string.
+ *
+ * @param array $collection collection to serialize to a string
+ * @param string $style the format use for serialization (csv,
+ * ssv, tsv, pipes, multi)
+ * @param bool $allowCollectionFormatMulti allow collection format to be a multidimensional array
+ *
+ * @return string
+ */
+ public static function serializeCollection(array $collection, $style, $allowCollectionFormatMulti = false)
+ {
+ if ($allowCollectionFormatMulti && ('multi' === $style)) {
+ // http_build_query() almost does the job for us. We just
+ // need to fix the result of multidimensional arrays.
+ return preg_replace('/%5B[0-9]+%5D=/', '=', http_build_query($collection, '', '&'));
+ }
+ switch ($style) {
+ case 'pipeDelimited':
+ case 'pipes':
+ return implode('|', $collection);
+
+ case 'tsv':
+ return implode("\t", $collection);
+
+ case 'spaceDelimited':
+ case 'ssv':
+ return implode(' ', $collection);
+
+ case 'simple':
+ case 'csv':
+ // Deliberate fall through. CSV is default format.
+ default:
+ return implode(',', $collection);
+ }
+ }
+
+ /**
+ * Deserialize a JSON string into an object
+ *
+ * @param mixed $data object or primitive to be deserialized
+ * @param string $class class name is passed as a string
+ * @param string[] $httpHeaders HTTP headers
+ * @param string $discriminator discriminator if polymorphism is used
+ *
+ * @return object|array|null a single or an array of $class instances
+ */
+ public static function deserialize($data, $class, $httpHeaders = null)
+ {
+ if (null === $data) {
+ return null;
+ }
+
+ if (strcasecmp(substr($class, -2), '[]') === 0) {
+ $data = is_string($data) ? json_decode($data) : $data;
+
+ if (!is_array($data)) {
+ throw new \InvalidArgumentException("Invalid array '$class'");
+ }
+
+ $subClass = substr($class, 0, -2);
+ $values = [];
+ foreach ($data as $key => $value) {
+ $values[] = self::deserialize($value, $subClass, null);
+ }
+ return $values;
+ }
+
+ if (preg_match('/^(array<|map\[)/', $class)) { // for associative array e.g. array
+ $data = is_string($data) ? json_decode($data) : $data;
+ settype($data, 'array');
+ $inner = substr($class, 4, -1);
+ $deserialized = [];
+ if (strrpos($inner, ",") !== false) {
+ $subClass_array = explode(',', $inner, 2);
+ $subClass = $subClass_array[1];
+ foreach ($data as $key => $value) {
+ $deserialized[$key] = self::deserialize($value, $subClass, null);
+ }
+ }
+ return $deserialized;
+ }
+
+ if ($class === 'object') {
+ settype($data, 'array');
+ return $data;
+ } elseif ($class === 'mixed') {
+ settype($data, gettype($data));
+ return $data;
+ }
+
+ if ($class === '\DateTime') {
+ // Some APIs return an invalid, empty string as a
+ // date-time property. DateTime::__construct() will return
+ // the current time for empty input which is probably not
+ // what is meant. The invalid empty string is probably to
+ // be interpreted as a missing field/value. Let's handle
+ // this graceful.
+ if (!empty($data)) {
+ try {
+ return new \DateTime($data);
+ } catch (\Exception $exception) {
+ // Some APIs return a date-time with too high nanosecond
+ // precision for php's DateTime to handle.
+ // With provided regexp 6 digits of microseconds saved
+ return new \DateTime(self::sanitizeTimestamp($data));
+ }
+ } else {
+ return null;
+ }
+ }
+
+ if ($class === '\SplFileObject') {
+ $data = Utils::streamFor($data);
+
+ /** @var \Psr\Http\Message\StreamInterface $data */
+
+ // determine file name
+ if (
+ is_array($httpHeaders)
+ && array_key_exists('Content-Disposition', $httpHeaders)
+ && preg_match('/inline; filename=[\'"]?([^\'"\s]+)[\'"]?$/i', $httpHeaders['Content-Disposition'], $match)
+ ) {
+ $filename = Configuration::getDefaultConfiguration()->getTempFolderPath() . DIRECTORY_SEPARATOR . self::sanitizeFilename($match[1]);
+ } else {
+ $filename = tempnam(Configuration::getDefaultConfiguration()->getTempFolderPath(), '');
+ }
+
+ $file = fopen($filename, 'w');
+ while ($chunk = $data->read(200)) {
+ fwrite($file, $chunk);
+ }
+ fclose($file);
+
+ return new \SplFileObject($filename, 'r');
+ }
+
+ /** @psalm-suppress ParadoxicalCondition */
+ if (in_array($class, ['\DateTime', '\SplFileObject', 'array', 'bool', 'boolean', 'byte', 'float', 'int', 'integer', 'mixed', 'number', 'object', 'string', 'void'], true)) {
+ settype($data, $class);
+ return $data;
+ }
+
+
+ if (method_exists($class, 'getAllowableEnumValues')) {
+ if (!in_array($data, $class::getAllowableEnumValues(), true)) {
+ $imploded = implode("', '", $class::getAllowableEnumValues());
+ throw new \InvalidArgumentException("Invalid value for enum '$class', must be one of: '$imploded'");
+ }
+ return $data;
+ } else {
+ $data = is_string($data) ? json_decode($data) : $data;
+
+ if (is_array($data)) {
+ $data = (object)$data;
+ }
+
+ // If a discriminator is defined and points to a valid subclass, use it.
+ $discriminator = $class::DISCRIMINATOR;
+ if (!empty($discriminator) && isset($data->{$discriminator}) && is_string($data->{$discriminator})) {
+ $subclass = '\OpenAPI\Client\Model\\' . $data->{$discriminator};
+ if (is_subclass_of($subclass, $class)) {
+ $class = $subclass;
+ }
+ }
+
+ /** @var ModelInterface $instance */
+ $instance = new $class();
+ foreach ($instance::openAPITypes() as $property => $type) {
+ $propertySetter = $instance::setters()[$property];
+
+ if (!isset($propertySetter)) {
+ continue;
+ }
+
+ if (!isset($data->{$instance::attributeMap()[$property]})) {
+ if ($instance::isNullable($property)) {
+ $instance->$propertySetter(null);
+ }
+
+ continue;
+ }
+
+ if (isset($data->{$instance::attributeMap()[$property]})) {
+ $propertyValue = $data->{$instance::attributeMap()[$property]};
+ $instance->$propertySetter(self::deserialize($propertyValue, $type, null));
+ }
+ }
+ return $instance;
+ }
+ }
+
+ /**
+ * Native `http_build_query` wrapper.
+ * @see https://www.php.net/manual/en/function.http-build-query
+ *
+ * @param array|object $data May be an array or object containing properties.
+ * @param string $numeric_prefix If numeric indices are used in the base array and this parameter is provided, it will be prepended to the numeric index for elements in the base array only.
+ * @param string|null $arg_separator arg_separator.output is used to separate arguments but may be overridden by specifying this parameter.
+ * @param int $encoding_type Encoding type. By default, PHP_QUERY_RFC1738.
+ *
+ * @return string
+ */
+ public static function buildQuery(
+ $data,
+ string $numeric_prefix = '',
+ ?string $arg_separator = null,
+ int $encoding_type = \PHP_QUERY_RFC3986
+ ): string {
+ return \GuzzleHttp\Psr7\Query::build($data, $encoding_type);
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/phpunit.xml.dist b/samples/client/petstore/php/psr-18/phpunit.xml.dist
new file mode 100644
index 0000000000..485899aaf2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/phpunit.xml.dist
@@ -0,0 +1,18 @@
+
+
+
+
+ ./lib/Api
+ ./lib/Model
+
+
+
+
+ ./test/Api
+ ./test/Model
+
+
+
+
+
+
diff --git a/samples/client/petstore/php/psr-18/test/Api/AnotherFakeApiTest.php b/samples/client/petstore/php/psr-18/test/Api/AnotherFakeApiTest.php
new file mode 100644
index 0000000000..04f3e324e4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/AnotherFakeApiTest.php
@@ -0,0 +1,85 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Api/DefaultApiTest.php b/samples/client/petstore/php/psr-18/test/Api/DefaultApiTest.php
new file mode 100644
index 0000000000..7e51715c6a
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/DefaultApiTest.php
@@ -0,0 +1,85 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Api/FakeApiTest.php b/samples/client/petstore/php/psr-18/test/Api/FakeApiTest.php
new file mode 100644
index 0000000000..6884b7c96f
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/FakeApiTest.php
@@ -0,0 +1,301 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakeHealthGet
+ *
+ * Health check endpoint.
+ *
+ */
+ public function testFakeHealthGet()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakeHttpSignatureTest
+ *
+ * test http signature authentication.
+ *
+ */
+ public function testFakeHttpSignatureTest()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakeOuterBooleanSerialize
+ *
+ * .
+ *
+ */
+ public function testFakeOuterBooleanSerialize()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakeOuterCompositeSerialize
+ *
+ * .
+ *
+ */
+ public function testFakeOuterCompositeSerialize()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakeOuterNumberSerialize
+ *
+ * .
+ *
+ */
+ public function testFakeOuterNumberSerialize()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakeOuterStringSerialize
+ *
+ * .
+ *
+ */
+ public function testFakeOuterStringSerialize()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for fakePropertyEnumIntegerSerialize
+ *
+ * .
+ *
+ */
+ public function testFakePropertyEnumIntegerSerialize()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for getParameterNameMapping
+ *
+ * parameter name mapping test.
+ *
+ */
+ public function testGetParameterNameMapping()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testBodyWithBinary
+ *
+ * .
+ *
+ */
+ public function testTestBodyWithBinary()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testBodyWithFileSchema
+ *
+ * .
+ *
+ */
+ public function testTestBodyWithFileSchema()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testBodyWithQueryParams
+ *
+ * .
+ *
+ */
+ public function testTestBodyWithQueryParams()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testClientModel
+ *
+ * To test \"client\" model.
+ *
+ */
+ public function testTestClientModel()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testEndpointParameters
+ *
+ * Fake endpoint for testing various parameters 假端點 偽のエンドポイント 가짜 엔드 포인트.
+ *
+ */
+ public function testTestEndpointParameters()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testEnumParameters
+ *
+ * To test enum parameters.
+ *
+ */
+ public function testTestEnumParameters()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testGroupParameters
+ *
+ * Fake endpoint to test group parameters (optional).
+ *
+ */
+ public function testTestGroupParameters()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testInlineAdditionalProperties
+ *
+ * test inline additionalProperties.
+ *
+ */
+ public function testTestInlineAdditionalProperties()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testJsonFormData
+ *
+ * test json serialization of form data.
+ *
+ */
+ public function testTestJsonFormData()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for testQueryParameterCollectionFormat
+ *
+ * .
+ *
+ */
+ public function testTestQueryParameterCollectionFormat()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Api/FakeClassnameTags123ApiTest.php b/samples/client/petstore/php/psr-18/test/Api/FakeClassnameTags123ApiTest.php
new file mode 100644
index 0000000000..ff43532b49
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/FakeClassnameTags123ApiTest.php
@@ -0,0 +1,85 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Api/PetApiTest.php b/samples/client/petstore/php/psr-18/test/Api/PetApiTest.php
new file mode 100644
index 0000000000..c2d2cd2d7b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/PetApiTest.php
@@ -0,0 +1,181 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for deletePet
+ *
+ * Deletes a pet.
+ *
+ */
+ public function testDeletePet()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for findPetsByStatus
+ *
+ * Finds Pets by status.
+ *
+ */
+ public function testFindPetsByStatus()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for findPetsByTags
+ *
+ * Finds Pets by tags.
+ *
+ */
+ public function testFindPetsByTags()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for getPetById
+ *
+ * Find pet by ID.
+ *
+ */
+ public function testGetPetById()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for updatePet
+ *
+ * Update an existing pet.
+ *
+ */
+ public function testUpdatePet()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for updatePetWithForm
+ *
+ * Updates a pet in the store with form data.
+ *
+ */
+ public function testUpdatePetWithForm()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for uploadFile
+ *
+ * uploads an image.
+ *
+ */
+ public function testUploadFile()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for uploadFileWithRequiredFile
+ *
+ * uploads an image (required).
+ *
+ */
+ public function testUploadFileWithRequiredFile()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Api/StoreApiTest.php b/samples/client/petstore/php/psr-18/test/Api/StoreApiTest.php
new file mode 100644
index 0000000000..5fe79e5627
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/StoreApiTest.php
@@ -0,0 +1,121 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for getInventory
+ *
+ * Returns pet inventories by status.
+ *
+ */
+ public function testGetInventory()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for getOrderById
+ *
+ * Find purchase order by ID.
+ *
+ */
+ public function testGetOrderById()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for placeOrder
+ *
+ * Place an order for a pet.
+ *
+ */
+ public function testPlaceOrder()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Api/UserApiTest.php b/samples/client/petstore/php/psr-18/test/Api/UserApiTest.php
new file mode 100644
index 0000000000..e28d19f705
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Api/UserApiTest.php
@@ -0,0 +1,169 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for createUsersWithArrayInput
+ *
+ * Creates list of users with given input array.
+ *
+ */
+ public function testCreateUsersWithArrayInput()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for createUsersWithListInput
+ *
+ * Creates list of users with given input array.
+ *
+ */
+ public function testCreateUsersWithListInput()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for deleteUser
+ *
+ * Delete user.
+ *
+ */
+ public function testDeleteUser()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for getUserByName
+ *
+ * Get user by user name.
+ *
+ */
+ public function testGetUserByName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for loginUser
+ *
+ * Logs user into the system.
+ *
+ */
+ public function testLoginUser()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for logoutUser
+ *
+ * Logs out current logged in user session.
+ *
+ */
+ public function testLogoutUser()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test case for updateUser
+ *
+ * Updated user.
+ *
+ */
+ public function testUpdateUser()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/AdditionalPropertiesClassTest.php b/samples/client/petstore/php/psr-18/test/Model/AdditionalPropertiesClassTest.php
new file mode 100644
index 0000000000..444bff6cac
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/AdditionalPropertiesClassTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "map_property"
+ */
+ public function testPropertyMapProperty()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "map_of_map_property"
+ */
+ public function testPropertyMapOfMapProperty()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/AllOfWithSingleRefTest.php b/samples/client/petstore/php/psr-18/test/Model/AllOfWithSingleRefTest.php
new file mode 100644
index 0000000000..ed452159eb
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/AllOfWithSingleRefTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "username"
+ */
+ public function testPropertyUsername()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "single_ref_type"
+ */
+ public function testPropertySingleRefType()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/AnimalTest.php b/samples/client/petstore/php/psr-18/test/Model/AnimalTest.php
new file mode 100644
index 0000000000..ae22931948
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/AnimalTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "class_name"
+ */
+ public function testPropertyClassName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "color"
+ */
+ public function testPropertyColor()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ApiResponseTest.php b/samples/client/petstore/php/psr-18/test/Model/ApiResponseTest.php
new file mode 100644
index 0000000000..8754f3f2cf
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ApiResponseTest.php
@@ -0,0 +1,108 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "code"
+ */
+ public function testPropertyCode()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "type"
+ */
+ public function testPropertyType()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "message"
+ */
+ public function testPropertyMessage()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ArrayOfArrayOfNumberOnlyTest.php b/samples/client/petstore/php/psr-18/test/Model/ArrayOfArrayOfNumberOnlyTest.php
new file mode 100644
index 0000000000..f218486ef9
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ArrayOfArrayOfNumberOnlyTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_array_number"
+ */
+ public function testPropertyArrayArrayNumber()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ArrayOfNumberOnlyTest.php b/samples/client/petstore/php/psr-18/test/Model/ArrayOfNumberOnlyTest.php
new file mode 100644
index 0000000000..9c1a9731c7
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ArrayOfNumberOnlyTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_number"
+ */
+ public function testPropertyArrayNumber()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ArrayTestTest.php b/samples/client/petstore/php/psr-18/test/Model/ArrayTestTest.php
new file mode 100644
index 0000000000..96c88251e4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ArrayTestTest.php
@@ -0,0 +1,108 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_of_string"
+ */
+ public function testPropertyArrayOfString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_array_of_integer"
+ */
+ public function testPropertyArrayArrayOfInteger()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_array_of_model"
+ */
+ public function testPropertyArrayArrayOfModel()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/CapitalizationTest.php b/samples/client/petstore/php/psr-18/test/Model/CapitalizationTest.php
new file mode 100644
index 0000000000..4b24190e76
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/CapitalizationTest.php
@@ -0,0 +1,135 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "small_camel"
+ */
+ public function testPropertySmallCamel()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "capital_camel"
+ */
+ public function testPropertyCapitalCamel()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "small_snake"
+ */
+ public function testPropertySmallSnake()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "capital_snake"
+ */
+ public function testPropertyCapitalSnake()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "sca_eth_flow_points"
+ */
+ public function testPropertyScaEthFlowPoints()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "att_name"
+ */
+ public function testPropertyAttName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/CatTest.php b/samples/client/petstore/php/psr-18/test/Model/CatTest.php
new file mode 100644
index 0000000000..f352cbdabe
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/CatTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "declawed"
+ */
+ public function testPropertyDeclawed()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/CategoryTest.php b/samples/client/petstore/php/psr-18/test/Model/CategoryTest.php
new file mode 100644
index 0000000000..1b6925f359
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/CategoryTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "id"
+ */
+ public function testPropertyId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "name"
+ */
+ public function testPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ClassModelTest.php b/samples/client/petstore/php/psr-18/test/Model/ClassModelTest.php
new file mode 100644
index 0000000000..e843f77915
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ClassModelTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "_class"
+ */
+ public function testPropertyClass()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ClientTest.php b/samples/client/petstore/php/psr-18/test/Model/ClientTest.php
new file mode 100644
index 0000000000..f95ede2e6a
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ClientTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "client"
+ */
+ public function testPropertyClient()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/DeprecatedObjectTest.php b/samples/client/petstore/php/psr-18/test/Model/DeprecatedObjectTest.php
new file mode 100644
index 0000000000..d50561b862
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/DeprecatedObjectTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "name"
+ */
+ public function testPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/DogTest.php b/samples/client/petstore/php/psr-18/test/Model/DogTest.php
new file mode 100644
index 0000000000..fa202c7bca
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/DogTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "breed"
+ */
+ public function testPropertyBreed()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/EnumArraysTest.php b/samples/client/petstore/php/psr-18/test/Model/EnumArraysTest.php
new file mode 100644
index 0000000000..f1e3ec08c5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/EnumArraysTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "just_symbol"
+ */
+ public function testPropertyJustSymbol()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_enum"
+ */
+ public function testPropertyArrayEnum()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/EnumClassTest.php b/samples/client/petstore/php/psr-18/test/Model/EnumClassTest.php
new file mode 100644
index 0000000000..d0fa5b429e
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/EnumClassTest.php
@@ -0,0 +1,81 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/EnumTestTest.php b/samples/client/petstore/php/psr-18/test/Model/EnumTestTest.php
new file mode 100644
index 0000000000..11184fd7b7
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/EnumTestTest.php
@@ -0,0 +1,153 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "enum_string"
+ */
+ public function testPropertyEnumString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "enum_string_required"
+ */
+ public function testPropertyEnumStringRequired()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "enum_integer"
+ */
+ public function testPropertyEnumInteger()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "enum_number"
+ */
+ public function testPropertyEnumNumber()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "outer_enum"
+ */
+ public function testPropertyOuterEnum()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "outer_enum_integer"
+ */
+ public function testPropertyOuterEnumInteger()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "outer_enum_default_value"
+ */
+ public function testPropertyOuterEnumDefaultValue()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "outer_enum_integer_default_value"
+ */
+ public function testPropertyOuterEnumIntegerDefaultValue()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/FakeBigDecimalMap200ResponseTest.php b/samples/client/petstore/php/psr-18/test/Model/FakeBigDecimalMap200ResponseTest.php
new file mode 100644
index 0000000000..c3b6a2563b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/FakeBigDecimalMap200ResponseTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "some_id"
+ */
+ public function testPropertySomeId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "some_map"
+ */
+ public function testPropertySomeMap()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/FileSchemaTestClassTest.php b/samples/client/petstore/php/psr-18/test/Model/FileSchemaTestClassTest.php
new file mode 100644
index 0000000000..3edb986cc2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/FileSchemaTestClassTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "file"
+ */
+ public function testPropertyFile()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "files"
+ */
+ public function testPropertyFiles()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/FileTest.php b/samples/client/petstore/php/psr-18/test/Model/FileTest.php
new file mode 100644
index 0000000000..4c069fb1db
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/FileTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "source_uri"
+ */
+ public function testPropertySourceUri()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/FooGetDefaultResponseTest.php b/samples/client/petstore/php/psr-18/test/Model/FooGetDefaultResponseTest.php
new file mode 100644
index 0000000000..c0d10bf1f2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/FooGetDefaultResponseTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "string"
+ */
+ public function testPropertyString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/FooTest.php b/samples/client/petstore/php/psr-18/test/Model/FooTest.php
new file mode 100644
index 0000000000..d7c49ad509
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/FooTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "bar"
+ */
+ public function testPropertyBar()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/FormatTestTest.php b/samples/client/petstore/php/psr-18/test/Model/FormatTestTest.php
new file mode 100644
index 0000000000..b6ffd5b9ef
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/FormatTestTest.php
@@ -0,0 +1,225 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "integer"
+ */
+ public function testPropertyInteger()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "int32"
+ */
+ public function testPropertyInt32()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "int64"
+ */
+ public function testPropertyInt64()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "number"
+ */
+ public function testPropertyNumber()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "float"
+ */
+ public function testPropertyFloat()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "double"
+ */
+ public function testPropertyDouble()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "decimal"
+ */
+ public function testPropertyDecimal()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "string"
+ */
+ public function testPropertyString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "byte"
+ */
+ public function testPropertyByte()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "binary"
+ */
+ public function testPropertyBinary()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "date"
+ */
+ public function testPropertyDate()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "date_time"
+ */
+ public function testPropertyDateTime()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "uuid"
+ */
+ public function testPropertyUuid()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "password"
+ */
+ public function testPropertyPassword()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "pattern_with_digits"
+ */
+ public function testPropertyPatternWithDigits()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "pattern_with_digits_and_delimiter"
+ */
+ public function testPropertyPatternWithDigitsAndDelimiter()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/HasOnlyReadOnlyTest.php b/samples/client/petstore/php/psr-18/test/Model/HasOnlyReadOnlyTest.php
new file mode 100644
index 0000000000..38e4a5353f
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/HasOnlyReadOnlyTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "bar"
+ */
+ public function testPropertyBar()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "foo"
+ */
+ public function testPropertyFoo()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/HealthCheckResultTest.php b/samples/client/petstore/php/psr-18/test/Model/HealthCheckResultTest.php
new file mode 100644
index 0000000000..d98e45b46b
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/HealthCheckResultTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "nullable_message"
+ */
+ public function testPropertyNullableMessage()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/MapTestTest.php b/samples/client/petstore/php/psr-18/test/Model/MapTestTest.php
new file mode 100644
index 0000000000..75d14ca692
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/MapTestTest.php
@@ -0,0 +1,117 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "map_map_of_string"
+ */
+ public function testPropertyMapMapOfString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "map_of_enum_string"
+ */
+ public function testPropertyMapOfEnumString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "direct_map"
+ */
+ public function testPropertyDirectMap()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "indirect_map"
+ */
+ public function testPropertyIndirectMap()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php b/samples/client/petstore/php/psr-18/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php
new file mode 100644
index 0000000000..9f52ae0e12
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/MixedPropertiesAndAdditionalPropertiesClassTest.php
@@ -0,0 +1,108 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "uuid"
+ */
+ public function testPropertyUuid()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "date_time"
+ */
+ public function testPropertyDateTime()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "map"
+ */
+ public function testPropertyMap()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/Model200ResponseTest.php b/samples/client/petstore/php/psr-18/test/Model/Model200ResponseTest.php
new file mode 100644
index 0000000000..7af8e0a831
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/Model200ResponseTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "name"
+ */
+ public function testPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "class"
+ */
+ public function testPropertyClass()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ModelListTest.php b/samples/client/petstore/php/psr-18/test/Model/ModelListTest.php
new file mode 100644
index 0000000000..92dd876105
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ModelListTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "_123_list"
+ */
+ public function testProperty123List()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ModelReturnTest.php b/samples/client/petstore/php/psr-18/test/Model/ModelReturnTest.php
new file mode 100644
index 0000000000..365ab68ec2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ModelReturnTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "return"
+ */
+ public function testPropertyReturn()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/NameTest.php b/samples/client/petstore/php/psr-18/test/Model/NameTest.php
new file mode 100644
index 0000000000..48098e5146
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/NameTest.php
@@ -0,0 +1,117 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "name"
+ */
+ public function testPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "snake_case"
+ */
+ public function testPropertySnakeCase()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "property"
+ */
+ public function testPropertyProperty()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "_123_number"
+ */
+ public function testProperty123Number()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/NullableClassTest.php b/samples/client/petstore/php/psr-18/test/Model/NullableClassTest.php
new file mode 100644
index 0000000000..4b5fb452aa
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/NullableClassTest.php
@@ -0,0 +1,189 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "integer_prop"
+ */
+ public function testPropertyIntegerProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "number_prop"
+ */
+ public function testPropertyNumberProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "boolean_prop"
+ */
+ public function testPropertyBooleanProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "string_prop"
+ */
+ public function testPropertyStringProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "date_prop"
+ */
+ public function testPropertyDateProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "datetime_prop"
+ */
+ public function testPropertyDatetimeProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_nullable_prop"
+ */
+ public function testPropertyArrayNullableProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_and_items_nullable_prop"
+ */
+ public function testPropertyArrayAndItemsNullableProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "array_items_nullable"
+ */
+ public function testPropertyArrayItemsNullable()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "object_nullable_prop"
+ */
+ public function testPropertyObjectNullableProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "object_and_items_nullable_prop"
+ */
+ public function testPropertyObjectAndItemsNullableProp()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "object_items_nullable"
+ */
+ public function testPropertyObjectItemsNullable()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/NumberOnlyTest.php b/samples/client/petstore/php/psr-18/test/Model/NumberOnlyTest.php
new file mode 100644
index 0000000000..53b5ddfbc2
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/NumberOnlyTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "just_number"
+ */
+ public function testPropertyJustNumber()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ObjectWithDeprecatedFieldsTest.php b/samples/client/petstore/php/psr-18/test/Model/ObjectWithDeprecatedFieldsTest.php
new file mode 100644
index 0000000000..fb22b69915
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ObjectWithDeprecatedFieldsTest.php
@@ -0,0 +1,117 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "uuid"
+ */
+ public function testPropertyUuid()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "id"
+ */
+ public function testPropertyId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "deprecated_ref"
+ */
+ public function testPropertyDeprecatedRef()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "bars"
+ */
+ public function testPropertyBars()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OrderTest.php b/samples/client/petstore/php/psr-18/test/Model/OrderTest.php
new file mode 100644
index 0000000000..989079cf60
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OrderTest.php
@@ -0,0 +1,135 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "id"
+ */
+ public function testPropertyId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "pet_id"
+ */
+ public function testPropertyPetId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "quantity"
+ */
+ public function testPropertyQuantity()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "ship_date"
+ */
+ public function testPropertyShipDate()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "status"
+ */
+ public function testPropertyStatus()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "complete"
+ */
+ public function testPropertyComplete()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OuterCompositeTest.php b/samples/client/petstore/php/psr-18/test/Model/OuterCompositeTest.php
new file mode 100644
index 0000000000..1a85306b95
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OuterCompositeTest.php
@@ -0,0 +1,108 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "my_number"
+ */
+ public function testPropertyMyNumber()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "my_string"
+ */
+ public function testPropertyMyString()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "my_boolean"
+ */
+ public function testPropertyMyBoolean()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OuterEnumDefaultValueTest.php b/samples/client/petstore/php/psr-18/test/Model/OuterEnumDefaultValueTest.php
new file mode 100644
index 0000000000..a483d1a8ac
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OuterEnumDefaultValueTest.php
@@ -0,0 +1,81 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OuterEnumIntegerDefaultValueTest.php b/samples/client/petstore/php/psr-18/test/Model/OuterEnumIntegerDefaultValueTest.php
new file mode 100644
index 0000000000..24fdc0abd5
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OuterEnumIntegerDefaultValueTest.php
@@ -0,0 +1,81 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OuterEnumIntegerTest.php b/samples/client/petstore/php/psr-18/test/Model/OuterEnumIntegerTest.php
new file mode 100644
index 0000000000..21f1b80539
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OuterEnumIntegerTest.php
@@ -0,0 +1,81 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OuterEnumTest.php b/samples/client/petstore/php/psr-18/test/Model/OuterEnumTest.php
new file mode 100644
index 0000000000..1aac0edc58
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OuterEnumTest.php
@@ -0,0 +1,81 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/OuterObjectWithEnumPropertyTest.php b/samples/client/petstore/php/psr-18/test/Model/OuterObjectWithEnumPropertyTest.php
new file mode 100644
index 0000000000..e7fb1de841
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/OuterObjectWithEnumPropertyTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "value"
+ */
+ public function testPropertyValue()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/PetTest.php b/samples/client/petstore/php/psr-18/test/Model/PetTest.php
new file mode 100644
index 0000000000..42f7b31188
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/PetTest.php
@@ -0,0 +1,135 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "id"
+ */
+ public function testPropertyId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "category"
+ */
+ public function testPropertyCategory()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "name"
+ */
+ public function testPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "photo_urls"
+ */
+ public function testPropertyPhotoUrls()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "tags"
+ */
+ public function testPropertyTags()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "status"
+ */
+ public function testPropertyStatus()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/PropertyNameMappingTest.php b/samples/client/petstore/php/psr-18/test/Model/PropertyNameMappingTest.php
new file mode 100644
index 0000000000..58bcc7ad43
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/PropertyNameMappingTest.php
@@ -0,0 +1,117 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "http_debug_operation"
+ */
+ public function testPropertyHttpDebugOperation()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "underscore_type"
+ */
+ public function testPropertyUnderscoreType()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "type"
+ */
+ public function testPropertyType()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "type_with_underscore"
+ */
+ public function testPropertyTypeWithUnderscore()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/ReadOnlyFirstTest.php b/samples/client/petstore/php/psr-18/test/Model/ReadOnlyFirstTest.php
new file mode 100644
index 0000000000..5c7251f883
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/ReadOnlyFirstTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "bar"
+ */
+ public function testPropertyBar()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "baz"
+ */
+ public function testPropertyBaz()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/SingleRefTypeTest.php b/samples/client/petstore/php/psr-18/test/Model/SingleRefTypeTest.php
new file mode 100644
index 0000000000..6c818589a4
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/SingleRefTypeTest.php
@@ -0,0 +1,81 @@
+markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/SpecialModelNameTest.php b/samples/client/petstore/php/psr-18/test/Model/SpecialModelNameTest.php
new file mode 100644
index 0000000000..d899299fa7
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/SpecialModelNameTest.php
@@ -0,0 +1,90 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "special_property_name"
+ */
+ public function testPropertySpecialPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/TagTest.php b/samples/client/petstore/php/psr-18/test/Model/TagTest.php
new file mode 100644
index 0000000000..c556931a9a
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/TagTest.php
@@ -0,0 +1,99 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "id"
+ */
+ public function testPropertyId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "name"
+ */
+ public function testPropertyName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}
diff --git a/samples/client/petstore/php/psr-18/test/Model/UserTest.php b/samples/client/petstore/php/psr-18/test/Model/UserTest.php
new file mode 100644
index 0000000000..ba51b06072
--- /dev/null
+++ b/samples/client/petstore/php/psr-18/test/Model/UserTest.php
@@ -0,0 +1,153 @@
+markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "id"
+ */
+ public function testPropertyId()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "username"
+ */
+ public function testPropertyUsername()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "first_name"
+ */
+ public function testPropertyFirstName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "last_name"
+ */
+ public function testPropertyLastName()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "email"
+ */
+ public function testPropertyEmail()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "password"
+ */
+ public function testPropertyPassword()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "phone"
+ */
+ public function testPropertyPhone()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+
+ /**
+ * Test attribute "user_status"
+ */
+ public function testPropertyUserStatus()
+ {
+ // TODO: implement
+ $this->markTestIncomplete('Not implemented');
+ }
+}