Controller для переиспользуемого шаблона laravel
Я только начал изучать laravel и столкнулся с проблемой в контроллерах. Есть шаблон /dashboard который наследует переиспользуемый шаблон header и footer. Для шаблона /dashboard есть маршрут с вызовом контроллера и вся логика происходит там, но мне нужно отделить логику от dashboad и использовать свой контроллер в header, так как при переходе на другую страницу, выходит ошибка, говорящая, что переменная в шаблоне есть но в контроллере она не задана. Искал долго, но не нашел или не понял как это сделать
Route::get('/dashboard', 'App\Http\Controllers\DashboardController@dashboard' );
class DashboardController extends Controller{
public function dashboard(Request $request){
//Передача переменных в шаблон
$dataVar = [
'cookieThemeCont' => Cookie::get('theme'),
'cookieSidebarCont' => Cookie::get('minSidebar')
];
if (Auth::check()) {
return view('dashboard', $dataVar);
}
return redirect('login');
}
Вывод в header
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{$cookieThemeCont}}</title>
</head>
<body>
@yield('content')
</body>
</html>
Файл dashboard
@extends('layouts.main_dashboard')
@section('content')
<h1>Текст</h1>
@endsection
Ответы (2 шт):
В Laravel (да и не только), есть такое понятие как Template Inheritance, прочитать про него более подробно можно в документации.
Если взять пример вашего кода, то что нужно было сделать:
В главном шаблоне, который main_dashboard, прописать следующее:
<title>@yield('title')</title>
Вместо:
<title>{{$cookieThemeCont}}</title>
И тогда уже в ваш шаблон dashboard вы передаете свою переменную $cookieThemeCont и там её используете:
@section('title', $cookieThemeCont)
Только так и нужно передавать с наследуемых шаблонов в ролительские, больше примеров есть в документации, есть ещё похожие варианты с stack, советую тоже ознакомится.
Если нужно же передавать данные по всем шаблонам, то можно воспользоваться шарингом (подробнее тут). К примеру в AppServiceProvider написать:
View::share('cookieThemeCont', Cookie::get('theme'));
И переменная будет доступна везде, но лучше таким не злоупотреблять, есть ещё вариант с @inject, но он мне кажется ещё хуже.
А можно так. Вставить в title: {{ isset($cookieThemeCont) ? $cookieThemeCont : '' }}