Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вариант 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: Используйте композитор:

  • Создайте файл-композитор в 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');
    }

}

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Класс композитора профиля должен иметь метод компоновки.

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

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

EDIT: Как упоминалось Ником Гутьерресом, вы также можете использовать общий доступ к просмотру.

Ответ 5

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

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

Ответ 6

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

Ответ 8

Я бы предпочел использовать промежуточное программное обеспечение с помощником фасада view(). (Laravel 5.x)

Промежуточное программное обеспечение проще в обслуживании и не создает путаницы в дереве классов контроллеров.

меры

Создайте промежуточное ПО

/app/Http/Middleware/TimezoneReset.php

Для создания промежуточного программного обеспечения вы можете запустить php artisan make:middleware GlobalTimeConfig

share() данными, которые вам нужны

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

Зарегистрировать недавно созданное промежуточное ПО

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

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

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

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

например.:

    Company timezone: {{ $time_settings['company_timezone'] }}

РЕДАКТИРОВАТЬ: Ответ Nic Gutierrez Service Provider может быть лучшим (или лучшим) решением.

Ответ 9

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

use App\Category;

А потом:

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

Ответ 10

вы можете запустить его в сеанс, вы можете определить его в файле .env(static vars)