Salut à tous,

Alors voici mon problème (je suis sur Laravel 5.2) : J'ai créé un ViewComposer 'MenuComposer' chargé de construire mon menu dynamiquement depuis la BDD (certaines infos ne sont pas persistantes, d'où cette solution).

Voici le code du MenuComposer (je le met au cas où) :

    public function compose(View $view)
    {
            $categories = Category::all();
            $videos     = Post::lastPublished(3, true)->get();
            $menu = [
                'posts' => [],
                'videos' => []
            ];

            // Menu posts
            foreach ($categories as $category) {
                if (is_null($category->parent_id)) {
                    $menu['posts'][$category->id] = [
                        'name' => $category->name,
                        'slug' => $category->slug,
                        'items' => []
                    ];
                } else {
                    $menu['posts'][$category->parent_id]['items'][$category->id] = [
                        'name' => $category->name,
                        'slug' => $category->slug
                    ];
                }
            }

            // Menu videos
            foreach ($videos as $video) {
                $menu['videos'][] = [
                    'id' => $video->id,
                    'name' => $video->name,
                    'slug' => $video->slug,
                    'url' => $video->video_url
                ];
            }

            $menu = collect($menu);
            $view->with('menu', $menu);
    }

Je le déclare donc dans la fonction boot du ComposerServiceProvider, avec le wildcard '*' pour que celui-ci soit appelé pour toutes les vues :

    public function boot()
    {
        view()->composer(
            '*', 'App\Http\ViewComposers\MenuComposer'
        );
    }

Le problème est qu'un ViewComposer ayant le wildcard '*' est appelé pour TOUTES de les vues, c'est-à-dire que peu importe la page sur laquelle je me reds, il sera appelé autant de fois que le site a de page (c'est apparemment son fonctionnement natif).
Si par exemple j'ai 6 pages dans les templates, il sera appelé 6x.
Du coup on se retrouve avec X fois les mêmes queries SQL, ce qui n'est pas vraiment opti pour les perfs.

J'aimerais savoir si quelqu'un a déjà rencontré le souci et s'il aurait une solution à me proposer ?

Merci.

2 réponses


Salut,

Le mieux c'est de préciser à ton composer de s'éxécuter sur ton layout, comme ça il ne s'éxécutera qu'une fois et sur toutes tes pages ;)

Le comportement avec le wildcard * n'est utlisé que pour des éléments sans requêtes, autrement ce n'est pas du tout optimisé.

betaWeb
Auteur

@SquallX Oui ça me paraît être une bonne solution que de préciser le layout default (pourquoi n'y avais-je pas pensé ? ^^).
Beh disons que le wildcard '*' n'est pas vraiment optimisé (ça mériterait une issue tout ça :P).

M'enfin je teste ça quand j'ai le temps, merci ! ;)