IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Api platform: détruire des fichiers


Sujet :

Symfony PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut Api platform: détruire des fichiers
    Bonjour,

    j'ai suivi la documentation d'API plaform pour télécharger des fichiers dans mon dossier public ( images ).
    Donc le principe est que dans ma table, je n'ai pas le chemin du fichier: il est envoyé grâce au normalizer et vich/uploader
    Du coup, je peux afficher mon image ( en fonction de l'id de l'image)

    Ça fonctionne très bien, mais je souhaite maintenant que l'utilisateur de la BDD puisse supprimer une image.

    Le DELETE classique fourni par Api platform va supprimer la ligne dans la BDD, mais pas l'image dans le dossier public !

    Quelle solution ?
    Je vais mettre le chemin de l'image dans la table et je pourrai ensuite dans un contrôleur,
    supprimer l'image grâce au chemin récupéré.
    Et pour mettre le chemin dans ma table?

    Ou bien, il y a moyen, lors de ma requête classique, de récupérer à nouveau le chemin vers l'image et ensuite supprimer avec le contrôleur.

    En fait, je ne sais pas comment récupérer le chemin vers l'image lors de la requête !
    le normalizer me l'appporte quand je veux afficher une image, mais pour le mettre dans la table ???

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut
    Bonjour, voici où j'en suis dans ma résolution du problème:

    aucune avancée !
    Même si je veux faire plus simple: supprimer une image, pas l'image dans le dossier public, mais utiliser la méthode DELETE générée par API platform.
    Je rentre l'id et je m'attends à ce que la ligne de ma table soit détruite. Mais j'ai une erreur:
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    "detail": "Expected argument of type \"string\", \"null\" given at property path \"imagePath\".",

    Pour résumer un peu, j'ai suivi la documentation pour télécharger des images dans mon dossier public:
    - un contrôler personnalisé pour la collectionOperation POST
    - un Serializer pour normaliser ( renvoi du chemin vers le dossier public )
    - vich uploader pour les opérations sur les fichiers

    Résultats pour la table qui contient les données relatives aux images:
    - elle ne contient pas le chemin vers le dossier public ( le champ est nul car je ne sais pas comment le récupérer)
    - la méthode GET des itemOpérations me renvoi toutes les infos contenues dans la table ( y compris le imagePath )
    - la méthode DELETE me renvoi l'erreur ci-dessus

    Je me rends compte que le code qui me permet de télécharger une image a un impact sur la méthode DELETE ? De quelle façon ?

    Mon problème est simple, après avoir téléchargé une image, je souhaite pouvoir la supprimer dans le dossier public... si quelqu'un à une piste, car je ne trouve pas de documentation la dessus !

    Merci, bonne après-midi,

    Laurent.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2020
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2020
    Messages : 280
    Par défaut
    Bonjour,

    J'en suis là aujourd'hui:
    - je peux détruire une ligne dans ma table, mais pas l'image
    - je tente de faire une deserialisation
    - je dois aussi déserializer du multipart...

    j'ai donc dans mon dossier src:
    - un dossier Serializer ( avec des fichiers ImageAnimalNormalizer.php et ImageAnimalDenormalizer.php )
    - un dossier EventListener ( avec un fichier DeserializeListener.php )
    - un dossier Controller ( avec mon fichier AnimalImageController.php qui est appelé lorsque je fait un POST)

    Je suppose que pour une requête il y a dans l'ordre:
    - exécution de la fonction dans AimalImageController.php
    - -------------------------------- ImageAnimalDenormalizer.php
    - -------------------------------- DeserializeListener.php
    - -------------------------------- ImageAnimalNormalizer.php

    Mais je ne suis pas sûr de l'ordre...pour les fichiers DeserializeListener.php et IMageAnimalDenormalizer.php !
    Une chose est sûre après avoir fait des Die And Dump

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
     
    namespace App\Serializer;
     
    use Symfony\Component\Serializer\Normalizer\DenormalizerAwareTrait;
    use Symfony\Component\Serializer\Normalizer\DenormalizerAwareInterface;
    use Symfony\Component\Serializer\Normalizer\ContextAwareDenormalizerInterface;
     
    class ImageAnimalDenormalizer implements ContextAwareDenormalizerInterface, DenormalizerAwareInterface
    {
        use DenormalizerAwareTrait;
     
        public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool
        {
            return true;
        }
     
        public function denormalize(mixed $data, string $type, ?string $format = null, array $context = [])
        {
            dd('bonjour denormalizer');
        }
    }

    Si je fais une requête pour un post, il y a création ( comme d'habitude ) mais aucun message à l'horizon.

    Alors que si je mets un message dans le DeserializeListener:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
    namespace App\EventListener;
     
    use ApiPlatform\Core\EventListener\DeserializeListener as DecoratedListener;
    use Symfony\Component\HttpKernel\Event\RequestEvent;
     
    class DeserializeListener
    {
        public function __construct( private DecoratedListener $decorated)
        {
     
        }
     
        public function onKernelRequest(RequestEvent $event): void
        {
            $request = $event->getRequest();
            dd('bonjour listener);
        }
    }

    Le message s'affiche.

    Donc , c'est comme si le Denormalizer n'existait pas !

    Déjà, si je pouvais avoir le message, je ferais une avancée significative...)


    Mais je vais exposer à nouveau mon problème de départ:
    dans la documentation API platform, on m'apprend comment renvoyer le chemin vers l'image en réponse après la requête.

    Sympathique ! Mais , en ce qui me concerne, j'aimerais pouvoir insérer ce chemin dans une table pour m'en servir ensuite lors de la suppression: je veux supprimer l'image.

    Si quelqu'un sait faire , merci de me donner des indications, ou la marche à suivre, car je commence à perdre pied...

    Laurent.

Discussions similaires

  1. api platform + react : envoyer des fichiers
    Par Ushuango dans le forum Symfony
    Réponses: 1
    Dernier message: 04/04/2022, 11h38
  2. Réponses: 1
    Dernier message: 01/04/2022, 13h43
  3. Détruire des fichiers en ligne
    Par Denis Placé dans le forum Langage
    Réponses: 4
    Dernier message: 13/05/2016, 15h26
  4. API pour paser des fichiers VRML
    Par rolintoucour dans le forum Général Java
    Réponses: 0
    Dernier message: 26/12/2013, 20h56
  5. API de manipulation des fichiers ODT openoffice ?
    Par elitost dans le forum Documents
    Réponses: 4
    Dernier message: 28/06/2006, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo