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_section
variables。
{{ $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>
更多信息在这里:
我有一个类似的问题,发现我认为是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 }}