Wie übergebe ich Daten an alle Ansichten in Laravel 5?

Lesezeit: 10 Minuten

Ich möchte, dass einige Standarddaten in allen Ansichten meiner Laravel 5-Anwendung zugänglich sind.

Ich habe versucht, danach zu suchen, aber nur Ergebnisse für Laravel 4 gefunden. Ich habe die Dokumentation „Sharing Data With All Views“ gelesen. Hier aber ich verstehe nicht, was ich tun soll. Wo soll der folgende Code platziert werden?

View::share('data', [1, 2, 3]);

Danke für Ihre Hilfe.

  • Nun, Sie brauchen Startcode, um diese Anforderung zu verwalten?

    – Safoor Safdar

    19. Februar 2015 um 14:14 Uhr

  • Wenn Sie View::share in einem Dienstanbieter mit den Ergebnissen eines Datenbankaufrufs verwenden, führt dies zu einem Fehler der Anwendung, wenn Sie eine Refresh-Datenbankmigration ausführen oder versuchen, Dämmerung mit einer nicht erreichbaren Datenbankverbindung auszuführen (lange Geschichte, .env.dusk.local ist wird nur verwendet, nachdem der Dienstanbieter ausgeführt wurde). Wie unten erwähnt, ist ein Basiscontroller oder Middleware das Beste.

    – Andy Löbel

    19. August 2017 um 3:31 Uhr

  • Seien Sie auch vorsichtig bei der Verwendung * On View Composer, besonders wenn DB-Abfragen verwendet werden, da es für jede enthaltene Unteransicht, Komponente usw. ausgeführt wird, sodass Sie am Ende Hunderte unnötiger Abfragen ausführen könnten. Am besten verwenden Sie die Basisansicht, z. B. layouts.app, und geben dann Daten weiter wie benötigt.

    – Andy Löbel

    19. August 2017 um 3:35 Uhr

Wie ubergebe ich Daten an alle Ansichten in Laravel 5
Safoor Safdar

Dieses Ziel kann durch verschiedene Methoden erreicht werden,

1. Verwendung von BaseController

So wie ich Dinge gerne aufbaue, mache ich a BaseController Klasse, die Laravels eigene erweitert Controller, und richten dort verschiedene globale Dinge ein. Alle anderen Controller fahren dann aus BaseController und nicht Laravels Controller.

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();

    // Sharing is caring
    View::share('user', $user);
  }
}

2. Verwenden von Filtern

Wenn Sie sicher wissen, dass Sie für jede Anfrage in der gesamten Anwendung etwas für Ansichten einrichten möchten, können Sie dies auch über einen Filter tun, der vor der Anfrage ausgeführt wird – so gehe ich mit dem Benutzerobjekt in Laravel um.

App::before(function($request)
{
  // Set up global user object for views
  View::share('user', User::all());
});

ODER

Sie können Ihren eigenen Filter definieren

Route::filter('user-filter', function() {
    View::share('user', User::all());
});

und rufen Sie es durch einfachen Filteraufruf auf.

Update nach Version 5.*

3. Verwendung von Middleware

Verwendung der View::share mit middleware

Route::group(['middleware' => 'SomeMiddleware'], function(){
  // routes
});



class SomeMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

4. Verwenden von View Composer

View Composer hilft auch dabei, bestimmte Daten zu binden, um sie auf unterschiedliche Weise anzuzeigen. Sie können die Variable direkt an eine bestimmte Ansicht oder an alle Ansichten binden. Beispielsweise können Sie Ihr eigenes Verzeichnis erstellen, um Ihre View Composer-Datei je nach Bedarf zu speichern. und diese View Composer-Datei über den Dienst bereitstellen, interagieren mit View.

Die View Composer-Methode kann auf andere Weise verwendet werden. Das erste Beispiel kann ähnlich aussehen:

Sie könnten eine erstellen App\Http\ViewComposers Verzeichnis.

Dienstleister

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
    }
}

Fügen Sie danach diesen Anbieter zu config/app.php im Abschnitt „Anbieter“ hinzu.

TestViewComposer

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class TestViewComposer {

    public function compose(View $view) {
        $view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
    }
}

ViewName.blade.php

Here you are... {{$ViewComposerTestVariable}}

Diese Methode könnte nur für bestimmte Ansichten hilfreich sein. Aber wenn Sie ViewComposer auf alle Ansichten auslösen möchten, müssen wir diese einzelne Änderung auf ServiceProvider anwenden.

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
    }
}

Referenz

Laravel-Dokumentation

Zur weiteren Klarstellung Laracast-Episode

Wenn von meiner Seite noch etwas unklar ist, lassen Sie es mich wissen.

  • Deinem Beispiel fehlt die register() Methode – es ist nicht optional

    – Jonathan

    27. Juli 2016 um 16:50 Uhr


  • @jonathan danke, um darauf hinzuweisen, aber das Beispiel enthält nur die Abschnitte, um die Sie sich kümmern müssen. Perspektive zum Teilen von Daten mit Ansicht.

    – Safoor Safdar

    28. Juli 2016 um 10:50 Uhr


  • wo setzt du den Filter ein? Die wahrscheinlich richtigste Antwort ist jetzt die Verwendung von Middleware-Gruppen laravel.com/docs/5.3/middleware#middleware-groups oder globale Middleware

    – Toskanisch

    25. Oktober 2016 um 20:58 Uhr

  • Dies ist keine gute Idee, View Composer erstellen die Composer-Instanz für jede einzelne Ansicht. Wenn Sie also eine 1000-malige Schleife ausführen, werden 1000 Composer-Instanzen erstellt und 1000 Mal wird das Auslöseereignis behandelt, was nicht von Ihnen gewünscht ist.

    – Reza Schadmann

    22. November 2016 um 8:11 Uhr


  • @RezaShadman hat Recht! Ich habe das auf die harte Tour gelernt. Meine Anwendung lief so langsam, bis ich das Tool laravel-debugbar zur Untersuchung installierte. Dann wurde mir klar, dass alle 8 Abfragen etwa 15 Mal für das Laden einer einzelnen Seite ausgeführt wurden. Dies liegt daran, dass der View Composer für jede enthaltene Blade-Datei aufgerufen wird. Das ist, wenn Sie das Sternchen verwenden *. Wenn Sie die nicht verwenden * dann sollte es dir gut gehen.

    – Syklone

    23. Mai 2018 um 3:40 Uhr


Sie können entweder Ihre eigenen erstellen Dienstleister (ViewServiceProvider Name ist üblich) oder Sie können den vorhandenen verwenden AppServiceProvider.

Geben Sie bei Ihrem ausgewählten Anbieter Ihren Code in die Boot-Methode ein.

public function boot() {
    view()->share('data', [1, 2, 3]);
}

Dies wird ein $data Variable, auf die in allen Ihren Ansichten zugegriffen werden kann.

Wenn Sie statt des Helfers lieber die Fassade nutzen möchten, wechseln Sie view()-> zu View:: aber vergessen Sie nicht zu haben use View; oben in Ihrer Datei.

  • Danke, funktioniert super. Ist die Boot-Funktion für so etwas gedacht oder empfehlen Sie, einen eigenen Dienstanbieter zu erstellen?

    – Ragnarson

    19. Februar 2015 um 14:56 Uhr


  • Wenn Sie nur ein oder zwei Dinge zu teilen haben, setzen Sie es ein AppServiceProvider ist in Ordnung, aber wenn Sie etwas mehr als das haben, sollten Sie einen neuen Anbieter erstellen.

    – Marwelln

    19. Februar 2015 um 16:59 Uhr


  • Es hat funktioniert, aber ich sehe gerade, dass es heute nicht funktioniert! verwenden composer update funktioniert auch nicht. Eigentlich feuert es nicht boot() überhaupt. Ich muss zwei Variablen teilen.

    – esazzad

    1. Juni 2015 um 5:15 Uhr


  • Beachten Sie, dass dies nicht funktioniert, wenn Sie Datenbankeinträge abrufen, da dies vor der Ausführung von Migrationen aufgerufen wird. Sie versuchen also im Grunde, Datenbankeinträge abzurufen, bevor sie existieren. Zumindest scheint das bei mir der Fall zu sein.

    – Lore

    4. Oktober 2015 um 21:41 Uhr

  • Leider scheint dies nicht zu funktionieren, wenn ein angemeldeter Benutzer Auth::user() geteilt wird, Safoors Antwort Nr. 1, darunter, funktioniert 🙂

    – Stan Smulders

    16. November 2015 um 11:04 Uhr

Das fand ich am einfachsten. Erstellen Sie einen neuen Anbieter und Benutzer '*' Platzhalter, um es an alle Ansichten anzuhängen. Funktioniert auch in 5.3 🙂

<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     * @return void
     */
    public function boot()
    {
        view()->composer('*', function ($view)
        {
            $user = request()->user();

            $view->with('user', $user);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

  • Fügen Sie diesen Anbieter zu einer Reihe von Anbietern in Ihrer Konfiguration/App “App\Providers\ViewServiceProvider::class” hinzu.

    – Nadeem0035

    7. Oktober 2016 um 6:33 Uhr

Wie ubergebe ich Daten an alle Ansichten in Laravel 5
Reza Schadmann

Der beste Weg wäre, die Variable mit zu teilen View::share('var', $value);

Probleme beim Komponieren mit "*":

Betrachten Sie folgenden Ansatz:

<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);

$viewFacrory->compose('*', GlobalComposer::class);

Aus einer Beispiel-Blade-Ansicht:

  @for($i = 0; $i<1000; $i++)
    @include('some_partial_view_to_display_i', ['toDisplay' => $i])
  @endfor

Was geschieht?

  • Die GlobalComposer Klasse wird instanziiert 1000 mal verwenden
    App::make.
  • Das Ereignis composing:some_partial_view_to_display_i gehandhabt wird
    1000 mal.
  • Die compose Funktion innerhalb der GlobalComposer Klasse wird 1000 Mal aufgerufen.

Aber die Teilansicht some_partial_view_to_display_i hat nichts mit den Variablen zu tun, die von gebildet werden GlobalComposer erhöht aber die Renderzeit stark.

Beste Vorgehensweise?

Verwenden View::share entlang einer gruppierten Middleware.

Route::group(['middleware' => 'WebMiddleware'], function(){
  // Web routes
});

Route::group(['prefix' => 'api'], function (){

});

class WebMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

Aktualisieren

Wenn Sie etwas verwenden, das über die Middleware-Pipeline berechnet wird, können Sie einfach Hören zum Richtigen Veranstaltung oder platzieren Sie die View Share-Middleware am letzten Ende der Pipeline.

In der Dokumentation:

Typischerweise platzieren Sie Aufrufe der Share-Methode innerhalb der Boot-Methode eines Dienstanbieters. Es steht Ihnen frei, sie dem AppServiceProvider hinzuzufügen oder einen separaten Dienstanbieter zu generieren, um sie aufzunehmen.

Ich stimme Marwelln zu, fügen Sie es einfach ein AppServiceProvider in der Boot-Funktion:

public function boot() {
    View::share('youVarName', [1, 2, 3]);
}

Ich empfehle, einen bestimmten Namen für die Variable zu verwenden, um Verwechslungen oder Fehler mit anderen nicht ‘globalen’ Variablen zu vermeiden.

Die Dokumentation ist zu hören https://laravel.com/docs/5.4/views#view-composers aber ich werde es abbauen

  1. Suchen Sie nach dem Verzeichnis app\Anbieter im Stammverzeichnis Ihrer Anwendung und erstellen Sie die Datei ComposerServiceProvider.php und kopieren Sie den folgenden Text und fügen Sie ihn ein und speichern Sie ihn.

    <?php
        namespace App\Providers;
        use Illuminate\Support\Facades\View;
        use Illuminate\Support\ServiceProvider;
    
        class ComposerServiceProvider extends ServiceProvider
        {
            /**
            * Register bindings in the container.
            *
            * @return void
            */
        public function boot()
        {
            // Using class based composers...
            View::composer(
                'profile', 'App\Http\ViewComposers\ProfileComposer'
            );
    
            // Using Closure based composers...
            View::composer('dashboard', function ($view) {
                //
            });
        }
    
        /**
        * Register the service provider.
        *
        * @return void
        */
        public function register()
        {
            //
        }
    }
    
  2. Öffnen Sie im Stammverzeichnis Ihrer Anwendung Config/app.php Suchen Sie in der Datei nach dem Abschnitt Anbieter und kopieren Sie ihn und fügen Sie ihn ein ‘App\Providers\ComposerServiceProvider’, zum Array.

Dadurch haben wir den Composer Service Provider geschaffen. Wenn Sie Ihre Anwendung mit der Ansicht Profil so ausführen http://ihredomain/etwas/profilder Dienstleister ComposerServiceProvider wird aufgerufen und die Klasse App\Http\ViewComposers\ProfileComposer wird instanziiert, indem die Methode Composer aufgrund des unten stehenden Codes innerhalb der Startmethode oder -funktion aufgerufen wird.

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. Wenn Sie Ihre Anwendung aktualisieren, erhalten Sie einen Fehler, weil die Klasse App\Http\ViewComposers\ProfileComposer existiert noch nicht. Jetzt können wir es erstellen.

Wechseln Sie in den Verzeichnispfad app/Http

  • Erstellen Sie das Verzeichnis namens ViewComposers

  • Erstellen Sie die Datei ProfileComposer.php.

    class ProfileComposer
    {
        /**
        * The user repository implementation.
        *
        * @var UserRepository
        */
        protected $users;
    
        /**
        * Create a new profile composer.
        *
        * @param  UserRepository  $users
        * @return void
        */
        public function __construct(UserRepository $users)
        {
            // Dependencies automatically resolved by service container...
            $this->users = $users;
        }
    
        /**
        * Bind data to the view.
        *
        * @param  View  $view
        * @return void
        */
        public function compose(View $view)
        {
            $view->with('count', $this->users->count());
        }
    }
    

Gehen Sie nun zu Ihrer Ansicht oder in diesem Fall Profile.blade.php und fügen Sie hinzu

{{ $count }}

und das zeigt die Anzahl der Benutzer auf der Profilseite.

Um die Anzahl auf allen Seiten anzuzeigen, ändern Sie sich

// Using class based composers...
View::composer(
    'profile', 'App\Http\ViewComposers\ProfileComposer'
);

Zu

// Using class based composers...
View::composer(
    '*', 'App\Http\ViewComposers\ProfileComposer'
);

1646636652 86 Wie ubergebe ich Daten an alle Ansichten in Laravel 5
arisch

Sie haben zwei Möglichkeiten:

1. Teilen über ‍Boot Funktion ein App\Providers\AppServiceProvider:

public function boot()
{
  view()->share('key', 'value');
}

Und zugreifen $key Variable in jeder Ansichtsdatei.

Note: Denken Sie daran, dass Sie nicht auf aktuelle zugreifen können Session, Auth, Route Daten hier. Diese Option ist nur sinnvoll, wenn Sie statische Daten freigeben möchten. Angenommen, Sie möchten einige Daten basierend auf dem aktuellen Benutzer, der Route oder einer benutzerdefinierten Sitzungsvariablen freigeben, die Sie damit nicht tun können.

2. Verwendung einer Hilfsklasse:

Erstellen Sie irgendwo in Ihrer Anwendung eine Hilfsklasse und registrieren Sie sie im Alias-Array in app.php Datei in config Mappe.

 'aliases' => [ 
   ...,
  'Helper' => App\HelperClass\Helper::class,
 ],

und erstellen Helper.php im HelperClass-Ordner im App-Ordner:

namespace App\HelperClass;
    
class Helper
{
    public static function Sample()
    {
        //Your Code Here
    }
}

und überall darauf zugreifen Helper::Sample().

Du wirst nicht sein restricted hier zu verwenden Auth, Route, Sessionoder andere Klassen.

  • beide gut, aber … sie laufen vor der Laravel-Sitzung.

    – BenyaminRmb

    2. März 2021 um 10:57 Uhr

963810cookie-checkWie übergebe ich Daten an alle Ansichten in Laravel 5?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy