it-swarm.com.de

Wie kann ich Daten an alle Ansichten in Laravel 5 übergeben?

Ich möchte, dass in meiner Laravel 5-Anwendung einige Standarddaten in allen Ansichten verfügbar sind.

Ich habe versucht, danach zu suchen, aber nur Ergebnisse für Laravel 4 zu finden. Ich habe die Dokumentation 'Daten mit allen Ansichten gemeinsam nutzen' hier gelesen, kann aber nicht verstehen, was ich tun soll. Wo soll der folgende Code stehen?

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

Danke für Ihre Hilfe.

88
Ragnarsson

Dieses Ziel kann durch verschiedene Methoden erreicht werden,

1. BaseController verwenden

So, wie ich gerne Dinge einrichten möchte, erstelle ich eine BaseController-Klasse, die Laraves eigene Controller erweitert, und setze dort verschiedene globale Dinge ein. Alle anderen Controller erstrecken sich dann von BaseController und nicht von 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 Filter

Wenn Sie wissen, dass Sie für jede Anforderung in der gesamten Anwendung etwas für Ansichten eingerichtet haben möchten, können Sie dies auch über einen Filter tun, der vor der Anforderung ausgeführt wird. So verarbeite ich das Benutzerobjekt in Laravel.

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 einfaches Filteraufrufen auf.

Update gemäß Version 5. *

3. Middleware verwenden

View::share mit middleware verwenden

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



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

4. View Composer verwenden

View Composer hilft auch dabei, bestimmte Daten auf unterschiedliche Weise für die Anzeige zu binden. Sie können Variablen direkt an bestimmte Ansichten oder an alle Ansichten binden. Zum Beispiel können Sie ein eigenes Verzeichnis erstellen, um Ihre View-Composer-Datei je nach Anforderung zu speichern. und diese View-Composer-Datei über den Dienst bietet Interaktion mit View.

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

Sie könnten ein App\Http\ViewComposers-Verzeichnis erstellen. 

Dienstanbieter

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

Fügen Sie diesen Provider anschließend zu config/app.php im Abschnitt "provider" 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 kann nur für bestimmte Ansichten hilfreich sein. Wenn Sie ViewComposer jedoch für alle Ansichten auslösen möchten, müssen wir diese einzige Ä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 Erläuterung Laracast-Episode

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

161
Safoor Safdar

Sie können entweder einen eigenen service provider erstellen (ViewServiceProvider name ist üblich) oder Sie können die vorhandene AppServiceProvider verwenden.

Fügen Sie in Ihrem ausgewählten Provider Ihren Code in die Boot-Methode ein.

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

Dadurch wird eine $data-Variable in allen Ansichten verfügbar.

Wenn Sie die Fassade lieber als Helfer verwenden möchten, ändern Sie view()-> in View::. Vergessen Sie jedoch nicht, use View; oben in Ihrer Datei zu haben.

50
Marwelln

Ich fand das am einfachsten. Erstellen Sie einen neuen Anbieter, und verwenden Sie den '*'-Platzhalter, um ihn 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()
    {
        //
    }
}
8
Stan Smulders

Am besten teilen Sie die Variable mit View::share('var', $value);.

Probleme beim Erstellen mit "*":

Erwägen Sie den folgenden Ansatz:

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

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

Aus einer beispielhaften Blattsicht:

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

Was geschieht?

  • Die GlobalComposer-Klasse wird 1000 -Zeiten mit App::make instanziiert. 
  • Das Ereignis composing:some_partial_view_to_display_i wird 1000 mal behandelt.
  • Die compose-Funktion in der GlobalComposer-Klasse wird 1000-mal aufgerufen.

Die Teilansicht some_partial_view_to_display_i hat jedoch nichts mit den von GlobalComposer erstellten Variablen zu tun, erhöht jedoch die Renderzeit erheblich.

Beste Vorgehensweise?

Verwenden von 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());
  }
}

Update

Wenn Sie etwas verwenden, das über die Middleware-Pipeline berechnet wird, können Sie einfach listen auf das entsprechende Ereignis oder die View-Share-Middleware an den letzten Ende der Pipeline stellen.

4
Reza Shadman

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

  1. Suchen Sie im Stammverzeichnis Ihrer Anwendung nach dem Verzeichnis app\Providers und erstellen Sie die Datei ComposerServiceProvider.php. Kopieren Sie den darunterliegenden Text und fügen Sie ihn ein. 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 "Provider", und kopieren Sie dieses 'App\Providers\ComposerServiceProvider' in das Array.

Auf diese Weise haben wir den Composer Service Provider erstellt. Wenn Sie Ihre Anwendung mit dem View-Profil wie folgt ausführen: http: // yourdomain/something/profile, wird der Dienstanbieter ComposerServiceProvider aufgerufen, und die Klasse App\Http\ViewComposers\ProfileComposer ruft die Methode Composer aufgrund des nachstehenden Codes in der Boot-Methode oder -Funktion auf.

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. Wenn Sie Ihre Anwendung aktualisieren, wird eine Fehlermeldung angezeigt, da die Klasse App\Http\ViewComposers\ProfileComposer noch nicht vorhanden ist. Jetzt können wir es erstellen.

Wechseln Sie in den Verzeichnispfad app/Http

  • Erstellen Sie das Verzeichnis 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 in Ihre Ansicht oder in diesem Fall Profile.blade.php und fügen Sie hinzu

{{ $count }}

und die Anzahl der Benutzer wird auf der Profilseite angezeigt. 

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'
);
3

In der Dokumentation:

Normalerweise würden Sie innerhalb eines Dienstes Aufrufe an die Share-Methode stellen Providers Boot-Methode. Sie können sie zur .__ hinzufügen. AppServiceProvider oder generieren Sie einen separaten Dienstanbieter für das Haus Sie.

Ich bin mit Marwelln einverstanden, setzen Sie es einfach in 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 Konfessionen oder Fehler mit anderen, nicht globalen Variablen zu vermeiden.

In Ihrem config-Ordner können Sie eine PHP-Datei mit dem Namen "variable.php" mit folgendem Inhalt erstellen:

<?php return [ 'versionNumber' => '122231', ];

In allen Ansichten können Sie nun config('variable.versionNumber') verwenden, um diese Variable aufzurufen.

1
Mehran

Ich denke, der beste Weg ist mit View Composers. Wenn jemand hierher gekommen ist und wissen möchte, wie das mit View Composers möglich ist, lesen Sie meine Antwort => Wie kann ich eine Variable für alle Ansichten freigeben?

Die Dokumentation ist zu hören https://laravel.com/docs/5.4/views#view-composers , aber ich werde es aufspalten 1.Suchen Sie das Verzeichnis Providers in Ihrem Stammverzeichnis und erstellen Sie den für ComposerServiceProvider .php mit Inhalt

1

Laravel 5.6 Methode: https://laravel.com/docs/5.6/views#passing-data-to-views

Beispiel, wenn eine Modellsammlung für alle Ansichten freigegeben wird (AppServiceProvider.php):

use Illuminate\Support\Facades\View;
use App\Product;

public function boot()
{
    $products = Product::all();
    View::share('products', $products);

}
0
Alexander Kim