IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Embedding controller sur navbar fait planter Symfony


Sujet :

Symfony PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut Embedding controller sur navbar fait planter Symfony
    Bonjour à tous,

    Voilà que Symfony plante avec un magnifique "Fatal error: Allowed memory size of 536870912 bytes exhausted" lorsque j'implante un embedding dans ma navbar ...

    J'en ai pourtant un dans le footer qui lui marche parfaitement, j'ai comparé le code, je ne vois pas d'erreur...

    Le but recherché est de disposer des variables "nomEntreprise" et de l'objet "homepage" dans la navbar qui me serviront à afficher logo + nom de l'entreprise...

    Les dites variables sont aussi envoyées par le main controller pour la page d'accueil (qui sont bien affichées d'ailleurs), j'ai pensé à un conflit entre elles mais non, elles sont sensées se ré-écraser me semble t'il...

    Si je retire la route dans la fonction index du NavBarController rien ne change, de même si je mets l'embedding dans base.html.twig avant l'include de la navbar ça ne plante plus mais les variables ne sont pas trouvées ! A n'y rien comprendre !

    Merci d'avance pour votre dévouement

    NavBarController.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
     
    namespace App\Controller\Admin;
     
    use App\Repository\EntrepriseRepository;
    use App\Repository\HomepageRepository;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
     
    class NavBarController extends AbstractController{
        #[Route('/navbar',name:'navbar')]
        public function index(EntrepriseRepository $entrepriseRepository, HomepageRepository $homepageRepository): Response
        {
     
            //Récupération des infos de l'entreprise
            $idEntreprise = $entrepriseRepository->getMaxId();
            $entreprise = $entrepriseRepository->findOneBy(['id' => $idEntreprise]);
            $nomEntreprise = $entreprise->getNomEntreprise();
     
            //Récupération des infos de page d'accueil
            $idHomepage = $homepageRepository->getMaxId();
            $homepage = $homepageRepository->findOneBy(['id' => $idHomepage]);
     
            return $this->render('_partials/_nav.html.twig', compact('homepage', 'nomEntreprise'));
        }
    }
    _nav.html.twig

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <nav class="navbar">
    	{{render(controller('App\\Controller\\Admin\\NavBarController::index'))}}
     
    	<div class="brand">
    		{% if homepage.logo is not null%}
    			<a href="#" class="navbar-brand" aria-label="Logo"><img src="{{asset('assets/uploads/logo/' ~ homepage.logo)}}" alt="Logo entreprise" style="height:50px;"></a>
    		{% else %}
    			<span class="logo">
    				<i class="fa-solid fa-truck-pickup"></i>
    			</span>
    			<p>{{nomEntreprise}}</p>
    		{% endif %}
    	</div>
    	<button type="button" class="menu-hamburger" aria-label="Toggle navigation" aria-expanded="false">
    		<span></span>
    		<span></span>
    		<span></span>
    	</button>
     
    	<div class="menu-navbar">
    		<div class="div-links">
    			<ul class="navbar-nav">
    				<li class="active nav-item">
    					<i class="fa-solid fa-house"></i>
    					<a href="{{path('app_index')}}" aria-label="Accueil" aria-current="page">Accueil</a>
    				</li>
    				<li class="nav-item">
    					<i class="fa-regular fa-clock"></i>
    					<a href="{{path('app_horaires_semaine_index')}}" aria-label="Horaires">Nos horaires</a>
    				</li>
    				<li class="nav-item">
    					<i class="fa-solid fa-car-side"></i>
    					<a href="{{path('app_vehicules_annonces_index')}}" arai-label="Annonces véhicules occasion">Annonces véhicules d'occasion</a>
    				</li>
    				<li class="nav-item">
    					<i class="fa-solid fa-screwdriver-wrench"></i>
    					<a href="{{path('app_services_index')}}" aria-label="Services">Nos services</a>
    				</li>
    				<li class="nav-item">
    					<i class="fa-solid fa-phone"></i>
    					<a href="">Nous contacter</a>
    				</li>
    			</ul>
    		</div>
     
    		<div class="div-connexion">
    			<ul class="navbar-nav">
    				{% if app.user %}
    					{% if is_granted("ROLE_ADMIN") or is_granted("ROLE_EMPLOYEE") %}
    						<li class="nav-item">
    							<i class="fa-solid fa-toolbox"></i>
    							<a href="{{path('app_admin_index')}}">Administration</a>
    						</li>
    					{% endif %}
    					<li class="nav-item">
    						<i class="fa-solid fa-arrow-right-from-bracket"></i>
    						<a href="{{path('app_logout')}}">Se déconnecter</a>
    					</li>
    					{% if is_granted("ROLE_USER") %}
    						<li class="nav-item">
    							<i class="fa-regular fa-id-card"></i>
    							<a href="{{path('app_utilisateurs_profil')}}">Mon profil</a>
    						</li>
    					{% endif %}
    				{% else %}
    					<li class="nav-item user-toggler">
    						<i class="fa-solid fa-user"></i>
    						<a href="#" aria-label="Page de connexion" alt="Icône utilisateur"></a>
    					</li>
    					<li class="nav-item connexions">
    						<i class="fa-solid fa-arrow-right-to-bracket"></i>
    						<a href="{{path('app_login')}}">Se connecter</a>
    					</li>
    					<li class="nav-item connexions">
    						<i class="fa-regular fa-address-card"></i>
    						<a href="{{path('app_register')}}">S'inscrire</a>
    					</li>
    				{% endif %}
    			</ul>
    		</div>
    	</div>
    </nav>

    base.html.twig

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <!DOCTYPE html>
    <html lang="fr">
    	<head>
    		<meta charset="UTF-8">
    		<meta name="viewport" content="width=device-width, initial-scale=1">
    		<title>
    			{% block title %}Bienvenue !
    			{% endblock %}
    		</title>
     
    		{% block stylesheets %}
    			{{ encore_entry_link_tags('app') }}
    			<link rel="stylesheet" href={{asset('./css/styles.css')}}>
    			<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    			<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
    		{% endblock %}
    	</head>
    	<body>
     
    		{{ include('/_partials/_nav.html.twig') }}
     
    		{% if app.user and app.user.isVerified == false %}
    			<div class="alert alert-warning alert-dismissible" role="alert">
    				<button type="button" class="btn-close" data-dismiss="alert" aria-label="Close">&times;</button>
    				<div class="alert-message">
    					<strong>Votre compte n'est pas encore activé</strong>
    					,
    					<a href="{{path('resend_verif')}}">Cliquez ici pour renvoyer le lien d'activation</a>
    				</div>
    			</div>
    		{% endif %}
    		{% include("/_partials/_flash.html.twig") %}
    		{% include("/_partials/_modal.html.twig") %}
    		{% block body %}{% endblock %}
    		{{ include('_partials/_footer.html.twig') }}
    		{{ include('_partials/_cookies.html.twig') }}
     
    		{% block javascripts %}
    			<script type="text/javascript" src="{{asset('assets/js/main.js')}}" defer></script>
    		{% endblock %}
    	</body>
    </html>

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut
    Bonjour,

    Je vois dans ton controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $this->render('_partials/_nav.html.twig', compact('homepage', 'nomEntreprise'));
    Tu passes 2 chaînes en dur dans ce compact, ce qui m'intrigue... Peut être que ton code est correct, j'utilise rarement cette fonction "compact", mais peux tu essayer pour passer tes variables à la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    return $this->render('_partials/_nav.html.twig', array(
        'homepage' => $homepage,
        'nomEntreprise' => $nomEntreprise
    ));
    Qu'est ce que ça donne ?

    EDIT : Oups, j'ai posté un peu vite, je viens de regarder la doc de "compact", ton code semble correct !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Oui, la méthode compact est bien pratique lorsqu'il s'agît de passer uniquement des variables par le controller...

    Pour en revenir au problème, non seulement ça plante Symfony mais aussi le navigateur et vs code, obligé de tout redémarrer à chaque fois !

    C'est rageant en plus car je ne pense pas avoir fait d'erreur d'orthographe/syntaxe...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut
    Désolé pour la fausse piste, merci pour la fonction compact, je la garde sous le coude pour mes besoins...

    Ton message parle de "memory", quelle limite de mémoire as tu pour les scripts PHP dans ton serveur ?
    Moi j'ai 512 Mo et je n'ai jamais eu de souci...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Pareil que toi ...

    J'ai l'impression que ça se produit car la variable est déclarée dans 2 controllers à la fois, mais c'est bizarre...

  6. #6
    Membre émérite
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 433
    Par défaut
    Bonjour,

    A la ligne 2 du fichier _nav.html.twig, pourquoi est-ce que tu utilises les fonctions twig render/controller pour afficher le rendu de NavBarController::index ?

    La méthode NavBarController::index affiche le template _nav.html.twig, or ce template appelle la méthode du contrôleur à la ligne 2, tu sembles donc avoir une boucle infinie à l'affichage.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Bonjour Pytet

    En effet c'était bien çà, mais j'y avais pensé et oublié d'actualiser le code ici...

    De toutes façons je réalise que ce n'est certainement pas la bonne méthode car cela oblige à un render un l'élément or ce que je veux c'est simplement disposer de variables à placer n'importe où dans le fichier Twig...

    Par exemple dans le cas qui m' intéresse j'ai besoin de la variable logoEntreprise + telephone dans le header et que une fois le header disparaît que l'on puisse en disposer dans la navbar en mode mobile...

    Avec la méthode de l'embedding on est obligé de render un fichier si je ne me trompe, or je n'ai besoin que des variables, donc le laisser vide ?

    Accéder au repository dans Twig n'est pas une bonne pratique apparemment ?

  8. #8
    Modérateur
    Avatar de bertiny
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2013
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 282
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Et si tu envoies tes variables à la session au niveau du contrôleur ? Tu ne seras pas obligé de faire un render et je pense bien que tu peux les récupérer dans twig avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    app.session.get('variable')

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/01/2016, 12h20
  2. [WD15] Etat sur table fait planter windev
    Par Jeje9 dans le forum WinDev
    Réponses: 2
    Dernier message: 09/06/2015, 10h47
  3. Réponses: 7
    Dernier message: 12/11/2008, 10h09
  4. Un TextBox dans un Control ActiveX fait planter VB6
    Par nicolashenry974 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 21/07/2006, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo