Bonjour,
Je suis assez novice en développement.
J'essaye de suivre le début de la formation Symfony et à la fin de la seconde vidéo, j'ai un message d'erreur :
Symfony\Component\DependencyInjection\Exception\ RuntimeException
\vendor\symfony\dependency-injection\Compiler\AbstractRecursivePass.php (line 160)
La ligne 160 :
throw new RuntimeException(sprintf('Invalid service "%s": class%s has no constructor.', $this->currentId, sprintf($class !== $this->currentId ? ' "%s"' : '', $class)));
En fait c'est après avoir utilisé les routes avec Annotations apparemment.
Quelqu'un aurait-il la solution ?

7 réponses


Salut
As-tu fais un composer update ? ou install ?

gillout
Auteur

Bonjour,

De façon à pouvoir avancer dans la formation, j'ai fais les routes sans passer par les annotations mais directement dans le fichier routes.yaml

Plus loin à 25 minutes dans la 3ème vidéo, quand j'ajoute la partie ObjectManager :
/**

  • PropertyController constructor.
  • @param Environment $twig
  • @param PropertyRepository $repository
  • @param ObjectManager $em
    */
    public function __construct(Environment $twig, PropertyRepository $repository, ObjectManager $em)
    {
    $this->twig = $twig;
    $this->repository = $repository;
    $this->em = $em;
    }

Qui est utilisé ici :
/**

  • @return Response
    */
    public function index(): Response
    {
    $property = $this->repository->findAllVisible();
    $property[0]->setsold(true);
    $this->em->flush();
    return $this->render('property/index.html.twig', [
    'current_menu' => 'properties'
    ]);
    }

j'ai un message d'erreur.
J'ai essayé "composer update" et j'ai ce message d'erreur :
Executing script cache:clear [KO]
[KO]
Script cache:clear returned with error code 1
!! In DefinitionErrorExceptionPass.php line 54:
!! Cannot autowire service "App\Controller\PropertyController": argument "$em" of method "__construct()" references in
!! terface "Doctrine\Persistence\ObjectManager" but no such service exists. You should maybe alias this interface to t
!! he existing "doctrine.orm.default_entity_manager" service.
Script @auto-scripts was called via post-update-cmd

essaie de supprimer manuellement le cache puis tu fait un update.

gillout
Auteur

Bonjour,

Cela ne change rien :(

salut voila ce que j'ai pour le constructeur
/**

  • @Var PropertyRepository
    */
    private $repository;
    public function __construct (PropertyRepository $repository, ObjectManager $em)
    {
    $this->repository=$repository;
    $this->em=$em;
    }

    as-tu ajouté cette ligne sur le fichier services.yaml
    Doctrine\Common\Persistence\ObjectManager: '@doctrine.orm.default_entity_manager'

gillout
Auteur

Bonjour,et merci pour vos réponses,

J'ai :
/**

  • @var Environment
    */
    private $twig;

    /**

  • @var PropertyRepository
    */
    private $repository;

    /**

  • @var ObjectManager
    */
    private $em;

    /**

  • PropertyController constructor.
  • @param Environment $twig
  • @param PropertyRepository $repository
  • @param ObjectManager $em
    */
    public function __construct(Environment $twig, PropertyRepository $repository, ObjectManager $em)
    {
    $this->twig = $twig;
    $this->repository = $repository;
    $this->em = $em;
    }

    J'ai ajouté la ligne :
    Doctrine\Persistence\ObjectManager: 'doctrine.orm.default_entity_manager'
    à la fin du fichier "services.yaml".

    Cela retourne toujours une erreur :
    Symfony\Component\Config\Exception\ LoaderLoadException
    in \maSuperAgence\vendor\symfony\config\Loader\FileLoader.php (line 180)

                // prevent embedded imports from nesting multiple exceptions
                if ($e instanceof LoaderLoadException) {
                    throw $e;
                }
                throw new LoaderLoadException($resource, $sourceResource, null, $e, $type);
            }
        }
        return null;
    }

voici un code qui fonction chez moi la j'ai garder just le cas d'ajout d'un bien donc il faut supprimer les use dont tu n'a pas besoin et faire attention au nom auquel tu adapte a ton cas.
<?php
namespace App\Controller;

use App\Entity\Property;
use App\Entity\SearchProperty;
use App\Form\PropertySearchType;
use App\Repository\PropertyRepository;
//use Doctrine\ORM\EntityManager;
//use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Persistence\ObjectManager;
//use Doctrine\Common\Persistence\ObjectManager;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
//use Cocur\Slugify\Slugify;

class PropertyController extends AbstractController
{
/**

  • @Var PropertyRepository
    */
    private $repository;
    public function __construct (PropertyRepository $repository, ObjectManager $em)
    {
    $this->repository=$repository;
    $this->em=$em;
    }

    /**

  • @Route("/biens", name="biens")
    */
    public function index ():Response

    {

    $property = new Property();
    $property->setTitle('Premier bien')
            ->setDescription('Les biens les plus importants')
             ->setPrice(230)
             ->setRooms(3)
            ->setBedRooms(2)
             ->setSurface(90)
             ->setFloor(4)
             ->setHeat(0)
             ->setPostalCode('31000')
             ->setCity('Oran')
             ->setAddress('4 rue des jardins');

    $em=$this->getDoctrine()->getManager();
    $em->persist($property);
    $em->flush();

return $this->render('property/index.html.twig', ["properties"=>$properties]);
}