Bonjour j'ai une erreur à 18 minutes sur la vidéo 2 du tuto symfony

Invalid service "App\Controller\HomeController": class has no constructor.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;

class HomeController extends AbstractController
{
    /**
     * @Route ("/", "name="home")
     * @return Response
     */

    public function index(): Response
    {
       return $this->render('pages/home.html.twig');
    }
}

A quel endroit ai je fais une erreur ?
Sachant que ça marche si j'ai ça

``
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;

class HomeController extends AbstractController
{
/**

  • @Route ("/", "name="home")
  • @return Response
    */
    private $twig;

    public function __construct($twig)
    {
    $this->twig = $twig;
    }

    public function index(): Response
    {
    return $this->render('Pages/home.html.twig');
    }
    }
    ``

35 réponses


Ca c'est pas correct :

    /**
     * @Route ("/", "name="home")
     * @return Response
     */

https://symfony.com/doc/current/routing.html

FabienR
Auteur

et pourtant c'est bien ce qu'il fait à 17.32 min

en fait il faut un constructeur pour la page HomeController si je ne met pas le
public function __construct($twig) { $this->twig = $twig; }
ça ne marche pas, étrangement sans le controlleur ça marche pour la page ProprietesController

mais ça c'est bien la meme chose que sur le tuto
``
/**

  • @Route ("/", "name="home")
  • @return Response
    */
    ``

Encore une fois tu recopies bêtement et tu ne prends pas le temps de lire la doc que je t'ai envoyé.

En plus de recopier tu recopies mal ! A 17:32 sur la vidéo 2 je ne vois pas la même syntaxe que ce que tu me montres.

FabienR
Auteur

au temps pour mois c'est 18:20
https://youtu.be/TjHRk1Kk4JI?t=1100

FabienR
Auteur

j'ai lu la doc apres si ça continue à ne pas marcher comme sur le tuto je regarderais les autres façon de le faire dnas la doc

FabienR
Auteur

pour HomeController j'ai ça
``<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;

class HomeController extends AbstractController
{
/**

  • @Route ("/home", "name="home")
  • @return Response
    */
    private $twig;

    public function __construct($twig)
    {
    $this->twig = $twig;
    }

    public function index(): Response
    {
    return $this->render('Pages/home.html.twig');
    }
    } et pour ProprieteController j'ai ça <?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ProprieteController extends AbstractController
{
/**

  • @Route ("/biens", name="propriete.index")
  • @return Response
    */

    public function index(): Response
    {
    return $this->render('propriete/index.html.twig',
    [
    'current_menu' => 'propriete'
    ]);
    }
    }``

Pourquoi il faut le construct sur le home alors que sur le propriete je peux m'en passer...

Non ce n'est pas ca ! Encore une fois tu recopies mal ! Il faut faire un effort sérieusement, y'a rien qui te choque entre tes deux routes ? :

@Route ("/biens", name="propriete.index")

et

@Route ("/home", "name="home")

Et arrêtes de poser la question à la seconde, regardes la suite c'est souvent expliqué et en plus ca va changer.

FabienR
Auteur

zut, le " devant le name

FabienR
Auteur

cela dit il me demande toujours le contructeur...

Tu n'as pas besoin du constructeur pour ca, supprimes le et avance.

FabienR
Auteur

Invalid service "App\Controller\HomeController": class has no constructor.

FabienR
Auteur

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Environment;

class HomeController extends AbstractController
{
    /**
     * @Route ("/", name="home")
     * @return Response
     */

    public function index(): Response
    {
       return $this->render('Pages/home.html.twig');
    }
}

Utililes les balises quotes stp, ca me pète les yeux de déchiffrer à chaque fois !

Première ligne : 3x ALT GR + 7
Ligne 2....: ton code
Dernière ligne : 3x ALT GR + 7

FabienR
Auteur

tel quel ça ne marche pas et la c'est ce qu'il y à sur le tuto

Tu peux virer :

use Twig\Environment;

Sinon là c'est bon c'est quoi le problème ?

FabienR
Auteur

non erreur encore

Ba donnes là ! Je vais pas écrire le code à ta place !

FabienR
Auteur

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController
{
    /**
     * @Route ("/", name="home")
     * @return Response
     */

    public function __construct($twig)
    {

    }

    public function index(): Response
    {
       return $this->render('Pages/home.html.twig');
    }
}
``
FabienR
Auteur

ça ça marche, il faut à tout prix le construct

Je ne sais pas si a une incidence, mais pas d'espace entre @Route et ('/', name="home").

Non il ne faut pas à tout prix le constructeur pour cette classe. Supprimes ce *** __construct

FabienR
Auteur

non pas d'incidence sur l'espace après le @Route

FabienR
Auteur

Invalid service "App\Controller\HomeController": class has no constructor.
ExceptionStack Trace
Symfony\Component\DependencyInjection\Exception\
RuntimeException
in C:\Users\Fabien\Desktop\Symphony\MaSuperAgence\vendor\symfony\dependency-injection\Compiler\AbstractRecursivePass.php (line 157)

       } catch (\ReflectionException $e) {            throw new RuntimeException(sprintf('Invalid service "%s": ', $this->currentId).lcfirst($e->getMessage()));        }        if (!$r = $r->getConstructor()) {            if ($required) {                throw new RuntimeException(sprintf('Invalid service "%s": class%s has no constructor.', $this->currentId, sprintf($class !== $this->currentId ? ' "%s"' : '', $class)));            }        } elseif (!$r->isPublic()) {            throw new RuntimeException(sprintf('Invalid service "%s": ', $this->currentId).sprintf($class !== $this->currentId ? 'constructor of class "%s"' : 'its constructor', $class).' must be public.');        }

Déjà tes commentaires doivent être au dessus de la fonction sinon aucun intérêt et la route est illisible :

class HomeController extends AbstractController
{
    /**
     * @Route ("/", name="home")
     * @return Response
     */
    public function index(): Response
    {
       return $this->render('Pages/home.html.twig');
    }
}

Ensuite tu as indiqué 'Pages' avec un 'p' majuscule. Est ce que le dossier dans template c'est 'Pages' ou 'pages' ?

FabienR
Auteur

Rien à faire il veut toujours le

  public function __construct($twig)
    {

    }
FabienR
Auteur

truc de fous sur l'autre page il demande pas le construct et sur la home il le demande

FabienR
Auteur

bon ben je vais laisser comme ça avec le construct vide si ça lui fait plaisir, j'espere que ça va pas gener pour la suite, 1 semaine et j'ai avancé de 2 tutos de 20 min .... 1 problème de commande pour lancer le serveur et un problème de constructeur.....

T'as modifié quelque chose dans services.yaml ? Je te garantie qu'il n'y en a pas besoin.

Supprimes ce que tu as mis dans routes.yaml et tu pourras supprimer ton constructeur.

FabienR
Auteur

il yavait ça que j'avais mis

 App\Controller\HomeController:
        tags: ['controller.service_arguments']
        arguments:
            $twig: '@twig'
FabienR
Auteur

effectivement ça marche maintenant

j'ai pas vu à quel moment il supprime ça du fichier services...

A oui ba en plus t'avais oublié un truc... Supprimes tout puis le constructeur.

FabienR
Auteur

j'ai encore ça dans le route aussi

home:
    path: /
    controller: App\Controller\HomeController::index
FabienR
Auteur

bon ces quotes ça marche 1 fois sur 10.....

Il faut mettre 3 quotes, pas deux ! Tu peux tout supprimer comme je te l'ai dis.

FabienR
Auteur

ça à l'air bon, pas d'erreur, j'ai pas vu à quel moment il supprimait ce qu'il avait mis dans routes et services dans la vidéo, switcher de fenetre à chaque fois pas top...