Передача параметров во все вьюшки в Laravel
Доброго времени суток. В данной статье мы рассмотрим, как в Laravel передать значение во все вьюшки. Например, у нас есть таблица с настройками нашего сайта settings. И в этой таблице хранится название нашего сайта site_name. Наша задача состоит в том, чтобы передать значение site_name во все вьюшки нашего сайта.
И так у меня установлен Laravel 5.5.3
Создание миграции в Laravel.
Давайте сгенерируем миграцию CreateSettingsTable, которая будет создавать таблицу settings.
Для этого в консоли вводим следующую команду:
php artisan make:migration CreateSettingsTable --create=settings
Теперь откроем данную миграцию и в метод up добавим следующий код:
Schema::create('settings', function (Blueprint $table) { $table->increments('id'); $table->string('key',100); $table->text('value'); $table->timestamps(); });
Запустим миграцию:
php artisan migrate
Будут созданы три таблицы: users, password_resets (эти таблицы нас не интересуют) и наша таблица settings с полями id, key, value, crated_at, updated_at.
Создание модели и контроллера в Laravel
Теперь давайте создадим модель Setting для работы с таблице settings. Для этого выполним команду в консоли:
php artisan make:model Setting -c
Обратите внимание на параметр –c – это означает, что будет создан и контроллер SettingController.
Модель можно не трогать, а вот в котроллер SettingController добавим несколько методов:
public function index1() { return view('index1'); } public function index2() { return view('index2'); } public function index3() { return view('index3'); }
Мы добавили три метода index1, index2 и index3. Каждый из этих методов вызывает соответствующую вьюшку. Давайте создадим три вьюшки: index1.blade.php, index2.blade.php и index3.blade.php. И во вьюшку index1 поместим простой текст index1, во вьюшку index2 – текст index2 и в index3 – index3.
Создание маршрутов
Теперь давайте создадим три маршрута. Открываем файл routers/web.php и добавляем в конец следующий код:
Route::get('/index1','SettingController@index1'); Route::get('/index2','SettingController@index2'); Route::get('/index3','SettingController@index3');
Давайте проверим, перейдем по ссылке <домен>/index1 должна открыться страница с index1. Отлично.
Передача параметра всем вьюшкам
Давайте добавим в нашу таблицу settings добавим строку: key = site_name, а value = TEST.
Создадим сервис провайдер ViewServiceProvider. Для этого в консоли выполним следующую команду:
php artisan make:provider ViewServiceProvider
Откроем наш только, что созданный сервис провайдер и добавим в него следующий код:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Setting; class ViewServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { view()->share('site_name', Setting::where('key','site_name')->first()->value ); } /** * Register the application services. * * @return void */ public function register() { // } }
Теперь давайте подключим наш сервис провайдер. Для этого в файл config/app.php в ‘providers’ добавим:
'providers' => [ /* * Laravel Framework Service Providers... */ … App\Providers\ViewServiceProvider::class …
Ну все. Теперь в представлениях мы можем использовать:
{{ $site_name }}
Давайте изменим наши вьюшки и перед текстом добавим {{ $site_name }}.
Проверяем, переходим <домен>/index1
Отлично. Все работает.
Заключение.
Мы с вами создали миграцию. Затем запустили ее. Тем самым создали таблицу settings. Дальше с помощью одной команды artisan мы создали модель и контроллер. В контроллер добавили несколько методов. Потом мы создали сервис провайдер, в метод boot, которого добавили:
view()->share('site_name', Setting::where('key','site_name')->first()->value );
Тем самым передали во все вьюшки переменную site_name, в которую поместили значение из нашей таблицы.
Но бывают ситуации, когда нужно параметр передать в одну вьюшку, тогда в метод boot помещаем следующий код:
view()->composer ('index1', function ($view) { $view->with('site_name', 'Ваше имя'); });
В этом случае во вьюшку index1.blade.php будет передана переменная site_name, значение которой равно ‘Ваше имя’.