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 шт):

Автор решения: Yaroslav Molchan

В 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 : '' }}

→ Ссылка