Bonjour,

Voila je souhaite faire quelque chose pour améliorer la sécurité de mon code.
Je réalise un petit outil pour que les écoles de mon village puissent gérer les cours en ligne et garder un contact avec leurs élèves.
Pour ce faire, j'ai :

une entity Users qui contient :

  • id
  • firstname
  • ...

Une entity Schools, qui contient :

  • id
  • name
  • ...
  • director (relation OneToOne avec l'entité Users)

Ce que je veux

Je souhaite que le directeur connecté puisse visualiser / modifier le profil de son école (il s'agit d'un formulaire)
exemple de lien : director/school-profil

Mais que celui-ci ne puisse valider que le profil de son école et pas d'une autre. C'est pourquoi je veux éviter de faire passer l'ID de l'école concernée dans l'URL (ex. : director/school-profil/3)

Ce que je fais

Dans mon Controller :

/**
     * @Route("/school-profile", name="schoolprofile")
     */
    public function schoolprofile(Request $request, SchoolsRepository $schoolRepo, EntityManagerInterface $manager){

        // On récupère l'ID de l'user connecté
        $recupuser = $this->getUser();

        // On cherche à filtrer l'école concernée
        $schoolRepo->findOneBy([
            'director' => $recupuser
        ]); 

        // On traite le formulaire
        $form = $this->createForm(SchoolType::class);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {
            $manager->persist($form);
            $manager->flush();
        }

        return $this->render('director/school_profile.html.twig', [
        'schoolForm' => $form->createView()
        ]);
    }

Ce que j'obtiens

Aucune page d'erreur. J'ai bien la page contenant le formulaire, mais celui-ci est vide.

Merci par avance pour votre aide,

Grub

2 réponses


L'inconnu
Réponse acceptée

Hey,

Il manque du code la ...

Déjà pour ton système d'id, je te conseille d'utiliser un voter qui te permettra de gérer les permissions de tes utilisateurs.

Ensuite voilà le code qui devrait fonctionner:

$school = $schoolRepo->findOneBy(['director' => $recupuser]); 
$form = $this->createForm(SchoolType::class, $school);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
    $manager->flush();
    return $this->redirectToRoute('ta_route');
}

Il faut bien que tu stocke ton objet dans une variable school puis que tu le passe à ton formulaire.
On ne persist pas un objet déjà créer, cela fait partie des best practice de symfony

grub404
Auteur

Un grand merci pour ton retour qui m'a permis d'y voir plus clair et de trouver une solution à mon problème.
Bonne soirée !