Laravel 5 - глобальная переменная вида Блейда, доступная во всех шаблонах

Laravel 5 - глобальная переменная вида Блейда, доступная во всех шаблонах

18.04.2015 01:06:40 Просмотров 91 Источник

Как я могу в Laravel 5 сделать глобальную переменную, которая будет доступна во всех шаблонах Блейда?

У вопроса есть решение - Посмотреть?

Ответы - Laravel 5 - глобальная переменная вида Блейда, доступная во всех шаблонах / Laravel 5 - global Blade view variable available in all templates

ArjanSchouten

18.04.2015 01:43:22

Вы можете сделать это с помощью view composers . Композиторы представлений выполняются при загрузке шаблона. Вы можете передать закрытие с дополнительной функциональностью для этого представления. С помощью view composers вы можете использовать подстановочные знаки. Чтобы сделать вид композитор для каждого вида просто использовать *.

View::composer('*', function($view)
{
    $view->with('variable','Test value');
});

Вы также можете сделать это без закрытия, как вы можете видеть в документах.

View::composer('*', 'App\Http\ViewComposers\ProfileComposer');

Профиль класса композитор должен сочинять способ.

Композиторы представлений выполняются при визуализации представления. Laravel также имеет вид создателей. Они выполняются при создании экземпляра представления.

Вы можете также выбрать, чтобы использовать BaseController с setupLayout способ. Затем каждое представление, которое вы будете загружать, загружается через метод setupLayout, который добавляет некоторые дополнительные данные. Однако, используя view composers, вы почти уверены, что код выполнен. Но с подходом BaseController у вас больше гибкости, потому что вы можете пропустить загрузку дополнительных данных.

Редактировать: как отметил Ник Гутьеррес можно также использовать представление акцию.

https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716158#comment59171418_29716158
Разница между этим и view()->shareзаключается в том, что это выполняется только при использовании представления, но с view()->shareон выполняется независимо от того, что-вы можете возвращать некоторый JSON в вызове API, например, который не использует представление.
Nic Gutierrez

18.04.2015 01:44:47

Создайте нового поставщика услуг, как предлагается здесь

Добавьте нового поставщика услуг в файл конфигурации (config / app.РНР.)

В методе загрузки вашего нового поставщика услуг используйте:

View::share( 'something_cool', 'this is a cool shared variable' );

Теперь вы готовы использовать $something_cool во всех ваших взглядов.

Надеюсь, это поможет.

https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716175#comment60265196_29716175
кроме того, это окончательное решение для переменных, используемых в нескольких случаях на странице 503 после artisan down. Ввод строки версии приложения в качестве параметра Cache buster или ее отображение в нижнем колонтитуле во время обновления является рутиной с другими решениями. (использование переменной env для этого, вероятно, было бы самым чистым решением, хотя)
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716175#comment65194718_29716175
это лучшее решение, чем утвержденный ответ
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716175#comment65546698_29716175
Я думаю, что основное различие заключается в том, что пользователь спрашивает, как иметь глобальную переменную, доступную во всех шаблонах. С принятым решением пользователю нужно помнить, чтобы расширить BaseController и вызвать parent:: construct, а с решением ViewComposer ему нужно вызвать View:: composers в каждом методе построения контроллера, чтобы сделать переменные доступными.
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716175#comment67818299_29716175
Это должно быть выбрано в качестве ответа!
Является ответом!
Emeka Mbah

18.04.2015 01:46:09

Вариант 1:

Вы можете использовать view::share()вот так:

<?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');
    }

}

Вариант 2: Использование композитора:

  1. Создайте файл composer в app\Composers\HomeComposer.php

NB: создайте app\Composers, если оно не существует

<?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');
    }
}

Затем вы можете прикрепить композитор к любому представлению, сделав это

<?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');
    }

}

Вариант 3: Добавить композитора к поставщику услуг, в Laravel 5 я предпочитаю иметь мой композитор в App\Providers\ViewServiceProvider

  1. Создайте файл composer в app\Composers\HomeComposer.php

  2. Добавить HomeComposer в приложение \ Providers\ViewServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;
use App\Composers\HomeComposer;
use Illuminate\Support\Facades\Blade;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
 *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //add to all views
        view()->composer('*', HomeComposer::class);
        //add to only home view 
        //view()->composer('home', HomeComposer::class);
    }
}
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716181#comment52504314_29716181
Ваш ответ действительно помог мне с вариантом 1, хотя что делать, если вы пытаетесь получить доступ $user = Auth::user();и передать переменную $user всем шаблонам Блейда, включая заголовок и часть содержимого? Я попробовал это, поместив переменную $user в BaseController, а затем поделившись ею, но если я var_dump $user, я получаю кучу защищенных значений в массиве. В основном я хочу иметь доступ ко всем пользовательским переменным auth во всем приложении во всех шаблонах и представлениях. Кажется простым, но потратили часы, пытаясь понять это.
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716181#comment52504509_29716181
На самом деле это сработало: <?= $user['name']; ?>но это не сработало: {{ $user->name }}
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716181#comment52620062_29716181
@Чад Придл это должно работать для массива {{ $user['name'] }} в то время как это работает для объекта {{ $user->name }}
https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/29716181#comment96901026_29716181
Для варианта 1 я получаю: Class 'App\Http\Controllers\View' not found
Jeff

18.04.2015 06:07:47

вы можете прошить его в сессии, вы можете определить его в .env файл (статические vars)

sha-1

09.04.2016 05:58:58

Поиск решения той же проблемы и нашел лучшее решение в документации Laravel. Просто используйте View::shareв AppServiceProviderкак это:

View::share('key', 'value');

Подробности здесь.

https://stackoverflow.com/questions/29715813/laravel-5-global-blade-view-variable-available-in-all-templates/36518494#comment102950032_36518494
Не работает авт::пользователь() - в таком состоянии он был нулевым, однако место выбрано правильно, мне просто нужно добавить его через Composer View::composer('*', function($view) { $view->with('current_user', Auth::user()); } вместо доли.
Jodeveloper8

10.10.2016 04:34:14

Кроме того, вы можете сделать это в Route.php-файл:

view()->share('variableName', $variable);
Arshad Jilani

25.02.2019 02:28:39

Вы можете добавить в Controller.php-файл:

use App\Category;

И затем:

class Controller extends BaseController {
     public function __construct() {
        $categories = Category::All();
        \View::share('categories', $categories);
     }
}
Ehab Elzeny

13.03.2019 01:02:51

и вы можете дать массив не только View::share('key', 'value'); можно поставить такие, как View::share(['key'=>'value','key'=>'value'])

Gabi Dj

18.07.2019 04:16:50

Я бы предпочел использовать промежуточное ПО с view()

php artisan make:middleware GlobalTimeConfigданные, которые вы хотите поделиться

share()

Регистрация вновь созданного промежуточного программного обеспечения

Добавьте промежуточное программное обеспечение в группу маршрутов промежуточного программного обеспечения, как показано в примере ниже

/приложение/и HTTP/ядра.РНР

 <?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);
        }
    }

Доступ к данным из шаблонов

Доступ к данным из любого шаблона с заданным ключом в вызове метода View:: share()

напр..:

    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',
        ],
    ];

Править: Ответ поставщика услуг Nic Gutierrez может быть лучшим (или лучшим) решением.

Закрыть X