ludovicjj / dragon-treasure-v2

Projet d'etude sur ApiPlatform v3

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Dragon Treasure

  • Api plaform v3
  • symfony 6.3.10
  • docker (postgreSQL)
  • PHP 8.1

helper

Debug la configuration actuelle

php bin/console debug:config api_platform

Montre toute la configuration possible

php bin/console config:dump api_platform

stateless

Si la session est utilisé pour s'authentifier, modification du stateless dans la config de API Platform

api_platform:
    defaults:
        stateless: false // default true

Documentation

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.jsonldretourne 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

Test

Run all tests

symfony php bin/phpunit

Run only one test

symfony php bin/phpunit --filter=<methodeTestName>

Embedded Relation

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."
}

Put Operation

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,
    ],
)]

Custom Normalizer

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

Conditional property : ApiProperty

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;
}

About

Projet d'etude sur ApiPlatform v3


Languages

Language:PHP 81.2%Language:JavaScript 12.5%Language:SCSS 4.7%Language:Twig 1.6%