Symfony Questions

17372
,

Bonjour,

je n'ai pas vraiment de problème définit pour l'instant mais plus des questions. J'ai essayer de chercher des réponses compréhensible mais aucune n'a vraiment été tres clair pour moi même dans la doc de symfony (qui est véritablement un enfer).

1 Est-il possible de soumettre des informations en json pour les persister dans la base de donnée ?
2 Est-il possible de valider et sauvegarder "tout seul" ce json en ce basant sur les clés et les infos des annotation/getter de l'entity ?
3 Est-il possible de cacher/rendre visible une data à la même maniere que dans eloquent avec la variable $hidden = [] pour le rendu des données ?
4 Est-il possible de modifier la structure des dossiers (entity,controller,repository,event) pour avoir une gestion par "module" : src/posts/controller/, src/posts/events/, src/posts/Post.php ?
5 Est-il possible de capturer les differentes erreur de symfony Internal Error, validation error, sql error, uniqueness error ?

Merci beaucoup de votre aide.

3 Réponse

Default
,

Bonjour,
pour le sauvgarde de json en base de données c'est possible que tu mappe le json avec la form builder (il faut juste avoir la mm structure que tes entités )
ou bien tu peux utiliser JsonMapper pour mapper json avec un model ou entités .
Pour la structure de dossier il faut garder la mm structure par contre pour organiser votre travail tu peux ajouter de sous dossier exemple Controller/Post/PostController.php
Et pour le capture d'erreur 500 tu peut utiliser un Listener qui intercepte l'erreur 500.
tu peux voir cette exemple [https://github.com/alibelhaj/restSf3/tree/master/src/AppBundle/EventListener].

Merci

17372
,

Merci cela m'a bien aidé. J'aurais sans doute d'autres questions :)

17372
,

Rebonjour,

je suis entrain de travailler sur les controllers en ce-moment, mais j'ai un probleme notament sur la creation et l'update des données.

Je ne comprend pas comment faire pour update seulement les données qui sont passées en params.

Je fais actuellement ca, mais ce qui me pose probleme c'est le PostType::class, car il faut que je passe tous les params de l'entity sinon il me fait une erreur.

Par exemple:
je passe en param seulement le content car je ne veux update que lui, j'ai l'erreur:

"Expected argument of type \"string\", \"null\" given at property path \"title\"."

bien que le titre soit deja remplit car c'est un update.

Est ce que je dois créer un PostType juste pour l'update ?
Est ce qu'il y a une autre méthode pour faire ca correctement ?

public function update(Request $request, ?Post $post): JsonResponse
    {
        if(!($post instanceof Post)){
            return $this->NotFoundResponse();
        }

        if($post->isDeleted()){
            $post->restore();
        }

        $form = $this->createForm(PostType::class, $post);
        $this->processForm($request, $form);

        $this->save($post);

        return $this->response($post);
    }
    ```
    ```
    public function processForm(Request $request, FormInterface $form)
    {
        $request = $this->transformContent($request);

        $this->submitForm($request, $form);
    }
    public function submitForm(Request $request, FormInterface $form)
    {
        $params = $request->request->all();
        $clearMissing = $request->getMethod() != 'PATCH';
        $form->submit($params, $clearMissing);

        $this->validateForm($form);
    }
    public function validateForm(FormInterface $form)
    {
        if(!($form->isSubmitted() && $form->isValid())){
            throw new ExceptionResponse($this->setErrors($this->transformValidations($form))->BadRequestResponse());
        }
    }

    public function save($entity)
    {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($entity);
        $entityManager->flush();
    }
    protected function transformContent(Request $request): Request
    {
        $data = json_decode($request->getContent(), true);
        if($data === null){
            throw new ExceptionResponse($this->BadRequestResponse());
        }
        $request->request->replace($data);
        return $request;
    }

Merci pour votre aide.