* [PHP-Symfony] fixes validation of date-time parameter This fixes parts of #14930. Without this patch a parameter declared as date-time is validated against Symfony's "DateTime" constraint, which always fails. Because this constraint expects a string with format "Y-m-d H:i:s". It fails because the generated code performs the check after the deserialization, so the variable checked is not a string anymore. Besides this, even if we performed that validation on the string, that would not work well because OpenApi specification expects date-time to conform to RFC 3339 and that "Y-m-d H:i:s" would reject RFC 3339 compliant dates. With this change we ensure that the string provided by the web user could be parsed by PHP to DateTime, which solves both issues. (Note however that it means that it now accepts more formats than just RFC 3339 compliant ones for those parameters (it would accept all formats accepted by PHP DateTime). That being said it's compliant with the guideline ""be conservative in what you send, be liberal in what you accept") * [PHP-Symfony] Fix handling of null date-time parameter This fixes one of the issue described on #14930, namely that the deserializeString method of the generated class JsmSerializer returns null for other types of string, but not for date-time. Instead it returns a DateTime which represents "now" (because that what `new DateTime(null)` does). Consequently when an API declares a date-time parameter as non-required and when that endpoint is called without that parameters, then the user code would end up having "now" instead of "null" for this parameter.
OpenAPIServer
This is a sample server Petstore server. For this sample, you can use the api key special-key
to test the authorization filters.
This Symfony bundle is automatically generated by the OpenAPI Generator project:
- API version: 1.0.0
- Build package: org.openapitools.codegen.languages.PhpSymfonyServerCodegen
Requirements
PHP 8.0 and later
Installation & Usage
To install the dependencies via Composer, add the following repository to composer.json
of your Symfony project:
{
"repositories": [{
"type": "path",
"url": "//Path to your generated openapi bundle"
}],
}
Then run:
composer require openapitools/petstore:dev-master
to add the generated openapi bundle as a dependency.
Tests
To run the unit tests for the generated bundle, first navigate to the directory containing the code, then run the following commands:
composer install
./vendor/bin/phpunit
Getting Started
Step 1: Please follow the installation procedure first.
Step 2: Enable the bundle in the bundle configuration:
// app/config/bundles.php
return [
// ...
OpenAPI\Server\OpenAPIServerBundle::class => ['all' => true],
];
Step 3: Register the routes:
# app/config/routes.yaml
open_api_server:
resource: "@OpenAPIServerBundle/Resources/config/routing.yaml"
Step 4: Implement the API calls:
<?php
// src/Acme/MyBundle/Api/PetApiInterface.php
namespace Acme\MyBundle\Api;
use OpenAPI\Server\Api\PetApiInterface;
class PetApi implements PetApiInterface // An interface is autogenerated
{
/**
* Configure OAuth2 access token for authorization: petstore_auth
*/
public function setpetstore_auth($oauthToken)
{
// Retrieve logged in user from $oauthToken ...
}
/**
* Implementation of PetApiInterface#addPet
*/
public function addPet(Pet $pet, int &$responseCode, array &$responseHeaders): array|object|null
{
// Implement the operation ...
}
// Other operation methods ...
}
Step 5: Tag your API implementation:
# config/services.yaml
services:
# ...
Acme\MyBundle\Api\PetApi:
tags:
- { name: "open_api_server.api", api: "pet" }
# ...
Now you can start using the bundle!
Documentation for API Endpoints
All URIs are relative to http://petstore.swagger.io/v2
Class | Method | HTTP request | Description |
---|---|---|---|
PetApiInterface | addPet | POST /pet | Add a new pet to the store |
PetApiInterface | deletePet | DELETE /pet/{petId} | Deletes a pet |
PetApiInterface | findPetsByStatus | GET /pet/findByStatus | Finds Pets by status |
PetApiInterface | findPetsByTags | GET /pet/findByTags | Finds Pets by tags |
PetApiInterface | getPetById | GET /pet/{petId} | Find pet by ID |
PetApiInterface | updatePet | PUT /pet | Update an existing pet |
PetApiInterface | updatePetWithForm | POST /pet/{petId} | Updates a pet in the store with form data |
PetApiInterface | uploadFile | POST /pet/{petId}/uploadImage | uploads an image |
StoreApiInterface | deleteOrder | DELETE /store/order/{orderId} | Delete purchase order by ID |
StoreApiInterface | getInventory | GET /store/inventory | Returns pet inventories by status |
StoreApiInterface | getOrderById | GET /store/order/{orderId} | Find purchase order by ID |
StoreApiInterface | placeOrder | POST /store/order | Place an order for a pet |
UserApiInterface | createUser | POST /user | Create user |
UserApiInterface | createUsersWithArrayInput | POST /user/createWithArray | Creates list of users with given input array |
UserApiInterface | createUsersWithListInput | POST /user/createWithList | Creates list of users with given input array |
UserApiInterface | deleteUser | DELETE /user/{username} | Delete user |
UserApiInterface | getUserByName | GET /user/{username} | Get user by user name |
UserApiInterface | loginUser | GET /user/login | Logs user into the system |
UserApiInterface | logoutUser | GET /user/logout | Logs out current logged in user session |
UserApiInterface | updateUser | PUT /user/{username} | Updated user |
Documentation For Models
Documentation For 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