Как я могу в Laravel 5 создать глобальную переменную, которая будет доступна во всех шаблонах Blade?
Laravel 5 - глобальная переменная вида Blade, доступная во всех шаблонах
Ответ 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'])
Ответ 7
Вы можете получить ясную идею, пройдя официальную документацию Laravel.
Ответ 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)