- Api plaform v3
- symfony 6.3.10
- docker (postgreSQL)
- PHP 8.1
Debug la configuration actuelle
php bin/console debug:config api_platform
Montre toute la configuration possible
php bin/console config:dump api_platform
Si la session est utilisé pour s'authentifier, modification du stateless dans la config de API Platform
api_platform:
defaults:
stateless: false // default true
Désactiver la documentation config/packages/api_platform.yaml
Lorsque enable_docs: false
, cela supprime la page d'accueil de l'API et la documentation
- l'url
/api/docs.json
ou/api/docs.jsonld
retourne une 404 (documentation) - l'url
/api
retourne une 500 (Page d'acceuil de l'api), car l'url vers la documention n'existe plus (/api/docs.json
),
api_platform:
enable_docs: false
Désactiver le entry_point (url: /api
)
Désactive seulement la page d'accueil de l'API pas la documentation, retourne une 404
api_platform:
entry_point: false
Désactiver la documentation swagger
api_platform:
enable_swagger: false
enable_swagger_ui: false
Run all tests
symfony php bin/phpunit
Run only one test
symfony php bin/phpunit --filter=<methodeTestName>
Création d'un trésor, lié à un utilisateur existant dans la base de données, et modification du nom d'utilisateur de l'utilisateur.. (method : POST)
Use "id" not "@id"
{
"name": "A shiny thing",
"value": 1000,
"coolFactor": 5,
"owner": {
"id": "/api/users/16",
"username": "Batman"
},
"description": "It sparkles when I wave it in the air."
}
Dans API Platform 4, l'opartion PUT
se comportera comme une modification totale et non partiel (selon la spécification HTTP). Avec l'utilisation de PUT
, vous devez envoyer tous les champs, même ceux qui ne changent pas. Sinon, ils seront définis sur null
.
Pour résoudre ce problème globalement pour toutes vos ressources à la fois, vous pouvez ajouter ceci par défaut dans la configuration de l'API Platform :
# config/packages/api_platform.yaml
api_platform:
defaults:
extra_properties:
standard_put: true
Ou alors définir le nouveau comportement de PUT
pour certaine ApiResource :
#[ORM\Entity(repositoryClass: FooRepository::class)]
#[ApiResource(
shortName: "Foo",
description: 'A random description',
operations: [
new Get(),
new GetCollection(),
new Put()
],
extraProperties: [
'standard_put' => true,
],
)]
Une solution de contournement possible, qui fonctionnerait avec le nouveau TraceableNormalizer, consiste à utiliser le nouvel Autowire attribut :
class UserNormalizer implements NormalizerInterface
{
public function __construct(
#[Autowire(service: 'api_platform.jsonld.normalizer.item')]
private readonly NormalizerInterface $normalizer,
) {
}
}
OU bien :
class UserNormalizer implements NormalizerInterface
{
public function __construct(
private readonly NormalizerInterface $normalizer,
) {
}
}
services:
App\Serializer\UserNormalizer:
arguments:
$normalizer: '@api_platform.jsonld.normalizer.item'
use '@serializer.normalizer.object'
symfony classic
Si cette expression renvoie false, la propriété isPublished
ne sera pas incluse dans l'API : elle ne sera ni lisible ni inscriptible.
class DragonTreasure
{
#[ApiProperty(security: 'is_granted("ROLE_ADMIN")')]
#[Groups(['treasure:read', 'treasure:write'])]
private bool $isPublished = false;
}