Je souhaite que certaines données par défaut soient accessibles dans toutes les vues de mon application Laravel 5.
J'ai essayé de chercher, mais je n'ai trouvé que des résultats pour Laravel 4. J'ai lu la documentation 'Partage de données avec toutes les vues' ici mais je ne comprends pas quoi faire. Où faut-il placer le code suivant?
View::share('data', [1, 2, 3]);
Merci de votre aide.
Cet objectif peut être atteint par différentes méthodes,
1. Utilisation de BaseController
Si j’aime organiser les choses, je crée une classe BaseController
qui étend la propre variable Controller
de Laravel et y installe diverses choses globales. Tous les autres contrôleurs s’étendent alors de BaseController
plutôt que de Laravel’s 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. Utilisation du filtre
Si vous savez avec certitude que vous souhaitez que quelque chose soit configuré pour afficher des vues sur chaque demande dans l'ensemble de l'application, vous pouvez également le faire via un filtre qui s'exécute avant la demande. C'est ainsi que je traite l'objet User dans Laravel.
App::before(function($request)
{
// Set up global user object for views
View::share('user', User::all());
});
OU
Vous pouvez définir votre propre filtre
Route::filter('user-filter', function() {
View::share('user', User::all());
});
et appelez-le via un filtre simple.
Mise à jour selon la version 5. *
3. Utilisation de middleware
Utiliser le View::share
avec middleware
Route::group(['middleware' => 'SomeMiddleware'], function(){
// routes
});
class SomeMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
4. Utilisation de View Composer
View Composer aide également à lier des données spécifiques pour les afficher de différentes manières. Vous pouvez directement lier une variable à une vue spécifique ou à toutes les vues. Par exemple, vous pouvez créer votre propre répertoire pour stocker votre fichier de compositeur de vues en fonction des besoins. et ceux-ci visualisent le fichier du compositeur via le service fournissent une interaction avec la vue.
La méthode View Composer peut utiliser différentes méthodes. Le premier exemple peut se ressembler:
Vous pouvez créer un répertoire App\Http\ViewComposers
.
Fournisseur de services
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
}
}
Après cela, ajoutez ce fournisseur à config/app.php sous la section "fournisseurs".
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}}
Cette méthode pourrait aider uniquement pour une vue spécifique. Mais si vous souhaitez déclencher ViewComposer sur toutes les vues, nous devons appliquer cette modification unique à ServiceProvider.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
public function boot() {
view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
}
}
Référence
Pour plus de précisions Épisode Laracast
Si encore quelque chose d'incertain de mon côté, faites le moi savoir.
Vous pouvez créer votre propre fournisseur de service } _ (le nom ViewServiceProvider
est commun) ou vous pouvez utiliser la AppServiceProvider
existante.
Dans votre fournisseur sélectionné, insérez votre code dans la méthode de démarrage.
public function boot() {
view()->share('data', [1, 2, 3]);
}
Cela rendra une variable $data
accessible dans toutes vos vues.
Si vous préférez utiliser la façade à la place de l'assistant, remplacez view()->
par View::
, mais n'oubliez pas de placer use View;
en haut de votre fichier.
J'ai trouvé que c'était le plus facile. Créez un nouveau fournisseur et utilisez le caractère générique '*'
pour l'attacher à toutes les vues. Fonctionne aussi en 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()
{
//
}
}
Le meilleur moyen serait de partager la variable en utilisant View::share('var', $value);
Problèmes de composition avec "*"
:
Envisagez l'approche suivante:
<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);
$viewFacrory->compose('*', GlobalComposer::class);
À partir d'un exemple de vue de lame:
@for($i = 0; $i<1000; $i++)
@include('some_partial_view_to_display_i', ['toDisplay' => $i])
@endfor
Ce qui se produit?
GlobalComposer
est instanciée 1000 fois à l'aide de App::make
. composing:some_partial_view_to_display_i
est géré 1000 fois.compose
de la classe GlobalComposer
est appelée 1000 fois.Mais la vue partielle some_partial_view_to_display_i
n'a rien à voir avec les variables composées par GlobalComposer
mais augmente considérablement le temps de rendu.
_ {Meilleure approche?} _
Utiliser View::share
avec un middleware groupé.
Route::group(['middleware' => 'WebMiddleware'], function(){
// Web routes
});
Route::group(['prefix' => 'api'], function (){
});
class WebMiddleware {
public function handle($request)
{
\View::share('user', auth()->user());
}
}
Mettre à jour
Si vous utilisez quelque chose qui est calculé sur le pipeline de middleware, vous pouvez simplement écouter accéder au événement approprié ou placer le middleware de partage de vues au dernier bas du pipeline.
La documentation est entendue https://laravel.com/docs/5.4/views#view-composers mais je vais la décomposer
Recherchez le répertoire app\Providers dans le répertoire racine de votre application, créez le fichier ComposerServiceProvider.php, copiez-collez-y le texte ci-dessous et enregistrez-le.
<?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()
{
//
}
}
À la racine de votre application, ouvrez Config/app.php et recherchez la section Fournisseurs dans le fichier, puis copiez-la et collez-la 'App\Providers\ComposerServiceProvider', du tableau.
Ce faisant, nous avons créé le fournisseur de services Composer. Lorsque vous exécutez votre application avec la vue Profil comme suit http: // votre domaine/quelque chose/votre profil, le fournisseur de services ComposerServiceProvider est appelé et la classe App\Http\ViewComposers\ProfileComposer est instancié en appelant la méthode Composer en raison du code ci-dessous contenu dans la méthode ou la fonction de démarrage.
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
Accédez au chemin du répertoire app/Http
Créez le répertoire appelé ViewComposers
Créez le fichier 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());
}
}
Maintenant, allez à votre vue ou dans ce cas Profile.blade.php et ajoutez
{{ $count }}
et cela montrera le nombre d'utilisateurs sur la page de profil.
Pour afficher le nombre sur toutes les pages changer
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
À
// Using class based composers...
View::composer(
'*', 'App\Http\ViewComposers\ProfileComposer'
);
Dans la documentation:
Généralement, vous appelez la méthode de partage dans un service méthode de démarrage du fournisseur. Vous êtes libre de les ajouter au AppServiceProvider ou générer un fournisseur de service distinct pour héberger leur.
Je suis d'accord avec Marwelln, il suffit de le mettre dans AppServiceProvider
dans la fonction de démarrage:
public function boot() {
View::share('youVarName', [1, 2, 3]);
}
Je recommande d'utiliser un nom spécifique pour la variable afin d'éviter toute confusion ou erreur avec d'autres variables non "globales".
Dans votre dossier de configuration, vous pouvez créer un fichier php en le nommant par exemple "variable.php" avec le contenu ci-dessous:
<?php
return [
'versionNumber' => '122231',
];
Maintenant, dans toutes les vues, vous pouvez utiliser config('variable.versionNumber')
pour appeler cette variable.
Je pense que la meilleure façon est avec View Composers
. Si quelqu'un est venu ici et veut savoir comment faire avec View Composers, lisez ma réponse => Comment partager une variable entre toutes les vues?
La documentation est entendue https://laravel.com/docs/5.4/views#view-composers mais je vais la décomposer 1. Recherchez le répertoire Providers dans votre répertoire racine et créez le pour ComposerServiceProvider .php avec contenu
Méthode Laravel 5.6: https://laravel.com/docs/5.6/views#passing-data-to-views
Exemple, avec le partage d'une collection de modèles avec toutes les vues (AppServiceProvider.php):
use Illuminate\Support\Facades\View;
use App\Product;
public function boot()
{
$products = Product::all();
View::share('products', $products);
}