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


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

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

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,

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

    private $images;
    public function __construct()
    {
        $this->images = new ArrayCollection();
    }

Merci je regarde...

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);
    }

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);
    }
}

Tu as ta réponse :

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

Je ne vois pas comment faire..

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

Je travaille actuèlement sur un Projet Symfony (Musical)
depuis quelques jours je n'arrive plus à entrer des albums dans le site.
VidMate https://vidmate.click https://myfiosgateway.win/

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