2015-04-18 3 views

ответ

60

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

} 
+1

Ваш ответ действительно помог мне с вариантом 1, хотя, если вы пытаетесь получить доступ к '$ user = Auth :: user();' и передаете переменную $ user ко всем шаблонам blade-серверов, включая заголовок и часть содержимого ? Я попробовал это, поместив переменную $ user в BaseController и затем разделив ее, но если я var_dump $ user, я получаю кучу защищенных значений в массиве. В основном я хочу иметь доступ ко всем пользовательским переменным пользователя во всем приложении во всех шаблонах и представлениях. Кажется простым, но потратили часы, пытаясь понять это. –

+1

На самом деле это сработало: ' ', но это не сработало:' {{$ user-> name}} ' –

+0

@Chad Priddle Это должно работать для массива' {{$ user ['name']}} ', пока это работает для объекта '{{$ user-> name}}' – Digitlimit

6

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

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

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

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

Профайл композитора должен иметь метод компоновки.

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

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

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

+0

Разница между этим и 'вид() -> share' заключается в том, что это выполняется только при использовании представления, но с 'view() -> share' он запускается независимо от того, что вы могли бы возвращать некоторый JSON в вызове API, например, который не использует представление , – Petecoop

14

Create a new Service Provider as suggested in here

Добавить новый Service Provider в файл конфигурации (конфигурации/app.php).

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

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

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

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

+0

plus, это окончательное решение для ** переменных, используемых в нескольких случаях на странице 503 после 'artisan down'. ** Ввод строки версии приложения в качестве параметра кэширования шины или ее отображение в нижнем колонтитуле, в то время как обновление - это работа с другими решениями , (используя переменную env для этого, вероятно, было бы самым чистым решением, хотя) – luchaos

+0

это лучшее решение, чем утвержденный ответ – Christophvh

+0

Я думаю, что основное отличие заключается в том, что пользователь спрашивает, как иметь * глобальную переменную, доступную во всех шаблонах , С принятым решением пользователь должен помнить о расширении BaseController и вызове parent :: construct, а с решением ViewComposer ему нужно вызвать View :: composers в каждом методе построения контроллера, чтобы сделать переменные доступными. –

-6

вы можете прошить его в сессии, вы можете определите его в.env file (static vars)

8

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

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

Подробности here.

1

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

view()->share('variableName', $variable); 
Смежные вопросы