Initialiser collection

Par Pauchard jeremy, il y a 4 ans


Pouvez vous m'expliquez comment initiliser une collection (contructeur)
Comme je débute sur Symfony ..

Entour Call to a member function contains() on null Exception Logs 2 Stack Trace Error in C:\Users\33662\Desktop\PROJET MUSIC\SYMFONY\Projet-Music10\src\Entity\Ad.php (line 306) } public function addImage(Image $image): self { if (!$this->images->contains($image)) { $this->images[] = $image; $image->setAd($this); } return $this; ez votre code en utilisant "```" pour bien le mettre en forme. (ne copiez pas trop de code) <?php namespace App\Controller; //La class Ad vient de.. use App\Entity\Category; use App\Repository\CategoryRepository; use App\Entity\Ad; use Doctrine\Persistence\ObjectManager; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted; use App\Entity\Image; use Doctrine\ORM\EntityManagerInterface; use App\Form\AdType; use App\Repository\AdRepository; use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\Response; // use Symfony\Component\HttpFoundation\post; class AdController extends AbstractController { /** * @Route("/ads", name="ads_index") */ public function index(AdRepository $repo,CategoryRepository $catRepo) { $categories = $catRepo->findAll(); $ads = $repo->findAll(); return $this->render('ad/index.html.twig', [ 'categories'=>$categories, 'ads' => $ads ]); } /** * Permet de créer une annonce * * @Route("/ads/new", name="ads_create") * * @IsGranted("ROLE_USER") * * @return Response */ public function create(Request $request, EntityManagerInterface $manager,AdRepository $repo, CategoryRepository $catRepo){ $categories = $catRepo->findAll(); // Création de la page Annonce avec une nouvelle fonctionalité public $ad = new Ad(); // Utilise moi ce formulaire $form = $this->createForm(AdType::class, $ad); // handle (gère) request(requete) la variable ($request); $form->handleRequest($request); //Symfony va faire le lien entre les données des champs du formulaire //Et si ca était soumis est ce que c'est valider if($form->isSubmitted() && $form->isValid()){ // enregistrement de l'auteur = utilisateur connecté $ad->setAuthor($this-> getUser()); foreach($ad->getImages() as $image){ $image->setAd($ad); $manager->persist($image); } //pour enregistrer dans la base donnée // Manager je veux persister dans le temps ma nouvelle annonce $manager->persist($ad); //Pour que ma requete parte vers la base donnée $manager->flush(); // Pour valider l'enregistrement de l'annonce message Flash pour valider l'enregistrement $this->addFlash( 'success', "L'annonce <strong>Test{$ad->getTitle()}</strong> a bien été enregistrée" ); return $this->redirectToRoute('ads_show',['slug'=> $ad->getSlug() ]); } // Ensuite pour mettre en forme le constructeur de formulaire en formulaire return $this->render('ad/new.html.twig', [ 'categories'=>$categories, 'form' => $form->createView() ]); } // Je veux utiliser ici une expression (de sécutité) et je veux que la personne soit automatiquement connecté // Secutity("is_granted('ROLE_USER')") // symfony/doc/current/security/expression.html /** * Permet d'afficher le formulaire d'édition * * @Route("/ads/{slug}/edit", name="ads_edit") * * @Security("is_granted('ROLE_USER') and user === ad.getAuthor()",message="Cette annonce ne vous * appartient pas, vous ne pouvez pas la modifier") * * * @return Response */ // Cette fonction seras lier à une route public function edit(Ad $ad, Request $request, EntityManagerInterface $manager, AdRepository $repo,CategoryRepository $catRepo){ $categories = $catRepo->findAll(); $form = $this->createForm(AdType::class, $ad); $form->handleRequest($request); //Symfony va faire le lien entre les données des champs du formulaire //Et si ca était soumis est ce que c'est valider if($form->isSubmitted() && $form->isValid()){ foreach($ad->getImages() as $image){ $image->setAd($ad); $manager->persist($image); } //pour enregistrer dans la base donnée // Manager je veux persister dans le temps ma nouvelle annonce $manager->persist($ad); //Pour que ma requete parte vers la base donnée $manager->flush(); // Pour valider l'enregistrement de l'annonce message Flash pour valider l'engeristrement $this->addFlash( 'success', "Les modifications de l'annonce <strong>{$ad->getTitle()}</strong> ont bien été enregistrées" ); return $this->redirectToRoute('ads_show',['slug'=> $ad->getSlug() ]); } return $this->render('ad/edit.html.twig',[ 'categories'=>$categories, 'form' => $form->createView(), 'ad'=> $ad ]); } /** *Permet d'afficher une seule annonce * *@Route("/ads/{slug}", name="ads_show") * *@return Response */ public function show(Ad $ad, AdRepository $repo, CategoryRepository $catRepo) { $categories = $catRepo->findAll(); // Je récupère l'annonce qui correspond au slug ! // $ad = $repo->findOneBySlug($slug); return $this->render('ad/show.html.twig', [ 'categories'=>$categories, 'ad' => $ad ]); } /** * ¨Permet de supprimer une annnonce * * @Route("/ads/{slug}/delete", name="ads_delete") * @Security("is_granted('ROLE_USER') and user == ad.getAuthor()", message="Vous n'avez * pas le droit d'accéder à cette ressource") * * @param Ad $ad * @param ObjectManager $manager * @return Response */ public function delete(Ad $ad, EntityManagerInterface $manager,AdRepository $repo, CategoryRepository $catRepo) { $categories = $catRepo->findAll(); $manager->remove($ad); $manager->flush(); $this->addFlash( 'success', "L'annonce <strong>{$ad->getTitle()}</strong> a bien été supprimée !" ); return $this->redirectToRoute("ads_index"); } }// fin class AdController extends AbstractController

Ce que je veux

Décrivez ce que vous cherchez à obtenir.

Ce que j'obtiens

Décrivez vos éventuelles erreurs ou ce que vous obtenez à la place de ce que vous attendez :(

12 réponses

Pauchard jeremy, il y a 4 ans

J'aimerais initialiser mon constructeur mais je ne sais pas comment faire )
Merci

floriqn, il y a 4 ans

Je ne comprends pas ce que tu veux faire, peux tu être plus précis ?

Pauchard jeremy, il y a 4 ans

Bonsoir,
lors d'un soucis juste avant je n'arrivais pas à ajouter d'album dans mon projet symfony...
Voici le dernier message que j'ai reçu

Je travaille actuèlement sur un Projet Symfony (Musical)
depuis quelques jours je n'arrive plus à entrer des albums dans le site.

"
TypeError
dans C:\Users\33662\Desktop\PROJET MUSIC\SYMFONY\Projet-Music10\src\Entity\Ad.php (ligne 300)
/ @return Collection|Image[] / public function getImages(): Collection { return $this->images; } public function addImage(Image $image): self { if (!$this->images->contains($image)) {

"

Ce que je veux

Je voudrais pouvoir ajouter à nouveau des albums dedans.

Ce que j'obtiens

Voici ce que j'obtiens...

La valeur de retour de App\Entity\Ad::getImages() doit implémenter l’interface Doctrine\Common\Collections\Collection, null retourné

3 réponses

raizen
Réponse acceptée
il y a 17 jours
!

Bonjour,

public function getImages(): ?Collection
{
return $this->images;
}

N'oubliez pas également d'initialiser votre collection dans le constructeur.

Cordialement,

floriqn, il y a 4 ans

Il parlait du constructeur de ton entité, quelque chose comme ca je suppose :

private $images; public function __construct() { $this->images = new ArrayCollection(); }
Pauchard jeremy, il y a 4 ans

Merci je regarde...

Pauchard jeremy, il y a 4 ans

Maintenant j'ai ça...

SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'created_at' ne peut être vide (null)

Exceptions 3 Logs 1 Stack Traces 3 

Doctrine\DBAL\Exception\ NotNullConstraintViolationException
in C:\Users\33662\Desktop\PROJET MUSIC\SYMFONY\Projet-Music10\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\AbstractMySQLDriver.php (line 125)

            case '1171':
            case '1252':
            case '1263':
            case '1364':
            case '1566':
                return new NotNullConstraintViolationException($message, $exception);
        }
        return new DriverException($message, $exception);
    }
Pauchard jeremy, il y a 4 ans

Users\33662\Desktop\PROJET MUSIC\SYMFONY\Projet-Music10\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDO\Exception.php (line 18)

 */
final class Exception extends PDOException
{
    public static function new(\PDOException $exception): self
    {
        return new self($exception);
    }
}
floriqn, il y a 4 ans

Tu as ta réponse :

SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'created_at' ne peut être vide (null)

Pauchard jeremy, il y a 4 ans

Je ne vois pas comment faire..

floriqn, il y a 4 ans

Ba c'est dommage, c'est surtout dommage de ne faire aucune recherche car ce n'est pas les réponses qui manquent à ce sujet.

Ton entité à un champ "created_at" que tu as déclaré et qui ne peut pas être nul, mais tu ne lui ne passe pas de valeur lorsque tu initialises ton objet donc ca coince. C'est comme faire a + b mais ne pas donner la valeur de a.

A ton avis comment on peut résoudre ca ?

Pour te mettre sur la bonne piste : https://stackoverflow.com/questions/14956381/symfony2-timestable-trait-column-createdat-cannot-be-null

floriqn, il y a 4 ans

@spiceagent11, t'es mignon tu crées ton sujet avec le code qui va bien sans oublier les messages d'erreur.