如何将数据从@extends传递到@yield?

时间:2020-04-23 01:40:35

标签: laravel

我从helper获取一些常用数据。现在,我想在整个视图中使用这些数据。因此,我试图在app.blade.php中声明该数据并尝试传递其各个部分。

这是我的app.blade.php-

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>ABC| @yield('title')</title>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <link href="{{ asset('/assets/plugins/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
    <link href="{{ asset('/assets/abc/css/style.css') }}" rel="stylesheet">

    <?php 
        //get theme
        $theme = AppHelper::instance()->getTheme();

        //get theme folder
        $themeFolder = $theme[0]->websiteAdmin;

        //set include files section path
        $includePath = 'frontend.'.$theme[0]->themeName.'.sections.';
    ?>
</head>
@yield('content')
</html>

这里我想将变量$theme, $themefolder, $includePath传递给@yield('content')

我尝试了以下代码-

@yield('content', array('theme'=> $theme, 'themeFolder'=> $themeFolder, 'includePath'=> $includePath))

但是会得到错误消息,即那些变量未定义。

Undefined variable: theme

您能帮我如何将数据从@extend传递到@yield吗? 预先谢谢你。

1 个答案:

答案 0 :(得分:3)

您应该使用View作曲家来完成此任务。它们使您只需在一个地方调用它就可以在多个视图之间传递相同的数据。

在您的providers/AppServiceProvider.php中,您可以将以下内容添加到引导方法中:

use Illuminate\Support\Facades\View; //import view facade

public function boot()
    {
        View::composer(['view-name', 'another-view-name'], function($view){

            $theme = AppHelper::instance()->getTheme();
            $themeFolder = $theme[0]->websiteAdmin;
            $includePath = 'frontend.'.$theme[0]->themeName.'.sections.';

            $view->with(compact('themeFolder', 'includePath', 'theme'));
        });

    }

View::composers第一个参数采用一个视图数组,将要传递数据的所有视图都放在此处['view-name', 'another-view-name'],它也可以使用一个字符串。

现在,数据将通过$themeFolder $includePath$theme变量提供给您指定的视图

如果要将这些数据传递给所有视图,则可以将'*'作为第一个参数。 注意,这会将数据传递到您创建的每个视图,如果您希望每个视图都包含数据,则仅执行'*'!否则,请分别指定视图。

如果您希望某个文件夹中的所有视图都传递数据,则可以执行'folder-name.*'

或者,将数据传递到@yield的另一种方法是返回带有控制器中变量的视图app.blade.php