0
votes

Symfony 4 - Comparez deux objets avant de persister?

J'ai un projet Symfony 4. Dans mon contrôleur, j'ai une action pour éditer un objet dans ma base de données:

$session = $this->get('session');

        if (!$session->has('groupe')) {
            $session->set('groupe', $groupeValidateurs);
        }


2 commentaires

Le composant de formulaire peut toujours modifier l'objet qui est donné en fonction de la soumission par l'utilisateur (ou des données fournies via Soumettre). Une session est un très mauvais rangement pour quoi que ce soit, à l'exception de la session elle-même. Cela étant dit, il est difficile de savoir comment vous voulez "comparer" l'ancien et nouvel objet et quelles sont ces actions et quand elles sont exécutées ...


Je veux juste prendre la collection utilisateur de mon objet avant et après l'édition pour appliquer certaines modifications si certains utilisateurs sont supprimés.


3 Réponses :


1
votes

dans Modifier "Action" Essayez d'utiliser:

public function update(Request $request, $id)
    {
    /* @var $em EntityManager */
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository(Entity::class)->find($id); //your GroupeValidateurs entity class

    $form = $this->createForm(GroupeValidateursType::class, $groupeValidateurs);
    $form->handleRequest($request);


    if ($form->isSubmitted() && $form->isValid()) {
      //persist and flush in database
        $currentdata = $form->getData();
        $beforedata = $em->getUnitOfWork()->getOriginalEntityData($entity);
        /*....*/
    }


4 commentaires

Ok, mais si je veux les données précédentes, avant de soumettre?


J'aime votre approche accéder à l'unité de travail, c'est fantaisie; o)


@Jakumi Je l'utilise dans notre petit projet pour enregistrer des journaux de changement d'enregistrement :-) github.com/comunefi/bicorebundle/blob/...


@Andreamanzi hein, j'aurais probablement utilisé l'événement Onflush de Doctrine pour cela (comme pour être agnostique à l'endroit où ce changement se produit). D'autre part ... vous utilisez un trait pour injecter cette logique dans chaque contrôleur d'entité. D'accord, ça commence à obtenir de tels sujettes. Sry.



1
votes

avant $ Form-> HandleRequest (Demande $) code> Votre objet $ groupevalidateurs code> est toujours l'original.

Si vous souhaitez conserver certaines informations, plusieurs options , parmi ceux qui sont très faciles et simples: p>

manipulent l'objet extérieur et à l'extérieur du composant de formulaire: h3>

Si je vous ai bien compris, vous ne voulez qu'empêcher certains utilisateurs d'être ajoutés / supprimés . Puisque je ne connais pas votre entité, je suppose que votre objet a une méthode getUserers () code>, qui renvoie les utilisateurs actuels. P>

function removeUser($user) { 
    if($user->isAdmin()) { 
        return; 
    }     
    $this->users->removeElement($user); // I assume users to be a doctrine Collection
}
function setUsers($users) {
    foreach($this->users as $user) {
        if($user->isAdmin() && !in_array($users)) {
            $users[] = $user; // add user;
        }
    }
    $this->users = $users;
}


1 commentaires

Merci pour ton aide ! :RÉ



0
votes

objet clone à $ clonegroupevalidateurs. Définir une entité pour former. Suivant soumettez votre formulaire et comparez avec une variable précédemment clonée.


0 commentaires