我正在阅读Laravel Blade documentation并且我可以't figure out how to assign variables inside a template for use later. I can'做 {{ $old_section = "whatever" }}
因为那将回应"whatever"而我不希望这样 .
我明白我可以做 <?php $old_section = "whatever"; ?>
,但那并不优雅 .
在Blade模板中有更好,更优雅的方法吗?
25 回答
不鼓励在视图中进行操作,因此没有刀片标记 . 如果您确实想在刀片视图中执行此操作,则可以在编写时打开php标记或注册新的刀片标记 . 举个例子:
LARAVEL 5.2 AND UP
你可以使用:
或者您可以在块语句中使用它:
LARAVEL 5
像这样扩展刀片:
然后执行以下操作之一:
快速解决方案:如果你很懒,只需将代码放在AppServiceProvider.php的boot()函数中 .
更好的解决方案:创建自己的服务提供商 . 有关如何在Laravel 5中扩展刀片的信息,请参阅https://stackoverflow.com/a/28641054/2169147 . 这样做的工作要多一些,但是如何使用Providers :)这是一个很好的练习:)
LARAVEL 4
你可以把上面的代码放在app / start / global.php的底部(如果你觉得更好的话,可以放在任何其他地方) .
经过上述更改后,您可以使用:
定义变量 .
在laravel-4中,您可以使用模板注释语法来定义/设置变量 .
注释语法为
{{-- anything here is comment --}}
,它由blade引擎呈现为<?php /* anything here is comment */ ?>
因此,通过小技巧,我们可以使用它来定义变量
将由blade呈现为
<?php /* */$i=0;/* */ ?>
,它为我们设置变量 . 不改变任何代码行 .有一个简单的解决方法,不需要您更改任何代码,它也适用于Laravel 4 .
您只需在传递给
@if
语句的表达式中使用赋值运算符(=
),而不是(例如)==
等运算符 .然后,您可以在任何可以使用任何其他变量的地方使用它
唯一的缺点是你的任务看起来像是一个错误的人不知道你这样做是一个解决方法 .
你会让它变得太复杂 .
只需使用纯PHP
donesies .
(或https://github.com/alexdover/blade-set看起来也相当直接)
我们都通过在视图中设置变量来“破解”系统,那么为什么要让“hack”变得更加复杂呢?
在Laravel 4中测试过 .
另一个好处是语法突出显示正常工作(之前我使用的是评论黑客并且阅读起来很糟糕)
从Laravel 5.2.23开始,您有@php Blade directive,您可以使用内联或块语句:
要么
In Laravel 4:
如果您希望在所有视图中都可以访问变量,而不仅仅是模板,
View::share
是一个很好的方法(more info on this blog) .只需在app / controllers / BaseController.php中添加以下内容即可
现在
$myvar
将可用于您的所有视图 - 包括您的模板 .我用它来为我的图像设置特定于环境的资产URL .
您可以在视图文件中设置变量,但它将在您设置时打印 . 无论如何,有一个解决方法 . 您可以在未使用的部分内设置变量 . 例:
然后
{{ $yourVar }}
将在您想要的任何地方打印Your value
,但是在保存变量时不会得到输出 .EDIT: 命名该部分是必需的,否则将抛出异常 .
您可以在刀片模板引擎中设置变量以下方法:
1. General PHP Block
Setting Variable:
<?php $hello = "Hello World!"; ?>
Output:
{{$hello}}
2. Blade PHP Block
Setting Variable:
@php $hello = "Hello World!"; @endphp
Output:
{{$hello}}
突然间什么都没有出现 . 根据我的经验,如果你必须做这样的事情,在模型的方法中准备html或者将你的代码重组到数组或其他东西 .
从来没有一种方法 .
我将扩展@Pim给出的答案 .
将其添加到AppServiceProvider的引导方法中
这样你就不会暴露编写任何php表达式的能力 .
您可以使用此指令,如:
In Laravel 5.1, 5.2 :
https://laravel.com/docs/5.2/views#sharing-data-with-all-views
编辑文件:
/app/Providers/AppServiceProvider.php
您可以使用我发布的包裹:https://github.com/sineld/bladeset
然后您可以轻松设置变量:
我不认为你可以 - 但是再一次,这种逻辑应该在你的控制器中处理并传递到已经设置的视图中 .
至于我的优雅方式如下
只需回显你的
$old_section
变量 .If you have PHP 7.0:
The simple and most effective way is with assignment inside brackets .
规则很简单:您是否多次使用变量?然后在第一次在括号内使用时声明它,保持冷静并继续 .
是的,我知道
@forelse
,这只是一个演示 .由于您的变量现在被声明为使用它们,因此不需要任何刀片解决方法 .
黑客评论不是一种非常易读的方式 . 编辑也会将其标记为评论,有人可能会在查看代码时错过它 .
尝试这样的事情:
它将编译成:
......做任务而不回应任何事情 .
最好练习在Controller中定义变量,然后使用
compact()
或->with()
方法传递给视图 .否则#TLGreg给出了最佳答案 .
Blade radic/blade-extensions有一个非常好的扩展 . 添加后,您可以使用@set(variable_name,variable_value)
laravel 5你可以很容易地做到这一点 . 见下文
我一直在寻找一种方法来为一个键赋值,并在我的视图中多次使用它 . 对于这种情况,您可以首先使用
@section{"key", "value"}
然后调用@yield{"key"}
以在视图或其子视图的其他位置输出值 .将变量分配给刀片模板,以下是解决方案
我们可以在刀片页面中使用
<?php ?>
标记要么
我们可以使用特殊语法的刀片评论
在我看来,最好将逻辑保留在控制器中并将其传递给视图以供使用 . 这可以使用'View :: make'方法以两种方式之一完成 . 我目前正在使用Laravel 3,但我很确定它在Laravel 4中是一样的 .
要么
'with'方法是可链接的 . 然后您将使用以上内容:
更多信息:
http://three.laravel.com/docs/views
http://codehappy.daylerees.com/using-controllers
我有一个类似的问题,发现我认为是正确的解决方案与View Composers
View Composers允许您在每次调用某个视图时设置变量,它们可以是特定视图或整个视图模板 . 无论如何,我知道这不是问题的直接答案(而且已经太迟了2年),但它似乎比使用刀片在视图中设置变量更优雅 .
适用于所有版本的刀片 .