Laravel's Blade:如何在模板中设置variables?

我正在阅读Laravel Blade的模板文档,我无法find如何在模板中分配variables,以便稍后在模板中使用。 我不能这样做{{ $old_section = "whatever" }}因为这会回应“任何”,我不想这样做。

我看到我可以做<?php $old_section = "whatever"; ?> <?php $old_section = "whatever"; ?> ,但那不是优雅的。

在Blade中有没有一种优雅的方式呢?

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

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

LARAVEL 5.2和UP

你可以使用:

 @php ($i = 1) 

或者你可以在块声明中使用它:

 @php $i = 1 @endphp 

LARAVEL 5

像这样扩展刀片:

 /* |-------------------------------------------------------------------------- | Extend blade so we can define a variable | <code> | @define $variable = "whatever" | </code> |-------------------------------------------------------------------------- */ \Blade::extend(function($value) { return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value); }); 

然后执行以下任一操作:

快速解决scheme:如果您懒惰,只需将代码放在AppServiceProvider.php的boot()函数中即可。

更好的解决scheme:创build自己的服务提供商。 请参阅https://stackoverflow.com/a/28641054/2169147关于如何在Laravel 5中扩展刀片服务器。这是一个更多的工作,但如何使用提供商的一个很好的练习:)

LARAVEL 4

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


经过以上更改,您可以使用:

 @define $i = 1 

定义一个variables。

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

注释语法是{{-- anything here is comment --}}并且它被刀片引擎渲染为

<?php /* anything here is comment */ ?>

所以我们可以用一些小技巧来定义variables

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

将被刀片渲染为<?php /* */$i=0;/* */ ?> ,它将为我们设置variables。 无需更改任何代码行

有一个简单的解决方法,不需要您更改任何代码,并且它也适用于Laravel 4。

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

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

那么你可以在任何可以使用任何其他variables的地方使用它

 {{ $variable }} 

唯一的缺点是你的任务看起来像一个错误,不知道你是否在做这个解决方法。

你会让它太复杂了。

只需使用普通的PHP

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

donesies。

(或https://github.com/alexdover/blade-set看起来也很直观);

我们都是通过在视图中设置variables来“侵入”系统,那么为什么要使“黑客”变得更复杂呢?

testing在Laravel 4。

另一个好处是,语法突出显示正常工作(我以前使用评论黑客,这是可怕的阅读)

在Laravel 4:

如果你想在你的所有视图中使用variables,而不仅仅是你的模板, View::share是一个很好的方法( 更多的信息在这个博客上 )。

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

 class BaseController extends Controller { public function __construct() { // Share a var with all views View::share('myvar', 'some value'); } } 

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

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

您可以在视图文件中设置一个variables,但是它将按照您的设置进行打印。 无论如何,有一个解决方法。 您可以在未使用的部分内设置variables。 例:

 @section {{ $yourVar = 'Your value' }} @endsection 

然后, {{ $yourVar }}将在您希望的任何位置打印Your value ,但是当您保存该variables时,您不会得到输出。

由于Laravel 5.2.23,你有@php Blade指令 ,你可以使用内联或者作为块语句:

 @php($old_section = "whatever") 

要么

 @php $old_section = "whatever" @endphp 

突然间什么也没有出现。 根据我的经验,如果你必须做一些这样的事情,在模型的方法中准备html,或者做一些你的代码重组到你的数组或其他东西。

从来没有只有一种方法。

 {{ $x = 1 ? '' : '' }} 

我将延长@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}; ?>"; }); 

这样你就不会暴露出写任何phpexpression式的能力。

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

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

在Laravel 5.1,5.2中

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

您可能需要与应用程序呈现的所有视图共享一段数据。 你可以使用视图工厂的共享方法。 通常情况下,您应该将呼叫分配给服务提供商的启动方法。 您可以自由地将它们添加到AppServiceProvider中,或者生成一个单独的服务提供程序来保存它们。

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

 <?php namespace App\Providers; class AppServiceProvider extends ServiceProvider { public function boot() { view()->share('key', 'value'); } public function register() { // ... } } 

我不认为你可以 – 但是再一次,这种逻辑应该可以在你的控制器中处理,并进入已经设定的视图。

至于我优雅的方式就像下面这样

 {{ ''; $old_section = "whatever"; }} 

只需回显你的$old_sectionvariables。

 {{ $old_section }} 

黑客评论是不是一个非常可读的方式来做到这一点。 另外,编辑会将它作为注释着色,并且在查看代码时有人可能会错过它。

尝试这样的事情:

 {{ ''; $hello = 'world' }} 

它将编译成:

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

…做任务,不回应任何事情。

练习在Controller中定义variables,然后使用compact()->with()方法传递来进行查看会更好。

否则#TLGreg给了最好的答案。

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

 @set(var, 33) {{$var}} 

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

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

如果你有 PHP 7.0的话:

最简单和最有效的方法是在括号内进行赋值

规则很简单:您是否多次使用variables? 然后在括号内首次声明它,保持冷静并继续。

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

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

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

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

那么你很容易设置你的variables:

 @set('myVariable', $existing_variable) // or @set("myVariable", "Hello, World!") 

在我看来,最好将控制器中的逻辑传递给视图来使用。 这可以通过使用'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

我有一个类似的问题,发现我认为是View Composer的正确解决scheme

View Composer允许您在每次调用某个视图时设置variables,并且它们可以是特定的视图或整个视图模板。 无论如何,我知道这不是对问题的直接回答(而且两年太迟了),但它似乎比用刀片在视图中设置variables更加优雅。

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

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

适用于所有版本的刀片。

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

将variables分配给刀片模板,以下是解决scheme

我们可以在刀片页面中使用<?php ?>标签

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

要么

我们可以使用特殊语法的刀片评论

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