在布局中的 Laravel 5.3 视图中包含 PHP 变量

Posted

技术标签:

【中文标题】在布局中的 Laravel 5.3 视图中包含 PHP 变量【英文标题】:Include PHP variables in a Laravel 5.3 view within a layout 【发布时间】:2017-04-08 17:10:22 【问题描述】:

基于 Laravel 通知电子邮件模板,这是我正在尝试做的。

我尝试使用带有变量的电子邮件布局,以便在我的布局中定义一些样式,但可以在我的电子邮件视图中访问。

这是一个例子:

电子邮件/layout.blade.php

<!DOCTYPE html>
<html>
<head> [...]
</head>
@php
$style = ['body' => 'font-size:12px;color:#000;', 'paragraph' => 'font-size:10px;color:#eee;'];
@endphp
<body style=" $style['body'] ">
@yield('content')
</body>
</html>

在我的电子邮件视图中:

@extends('emails.layout')

@section('content')

<p style=" $style['paragraph'] ">
   Hi there!
</p>

@endsection

但这不起作用,因为在我的部分中无法访问 $style 变量。

所以,我让它工作的唯一方法是在我的布局和视图中包含一个 PHP 文件,我很确定这不是我应该使用 Laravel 执行此操作的方式...

<?php include_once(base_path('resources/views/emails/variables.php')); ?>

有没有办法做到这一点? 谢谢大家!

【问题讨论】:

【参考方案1】:

理想情况下,您不应该尝试以这种方式包含 PHP 变量。从控制器返回视图时,您应该将渲染视图所需的所有变量传递给它:

class YourController

    public function yourMethod()
    
        $styles = getYourStyles();

        return view('emails.view')->with([
            'styles' => $styles
        ]);
    

这将使您的样式在整个视图中的 $styles 变量中可用。

或者,您可以使用配置来存放您的变量,然后您可以在需要时轻松访问它们。

config/styles.php

return [
    'paragraph' => 'font-size: 12px; font-weight: bold;'
];

在您的模板中:

<p style=" config('styles.paragraph') ">

【讨论】:

或者只使用 View::share()【参考方案2】:

有几种方法可以解决这个问题。一种是在 Controller 中设置命名变量,而众多选项中的另一种是直接在 Blade View 中设置变量。

在刀片视图中设置变量 - [ ODD IDEA ]

     <!--view_script.blade-->
     <?php  
          $style = [
                     'body'      => 'font-size:12px;color:#000;', 
                     'paragraph' => 'font-size:10px;color:#eee;'
                   ];
     ?>
     <!DOCTYPE html>
         <html>
         <head> [...]
         </head>
         <body style=" $style['body'] ">
             @yield('content')
         </body>
    </html>

在控制器中设置变量以供刀片视图使用

     <?php  
         // FileName: SampleController.php
          public function welcome()
              $css = [
                       'body'       => 'font-size:12px;color:#000;', 
                       'paragraph'  => 'font-size:10px;color:#eee;'
                     ];

              return view('sample.view')
                     ->with(['style' => $css]);
              
           
     ?>

     <!-- THEN INSIDE THE VIEW, YOU'D DO -->
     <!DOCTYPE html>
         <html>
         <head> [...]
         </head>
         <body style=" $style['body'] ">
             @yield('content')
         </body>
    </html>

有关如何处理此问题的更详细信息,您可能希望查看THIS LINK。

【讨论】:

感谢您的回答,但我想在我的所有视图中分享 $style,我不想在每个控制器中重新定义它。【参考方案3】:
The standard way to do this would be
Inside /app/Providers/ComposerServiceProvider.php boot function

 view()->composer('*',function($view)
        $style = "datas";

        $view->with(['style' => $style]);

    );

现在,如果您只想包含其他模板,您的变量将在刀片模板中可用,只需给出名称而不是 * 例如。 /view/user/view.blade.php

view()->composer('user.view',function($view)
                $style = "datas";

                $view->with(['style' => $style]);

            );

【讨论】:

以上是关于在布局中的 Laravel 5.3 视图中包含 PHP 变量的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3:缺少参数 2

Laravel 5.3 - InvalidArgumentException 视图 [索引] 未找到 [重复]

laravel-5.3 路由配置

Laravel 5.3 - 如何记录页面上的所有查询?

如何使用 Laravel 5.3 注销并重定向到登录页面?

Laravel 5.3 中的搜索栏来过滤表格