Laravel的Blade指令中如何检查变量是否存在

56

我正在尝试创建一个 Blade 指令,用于输出变量(如果变量被定义)或输出 "no data" 如果未定义变量。

这是我的 AppServiceProvider.php 代码:

<?php

namespace App\Providers;

use Blade;
use Illuminate\Support\ServiceProvider;


class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('p', function($ex) {
            error_log(print_r($ex,true));
            return '<?php $defined_vars = get_defined_vars(); if(array_key_exists(\''. $ex .'\', $defined_vars) ): echo ' . $ex . ' ; else: echo \'no data\'; endif;?>';
        });
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

这是我的index.blade.php:

<p class="lead">@p($myvar)</p>

如果变量已定义,但我使用了“p”指令,则会显示“无数据”。如果我使用isset,则会出现错误:Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

我该如何在指令内部检查变量是否已定义?


那么你的意思是说,if(isset($myvar))不起作用? - Can Celik
13个回答

98

Blade有一个指令来检查变量是否已设置:

@isset($var)

@endisset

4
你如何处理else? - Aderemi Dayo
7
正常情况下,使用 @else - dsturbid

33

尝试检查变量是否为空:

@if(empty($myvar))
    <p>Data does not exist</p>
@else
    <p>Your data is here!</p>
@endif

还可以查看此线程


27

对于 Laravel 5.7 及以上版本,请使用:

{{ $checkvariable ?? 'not-exist' }}


不是真的,我用 Laravel v7 编写的代码出现了未定义变量的错误。 - Lewis

22

对于 Laravel 版本 >=5.7

{{ $value ?? '' }}

对于 Laravel 版本小于 5.7

{{ $value or '' }}

19

1
将来我想为我的指令添加更复杂的逻辑。例如,为授权用户提供不同的样式。因此,我只想在视图中键入p($foo),而不是重复{{ $checkvariable or 'not-exist' }}和进行授权检查的逻辑。 - pupadupa

16

检查变量是否存在的最佳、最干净的方法:

 {!! !empty($myvariable) ? $myvariable : 'variable does not exist' !!}

我在一个数组中遇到了未定义的索引,而这正是完美的解决方案。 - Chad

6
您可以使用 @isset Blade 指令来检查变量是否设置。另外,如果您有该变量的默认值,您可以直接使用它,如{{ $vatiable ?? 'default_value' }}。这种 ?? 的方法从 Laravel v5.7 开始提供。
如果您想同时检查多个变量,则可以将 AND 运算应用于表达式,如 @if(isset($var_one) && isset($var_two))
还有其他使用 @if 指令的方式(冗长)如 @if(isset($variable)),但不建议使用。
某些开发人员在类似情况下使用 @ 符号进行错误控制。 at 符号 (@) 在 PHP 中用作错误控制运算符。当一个表达式以 @ 符号开头时,可能由该表达式产生的错误消息将被忽略。如果启用了 track_errors 功能,那么由该表达式生成的错误消息将保存在变量 $php_errormsg 中。每次出现错误,该变量都会被覆盖。但是使用 @ 很不好的编程习惯,因为它并没有消除错误,只是隐藏了错误,并且它会使调试变得更加困难,因为我们无法看到代码实际错误的原因。

6

你可以用几种不同的方式来实现。

示例-1:

@if( !empty($data['var']))
   {{ $data['var'] }} 
@endif

示例-2:

{{ $data['var'] or 'no data found' }}

示例-3:使用三元运算符

<a href="" class="{{ ( ! empty($data['var'] ? $data['var'] : 'no data found') }}">

5
对于 Laravel 的最新版本,在 Blade 模板中将变量设置为可选项。 使用以下代码替换 $myvar{{ $myvar }} with {{ $myvar ?? '' }}

3
@empty指令可能会很有用:
@empty($var)
   $var is unset or false-y
@endempty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接