如何在 Laravel Blade 模板中设置变量

Posted

技术标签:

【中文标题】如何在 Laravel Blade 模板中设置变量【英文标题】:How to Set Variables in a Laravel Blade Template 【发布时间】:2012-10-11 17:50:00 【问题描述】:

我正在阅读 Laravel Blade documentation,但我不知道如何在模板中分配变量以供以后使用。我不能这样做 $old_section = "whatever" ,因为那会回显“随便”,我不希望那样。

我知道我可以做到<?php $old_section = "whatever"; ?>,但这并不优雅。

在 Blade 模板中是否有更好、更优雅的方式来做到这一点?

【问题讨论】:

检查这个拉:github.com/laravel/laravel/pull/866 这通常对测试很有用,特别是如果您正在处理模板但其他人正在处理 PHP 部分。完成测试后请小心删除声明。 简单地做<?php $old_section = "whatever"; ?>有什么问题。我觉得它的可读性很好。 @JaimeHablutzel 在我看来,答案在于问题:它并不优雅。 @duality_ 使用 hack 总是不优雅,如果你想使用 hack,就不要追求优雅。 【参考方案1】:

我不认为你可以 - 但话又说回来,这种逻辑可能应该在你的控制器中处理并传递到已经设置的视图中。

【讨论】:

某些变量只针对视图。 $previous_group_name$separator_printed 如果它只用于视图,你应该把它从控制器传递给视图。如果您希望它可用于所有视图,请使用app/controllers/BaseController.php 查看我上面的答案。 我正在使用多个数组将我所有的 $data 发送到视图【参考方案2】:

不鼓励在视图中执行此操作,因此没有刀片标签。 如果您确实想在刀片视图中执行此操作,您可以在编写时打开一个 php 标签,或者注册一个新的刀片标签。只是一个例子:

<?php
/**
 * <code>
 * ? $old_section = "whatever" ?
 * </code>
 */
Blade::extend(function($value) 
    return preg_replace('/\\?(.+)\?\/', '<?php $1 ?>', $value);
);

【讨论】:

视图中的变量有一些用途。这看起来很棒!放置这段代码的好地方在哪里? 你可以把它放在你的 application/start.php 中,或者如果你有更多这样的东西,把它放在一个单独的文件中并包含在其中。 Laravel 在这种方式上非常松散,你甚至可以放一个控制器。在呈现视图之前,您唯一需要做的就是扩展。 添加这个额外代码只是为了使用?而不是仅仅使用本机&lt;?的原因是什么? 如果不鼓励这样做,是否有更“正确”的方法来执行以下操作?我有一个网站,其中标题在主应用程序视图中呈现为 $title ,其中包含一个需要将页码附加到标题的子系统(“申请表页面 $page ”)和我将 $page 传递给视图(在视图中以其他方式使用)。我不想在每个控制器调用中构建标题,我只想向视图发送页码 - 以防万一有一天我想更改基本标题。我现在正在使用 ,但是有更正确的方法吗? 变量应该从控制器传递,而不是在你的视图中声明为内联。如果全局模板需要变量,您可以在服务提供者***.com/a/36780419/922522 中设置它。如果特定于页面的模板需要变量,请使用 @yield 并从具有控制器的子视图传递它。 laravel.com/docs/5.1/blade#template-inheritance【参考方案3】:

突然之间什么都不会出现了。 根据我的经验,如果您必须做这样的事情,请在模型的方法中准备 html,或者将您的代码重新组织成数组或其他东西。

永远不会只有一种方式。

 $x = 1 ? '' : '' 

【讨论】:

准备模型中的HTML?这是可以想象的最丑陋的事情。 @duality_ 您正在声明和更改视图中的变量。我说你可能组织你的代码错误。 Lrn 2 建筑师。 当然,Michael...那些变量不是$users = ...之类的变量,而是类似于$css_class = ...的东西,所以严格设计不属于模型或控制器的变量,因为它们是由设计师决定的。 如果你需要走那条路,我更喜欢更简单优雅的解决方案:''; $x = 1 【参考方案4】:

您可以在视图文件中设置变量,但它会按照您设置的方式打印。无论如何,有一个解决方法。您可以在未使用的部分中设置变量。示例:

@section('someSection')
   $yourVar = 'Your value' 
@endsection

然后 $yourVar 将在任何你想要的地方打印Your value,但是当你保存变量时你不会得到输出。

编辑:需要命名该部分,否则将引发异常。

【讨论】:

不起作用需要包含其他内容未定义的属性:Illuminate\View\Factory::$startSection(视图:/home/vagrant/Code/dompetspy/resources/views/reviews/index.刀片.php) 其实这很聪明!只需将您的部分称为“变量”并严格使用它来分配刀片中的变量,瞧!【参考方案5】:

有一个简单的解决方法,不需要您更改任何代码,它也可以在 Laravel 4 中使用。

您只需在传递给@if 语句的表达式中使用赋值运算符 (=),而不是(例如)== 等运算符。

@if ($variable = 'any data, be it string, variable or OOP') @endif

然后你可以在任何可以使用任何其他变量的地方使用它

 $variable 

唯一的缺点是你的任务将看起来对于不知道你正在这样做作为一种解决方法的人来说是一个错误。

【讨论】:

【参考方案6】:

在laravel-4中,您可以使用模板注释语法来定义/设置变量。

注释语法为-- anything here is comment --,由blade引擎渲染为

&lt;?php /* anything here is comment */ ?&gt;

所以我们可以用它来定义变量,例如

-- */$i=0;/* --

将由bladeas 呈现 &lt;?php /* */$i=0;/* */ ?&gt; 为我们设置变量。 无需更改任何代码行。

【讨论】:

@trying-tobemyself +1 |不是 Best-Practices 方式,而是 perfect 用于快速破解模板中的代码,例如用于 html 的 内联样式 我不建议这样做,因为任何人在你会恨你之后再看这段代码。 同意贾斯汀,评论标签是给cmets的,在评论中取消评论并开始做其他事情是自找麻烦 这并不比普通的 ol' php &lt;?php $i=0; ?&gt; 这样做而不是使用php标签有什么意义?它不可读(看起来像注释),需要更多输入,并且可能会因解析系统的更新而损坏。即使它有一点,也不是如何在刀片模板中定义变量的答案。不知道选民怎么了,也许他们觉得这太“怪胎”了?嗯……【参考方案7】:

在我看来,最好将逻辑保留在控制器中并将其传递给视图以使用。这可以使用 'View::make' 方法的两种方法之一来完成。我目前正在使用 Laravel 3,但我很确定在 Laravel 4 中也是如此。

public function action_hello($userName)

    return View::make('hello')->with('name', $userName);

public function action_hello($first, $last)

    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);

'with' 方法是可链接的。然后你会像这样使用上面的:

<p>Hello $name</p>

更多信息在这里:

http://three.laravel.com/docs/views

http://codehappy.daylerees.com/using-controllers

【讨论】:

表示逻辑最好保留在视图中。有时,您需要从视图中创建一个变量。例如格式化日期。 $format='Y-m-d H:i:s'; 这样您就可以在视图中重复使用该格式。这当然不属于控制器。也就是说,针对这个问题...... &lt;?php ?&gt; 标签没有任何问题。【参考方案8】:

在 Laravel 4 中:

如果您希望变量在您的所有视图中都可以访问,而不仅仅是您的模板,View::share 是一个很好的方法 (more info on this blog)。

只需在 app/controllers/BaseController.php 中添加以下内容

class BaseController extends Controller

  public function __construct()
                     
    // Share a var with all views
    View::share('myvar', 'some value');
  

现在$myvar 将可用于您的所有视图——包括您的模板。

我用它来为我的图像设置环境特定的资产 URL。

【讨论】:

这就是我一直在寻找的:避免在数据库中重复调用的好方法! 这似乎不是 Laravel 5 中的选项? @Goddard 你仍然可以。语法发生了变化:***.com/a/36780419/922522【参考方案9】:

我有一个类似的问题,并通过View Composers 找到了我认为正确的解决方案

View Composer 允许您在每次调用某个视图时设置变量,它们可以是特定视图或整个视图模板。无论如何,我知道这不是对问题的直接答案(而且为时已晚 2 年),但它似乎比使用刀片在视图中设置变量更优雅。

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) 
    $view->with(array('bodyClass' => 'admin'));
);

【讨论】:

【参考方案10】:

LARAVEL 5.5 及以上版本

使用刀片指令的完整形式:

@php
$i = 1
@endphp

LARAVEL 5.2 - 5.4

你可以使用内联标签:

@php ($i = 1)

或者你可以在块语句中使用它:

@php
$i = 1
@endphp

添加“定义”标签

如果您想使用自定义标签并使用@define 而不是@php,请像这样扩展 Blade:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) 
    return preg_replace('/\@define(.+)/', '<?php $1; ?>', $value);
);

然后执行以下操作之一:

快速解决方案:如果你比较懒,只需将代码放在AppServiceProvider.php的boot()函数中即可。

更好的解决方案: 创建自己的服务提供者。有关如何在 Laravel 5 中扩展刀片的信息,请参阅 https://***.com/a/28641054/2169147。这种方式需要更多的工作,但对于如何使用 Providers 来说是一个很好的练习:)

LARAVEL 4

你可以把上面的代码放在 app/start/global.php 的底部(或者你觉得更好的任何其他地方)。


经过以上修改后,可以使用:

@define $i = 1

定义一个变量。

【讨论】:

不错!请注意,您可以使用您的实现执行任何 php 语句。我会将它重命名为 @php 之类的东西。很方便... 非常真实,igaster。如果需要,您可以将 'define' 重命名为 'php',但这会导致在模板中过度使用 php 的陷阱 :) 感谢@C.delaFonteijne,如果您使用命名空间(并且应该),确实需要 \。我在上面的代码中添加了\。 请注意,几乎您的确切实现是标准的since Laravel 5.2。可以使用@php(@i = 1),也可以在块语句中使用(关闭@endphp 我看不出“@php”“@endphp”比“”“更优雅”。它甚至更长的几个字符!仅仅是因为它像其他 Blade 指令一样以“@”开头吗?我们开发者是一群强迫症! ;-)【参考方案11】:

至于我的优雅方式如下

 ''; $old_section = "whatever"; 

然后回显您的 $old_section 变量。

 $old_section 

【讨论】:

【参考方案12】:

破解 cmets 并不是一种非常易读的方法。此外,编辑器会将其着色为注释,并且在查看代码时可能有人会错过它。

试试这样的:

 ''; $hello = 'world' 

它会编译成:

<?php echo ''; $hello = 'world'; ?>

...然后做任务而不是回显任何东西。

【讨论】:

【参考方案13】:

你会把它弄得太复杂。

只需使用普通的 php

<?php $i = 1; ?>
$i

甜品。

(或https://github.com/alexdover/blade-set 看起来也很简单)

我们都在通过在视图中设置变量来“破解”系统,那么为什么要让“破解”变得更加复杂呢?

在 Laravel 4 中测试。

另一个好处是语法高亮可以正常工作(我之前使用过评论破解,阅读起来很糟糕)

【讨论】:

【参考方案14】:

最好练习在Controller中定义变量,然后使用compact()-&gt;with()方法传递给视图。

否则#TLGreg 给出了最佳答案。

【讨论】:

【参考方案15】:

Blade radic/blade-extensions 有一个很好的扩展。添加后可以使用@set(variable_name, variable_value)

@set(var, 33)
$var

【讨论】:

【参考方案16】:

laravel 5 你可以轻松做到这一点。见下文

--*/ @$variable_name = 'value'  /*--

【讨论】:

【参考方案17】:

在 Laravel 5.1、5.2 中

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

您可能需要与您的应用程序呈现的所有视图共享一条数据。您可以使用视图工厂的 share 方法来执行此操作。通常,您应该在服务提供者的引导方法中调用共享。您可以随意将它们添加到 AppServiceProvider 或生成单独的服务提供者来容纳它们。

编辑文件:/app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
        
    public function boot()
    
        view()->share('key', 'value');
    

    public function register()
    
        // ...
    

【讨论】:

【参考方案18】:

我一直在寻找一种方法来为键分配值并在我看来多次使用它。对于这种情况,您可以首先使用@section"key", "value",然后调用@yield"key" 将值输出到您的视图或其子视图的其他位置。

【讨论】:

【参考方案19】:

我将扩展@Pim 给出的答案。

将此添加到您的 AppServiceProvider 的启动方法中

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) 
    list($name, $val) = explode(',', $expression);
    return "<?php $name = $val; ?>";
);

这样你就不会暴露编写任何 php 表达式的能力。

你可以像这样使用这个指令:

@set($var, 10)
@set($var2, 'some string')

【讨论】:

【参考方案20】:

如果你有 PHP 7.0:

简单且最有效的方法是在括号内赋值

规则很简单:您是否多次使用变量?然后在第一次用括号时声明,保持冷静,继续。

@if(($users = User::all())->count())
  @foreach($users as $user)
     $user->name 
  @endforeach
@else
  There are no users.
@endif

是的,我知道@forelse,这只是一个演示。

由于您的变量现在被声明为当它们被使用时,所以不需要任何刀片解决方法。

【讨论】:

【参考方案21】:

从 Laravel 5.2.23 开始,你有了 @php Blade directive,你可以使用内联或块语句:

@php($old_section = "whatever")

@php
    $old_section = "whatever"
@endphp

【讨论】:

【参考方案22】:

适用于所有版本的刀片。

--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--

【讨论】:

【参考方案23】:

你可以使用我发布的包:https://github.com/sineld/bladeset

然后你很容易设置你的变量:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")

【讨论】:

【参考方案24】:

为刀片模板分配变量,这里是解决方案

我们可以在刀片页面中使用&lt;?php ?&gt;标签

<?php $var = 'test'; ?>
 $var 

我们可以使用特殊语法的刀片注释

--*/ $var = 'test' /*--
 $var 

【讨论】:

【参考方案25】:

您可以通过以下方式在刀片模板引擎中设置变量:1.通用 PHP 块设置变量: &lt;?php $hello = "Hello World!"; ?&gt;输出: $hello2. Blade PHP 块设置变量: @php $hello = "Hello World!"; @endphp输出: $hello

【讨论】:

【参考方案26】:

你可以使用如下所示的extend方法来扩展blade..

Blade::extend(function($value) 
    return preg_replace('/\@var(.+)/', '<?php $1; ?>', $value);
);

然后按如下方式初始化变量。

@var $var = "var"

【讨论】:

【参考方案27】:

在laravel文档中https://laravel.com/docs/5.8/blade#php 你可以这样做:

@php
     $my_variable = 123;
@endphp

【讨论】:

【参考方案28】:

blade文件里面,可以使用这种格式

@php
  $i++
@endphp

【讨论】:

【参考方案29】:

我也遇到过同样的问题。但是我能够通过使用以下代码段来解决这个问题。在刀片模板中使用它。

<input type="hidden" value="$old_section = "whatever" ">

$old_section 

【讨论】:

【参考方案30】:

Laravel 7:

 $solution = "Laravel 7 is awesome and easy to use !!" 

【讨论】:

当我像这样定义变量时,网站会打印出 $solution 的值,我该如何解决这个问题。这样变量只是在blade.php中定义但没有打印出来? 你使用的是哪个版本的 Laravel。 @MariusIllmann

以上是关于如何在 Laravel Blade 模板中设置变量的主要内容,如果未能解决你的问题,请参考以下文章

在带有 Blade 的 Laravel 4 中看不到内容视图中的变量

Laravel 5.2:如何在刀片模板中设置变量,没有 php 标签?

PHPstorm - 无法在blade.php 文件中设置断点

Laravel 5 - 所有模板中都可用的全局 Blade 视图变量

在 Laravel->Blade 中放置一些变量的最佳方法

如何在 Laravel 中设置全局变量?