Передача данных для всех просмотров в Laravel [duplicate]

Посмотрите на этот пример:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope,$http) {

    var getJoke = function(){
        return $http.get('http://api.icndb.com/jokes/random').then(function(res){
            return res.data.value;  
        });
    }

    getJoke().then(function(res) {
        console.log(res.joke);
    });
});

Как вы можете видеть, getJoke возвращает разрешенное обещание (оно разрешено при возврате res.data.value). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).

Это plnkr:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

69
задан Ragnarsson 19 February 2015 в 15:11
поделиться

11 ответов

Эта цель может достигаться с помощью другого метода

1. Использование BaseController

Как мне нравится настраивать вещи, я делаю класс BaseController, который расширяет собственный [L9] Laravel и настраивает там различные глобальные вещи. Все остальные контроллеры затем расширяются от BaseController, а не контроллера Laravel.

class BaseController extends Controller
{
  public function __construct()
  {
    //its just a dummy data object.
    $user = User::all();

    // Sharing is caring
    View::share('user', $user);
  }
}

2. Использование фильтра

Если вам известно, что вы хотите, чтобы что-то настроенное для просмотров по каждому запросу по всему приложению, вы также можете сделать это через фильтр, который выполняется перед запросом - вот как я занимаюсь с объектом User в Laravel.

App::before(function($request)
{
  // Set up global user object for views
  View::share('user', User::all());
});

OR

Вы можете определить свой собственный фильтр

Route::filter('user-filter', function() {
    View::share('user', User::all());
});

и вызвать его посредством простого вызова фильтра.

Обновление по версии 5. *

3. Использование Composer View Composer

View Composer также позволяет связать определенные данные для просмотра по-разному. Вы можете напрямую привязать переменную к определенному виду или ко всем представлениям. Например, вы можете создать свой собственный каталог для хранения файла композитора вида в соответствии с требованием. и этот файл композиционного представления через службу обеспечивает взаимодействие с представлением.

Просмотр метода композитора может использоваться по-разному. Первый пример может выглядеть одинаково:

Вы можете создать каталог App\Http\ViewComposers.

Поставщик услуг

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer("ViewName","App\Http\ViewComposers\TestViewComposer");
    }
}

После этого добавьте этого провайдера в config / app.php в разделе «Поставщики».

TestViewComposer

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class TestViewComposer {

    public function compose(View $view) {
        $view->with('ViewComposerTestVariable', "Calling with View Composer Provider");
    }
}

ViewName.blade.php

Here you are... {{$ViewComposerTestVariable}}

Этот метод может помочь только для определенного вида. Но если вы хотите вызвать ViewComposer для всех представлений, мы должны применить это единственное изменение к ServiceProvider.

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider {
    public function boot() {
        view()->composer('*',"App\Http\ViewComposers\TestViewComposer");
    }
}

Ссылка

Документация Laravel

Для дальнейшего уточнения Laracast Episode

Если еще что-то неясно с моей стороны, дайте мне знать.

133
ответ дан Arash Hatami 28 August 2018 в 05:19
поделиться

Метод Laravel 5.6: https://laravel.com/docs/5.6/views#passing-data-to-views

Пример: совместное использование коллекции моделей для все представления (AppServiceProvider.php):

use Illuminate\Support\Facades\View;
use App\Product;

public function boot()
{
    $products = Product::all));
    View::share('products', $products);

}
0
ответ дан Alexander Kim 28 August 2018 в 05:19
поделиться

Я думаю, что лучший способ - с View Composers. Если кто-то пришел сюда и захочет найти способ сделать это с помощью View Composers, прочитайте мой ответ => Как поделиться переменной во всех представлениях?

0
ответ дан Community 28 August 2018 в 05:19
поделиться

Вы можете создать собственный поставщик услуг (ViewServiceProvider), или вы можете использовать существующие AppServiceProvider.

В выбранном вами провайдере кода в методе загрузки.

public function boot() {
    view()->share('data', [1, 2, 3]);
}

Это сделает доступной переменную $data во всех ваших представлениях.

Если вы предпочитаете использовать фасад вместо хелпер, измените view()-> на View::, но не забывайте, что use View; находится в верхней части вашего файла.

47
ответ дан Marwelln 28 August 2018 в 05:19
поделиться

В вашей папке config вы можете создать имя файла php, например, «variable.php» с содержимым ниже:

<?php return [ 'versionNumber' => '122231', ];

Теперь во всех представлениях вы можете используйте config('variable.versionNumber') для вызова этой переменной.

0
ответ дан Mehran 28 August 2018 в 05:19
поделиться

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

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('signedIn', \Auth::check());

     View::share('user', \Auth::user());
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
0
ответ дан NAK.dev 28 August 2018 в 05:19
поделиться

Наилучшим способом было бы использовать переменную с помощью View::share('var', $value);

Проблемы с составлением с использованием "*":

Рассмотрим следующий подход:

<?php
// from AppServiceProvider::boot()
$viewFactory = $this->app->make(Factory::class);

$viewFacrory->compose('*', GlobalComposer::class);

Из примера просмотра лезвия:

  @for($i = 0; $i<1000; $i++)
    @include('some_partial_view_to_display_i', ['toDisplay' => $i])
  @endfor

Что происходит?

  • Класс GlobalComposer создается экземпляром 1000 с использованием App::make ,
  • Событие composing:some_partial_view_to_display_i обрабатывается 1000 раз.
  • Функция compose внутри класса GlobalComposer называется 1000 раз.

Но частичный вид some_partial_view_to_display_i не имеет ничего общего с переменными, составленными GlobalComposer, но значительно увеличивает время рендеринга.

Лучший подход?

Использование View::share вдоль сгруппированного промежуточного программного обеспечения.

Route::group(['middleware' => 'WebMiddleware'], function(){
  // Web routes
});

Route::group(['prefix' => 'api'], function (){

});

class WebMiddleware {
  public function handle($request)
  {
    \View::share('user', auth()->user());
  }
}

Обновить

Если вы используете что-то, что вычисляется по конвейеру промежуточного программного обеспечения, вы можете просто прослушать соответствующее событие или поставить просмотрите промежуточное ПО промежуточного слоя на последней нижней части конвейера.

2
ответ дан Reza Shadman 28 August 2018 в 05:19
поделиться

Документация слышится https://laravel.com/docs/5.4/views#view-composers , но я сломаю ее 1. Посмотрите на каталог Провайдеры в корневом каталоге и создайте для ComposerServiceProvider.php с контентом

2
ответ дан Samuel Kwame Antwi 28 August 2018 в 05:19
поделиться
1
ответ дан Santiago Mendoza Ramirez 28 August 2018 в 05:19
поделиться

Я нашел это самым простым. Создайте нового поставщика и пользователя подстановочный знак '*', чтобы прикрепить его ко всем представлениям. Работает также в 5.3: -)

<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     * @return void
     */
    public function boot()
    {
        view()->composer('*', function ($view)
        {
            $user = request()->user();

            $view->with('user', $user);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
7
ответ дан Stan Smulders 28 August 2018 в 05:19
поделиться

Документация слышится https://laravel.com/docs/5.4/views#view-composers , но я сломаю ее

  1. Ищите directory app \ Providers в корневой папке вашего приложения и создайте файл ComposerServiceProvider.php и скопируйте и пропустите текст ниже и сохраните его.
    <?php
        namespace App\Providers;
        use Illuminate\Support\Facades\View;
        use Illuminate\Support\ServiceProvider;
    
        class ComposerServiceProvider extends ServiceProvider
        {
            /**
            * Register bindings in the container.
            *
            * @return void
            */
        public function boot()
        {
            // Using class based composers...
            View::composer(
                'profile', 'App\Http\ViewComposers\ProfileComposer'
            );
    
            // Using Closure based composers...
            View::composer('dashboard', function ($view) {
                //
            });
        }
    
        /**
        * Register the service provider.
        *
        * @return void
        */
        public function register()
        {
            //
        }
    }
    
  2. В корне вашего приложения откройте Config / app.php и найдите раздел «Провайдеры» в файле и скопируйте и пройдите мимо этого «App \ Providers \ ComposerServiceProvider», в массив.

Сделав это, мы создали Поставщика услуг Composer. Когда вы запускаете приложение с профилем вида так, как http: // yourdomain / something / profile , вызывается поставщик услуг ComposerServiceProvider и класс App \ Http \ ViewComposers \ ProfileComposer создается при вызове метода Composer из-за кода ниже внутри метода загрузки или функции.

 // Using class based composers...
 View::composer(
   'profile', 'App\Http\ViewComposers\ProfileComposer'
 );
  1. Если вы обновите приложение, вы получите сообщение об ошибке, потому что класс App \ Http \ ViewComposers \ ProfileComposer еще не существует. Теперь давайте его создадим.

Перейти к файлу пути к каталогу / Http

  • Создать каталог под названием ViewComposers
  • Создайте файл ProfileComposer.php.
    class ProfileComposer
    {
        /**
        * The user repository implementation.
        *
        * @var UserRepository
        */
        protected $users;
    
        /**
        * Create a new profile composer.
        *
        * @param  UserRepository  $users
        * @return void
        */
        public function __construct(UserRepository $users)
        {
            // Dependencies automatically resolved by service container...
            $this->users = $users;
        }
    
        /**
        * Bind data to the view.
        *
        * @param  View  $view
        * @return void
        */
        public function compose(View $view)
        {
            $view->with('count', $this->users->count());
        }
    }
    

Теперь перейдите к вашему представлению или в этом случае Profile.blade.php и добавьте

{{ $count }}

, и это покажет количество пользователей на страница профиля.

Чтобы показать счет на всех страницах, измените

// Using class based composers...
View::composer(
    'profile', 'App\Http\ViewComposers\ProfileComposer'
);

На

// Using class based composers...
View::composer(
    '*', 'App\Http\ViewComposers\ProfileComposer'
);
2
ответ дан Samuel Kwame Antwi 28 August 2018 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: