Bonjour,

J'ai un petit soucis pas de code, mais d'optimisation.
Sur mon site, j'ai un menu qui est créer dynamiquement, et j'aimerai éviter de le déclarer à chaque fonction qui renvoie à une vue.
Je l'ai donc 'installer' dans le controller qui est hérité, mais je dois quand même le déclarer en tant que variable, avant de le renvoyer dans la vue.

Est-il possible de le transmettre à mon layout directement sans passer par le controller appelé ?
J'entends par là que je fais appel à ce menu seulement dans le layout.blade.php.

En espérant avoir était clair.
Je vous remercie pour vos réponses.

3 réponses


Azorgh
Réponse acceptée

Hello,

En effet, tu peux automatiquement envoyer des données à une vue sans passer par ta méthode du controller.
Ca permet de dire :

  • Pour la vue qui se nomme 'layouts.partials.menu' (c'est un exemple), alors je récupère ces données et je lui envois.

Je te laisse voir ici pour plus de détails : https://laravel.com/docs/5.4/views#view-composers

Merci pour la piste.
Je vais potassrer tout ça, et revient vers toi si j'ai besoin, sinon je mettrait en résolu.

Encore merci

Rebonjour,
je dois avoir un loupé dans ma façon de faire, et comme j'arrive pas à afficher les erreurs php, je me retourne vers vous.

voilà ce que j'ai fait :

  1. j'ai créer mon provider :
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            ['showMenu', 'showBasket'],
            'App\Http\ViewComposers\ShowComposer'
        );

        // Using Closure based composers...
        View::composer('shop', function ($view) {

        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
  1. j'ai enregistré mon provider dans 'cofig/app.php'

  2. j'ai créé mon composer :

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\MenuRepository;
use App\Repositories\BasketRepository;

class ShowComposer
{
    /**
     * The repositories implementation.
     */
    protected $menu;
    protected $basket;

    /**
     * Create a new view composer.
     */
    public function __construct(MenuRepository $menu, BasketRepository $basket)
    {
        // Dependencies automatically resolved by service container...
        $this->menu = $menu;
        $this->basket = $basket;
    }

    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('showMenu', $this->menu->menu())
            ->with('showBasket'), $this->basket->basket();
    }
}
  1. j'ai mis ma variable dans 'shop.blade.php.

Mais j'ai une erreur 500, sûrement parce qu'il ne connaît pas la variable 'showMenu'.
Mais je me demande si je ne dois pas rensaigner quelque chose dans cette fonction :

// Using Closure based composers...
        View::composer('shop', function ($view) {

        });

Car lorsque je fait un 'dd()', ce dernier s'affiche.

Dans l'attente de vos commentaires.