Comment puis-je entrer Laravel 5 créer une variable globale qui sera disponible dans tous les modèles de lames?
Option 1:
Vous pouvez utiliser view::share()
comme ceci:
<?php namespace App\Http\Controllers;
use View;
//You can create a BaseController:
class BaseController extends Controller {
public $variable1 = "I am Data";
public function __construct() {
$variable2 = "I am Data 2";
View::share ( 'variable1', $this->variable1 );
View::share ( 'variable2', $variable2 );
View::share ( 'variable3', 'I am Data 3' );
View::share ( 'variable4', ['name'=>'Franky','address'=>'Mars'] );
}
}
class HomeController extends BaseController {
//if you have a constructor in other controllers you need call constructor of parent controller (i.e. BaseController) like so:
public function __construct(){
parent::__construct();
}
public function Index(){
//All variable will be available in views
return view('home');
}
}
Option 2: Utilisez un compositeur:
app\Composers\HomeComposer.php
NB: créer app\Composers
s'il n'existe pas
<?php namespace App\Composers;
class HomeComposer
{
public function compose($view)
{
//Add your variables
$view->with('variable1', 'I am Data')
->with('variable2', 'I am Data 2');
}
}
Ensuite, vous pouvez attacher le composer à n'importe quelle vue en faisant cela)
<?php namespace App\Http\Controllers;
use View;
class HomeController extends Controller{
public function __construct(){
View::composers([
'App\Composers\HomeComposer' => ['home'] //attaches HomeComposer to home.blade.php
]);
}
public function Index(){
return view('home');
}
}
Créer un nouveau fournisseur de service comme suggéré ici
Ajoutez votre nouveau fournisseur de services au fichier de configuration (config/app.php).
Dans la méthode de démarrage de votre nouvelle utilisation du fournisseur de service:
View::share( 'something_cool', 'this is a cool shared variable' );
Vous êtes maintenant prêt à utiliser $ quelque chose_cool dans toutes vos vues.
J'espère que cela t'aides.
Rechercher la solution du même problème et trouver la meilleure solution dans la documentation de Laravel. Utilisez simplement View::share
dans AppServiceProvider
comme ceci:
View::share('key', 'value');
Détails ici .
Vous pouvez le faire avec view composers . Les compositeurs View sont exécutés lorsqu'un modèle est chargé. Vous pouvez transmettre une fermeture avec des fonctionnalités supplémentaires pour cette vue. Avec les compositeurs de vue, vous pouvez utiliser des caractères génériques. Pour créer une vue composer pour chaque vue, utilisez simplement un *
.
View::composer('*', function($view)
{
$view->with('variable','Test value');
});
Vous pouvez également le faire sans fermeture, comme vous pouvez le voir dans la documentation.
View::composer('*', 'App\Http\ViewComposers\ProfileComposer');
Le profil composer) doit avoir une méthode de composition.
Les compositeurs de vue sont exécutés lorsqu'une vue est rendue. Laravel inclut également des créateurs de vues. Celles-ci sont exécutées lorsqu'une vue est instanciée.
Vous pouvez également choisir d'utiliser BaseController
avec une méthode setupLayout. Chaque vue que vous allez charger est ensuite chargée via la méthode setupLayout, qui ajoute des données supplémentaires. Cependant, en utilisant des compositeurs de vue, vous êtes à peu près sûr que le code est exécuté. Mais avec l'approche BaseController, vous avez plus de flexibilité car vous pouvez ignorer le chargement des données supplémentaires.
EDIT: Comme mentionné par Nic Gutierrez, vous pouvez également utiliser le partage de vue.
En outre, vous pouvez le faire dans le Route.php
fichier:
view()->share('variableName', $variable);
Je préférerais utiliser un middleware avec l'aide de façade view()
. (Laravel 5.x)
Le middleware est plus facile à gérer et ne crée pas de désordre dans l’arborescence des classes des contrôleurs.
/app/Http/Middleware/TimezoneReset.php
Pour créer un middleware, vous pouvez exécuter php artisan make:middleware GlobalTimeConfig
share()
les données dont vous avez besoin d'être partagées
<?php
namespace App\Http\Middleware;
use Closure;
class GlobalTimeConfig
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$time_settings = [
'company_timezone' => 'UTC',
'company_date_format' => 'Y-m-d H:i:s',
'display_time' => true,
];
view()->share('time_settings', $time_settings);
return $next($request);
}
}
Ajoutez le middleware à votre groupe de routes de middleware selon l'exemple ci-dessous
/app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\GlobalTimeConfig::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
Accédez aux données de n'importe quel modèle avec la clé donnée dans l'appel de méthode View :: share ()
par exemple.:
Company timezone: {{ $time_settings['company_timezone'] }}
EDIT : La réponse du fournisseur de services de Nic Gutierrez pourrait être une meilleure (ou la meilleure) solution.
et vous pouvez donner tableau non seulement View::share('key', 'value');
peut mettre un tableau comme View::share(['key'=>'value','key'=>'value'])