检查是否存在视图并在Laravel Blade中执行@include

时间:2016-02-04 10:07:06

标签: laravel laravel-5 blade laravel-blade

使用Laravel Blade,在执行@include之前是否有一种优雅的方法来检查视图是否存在?

例如,我目前正在这样做:

@if(View::exists('some-view'))
    @include('some-view')
@endif

当'some-view'是一个包含变量的长字符串时,这会非常麻烦。

理想情况下,我正在寻找类似的东西:

@includeifexists('some-view')

或者如果视图不存在,则使@include只输出一个空字符串。

另外,我还想提供一组视图,并使用第一个视图,例如:

@includefirstthatexists(['first-view', 'second-view', 'third-view'])

如果不存在,则输出空字符串。

我该怎么做呢?我需要扩展BladeCompiler还是有另一种方式?

2 个答案:

答案 0 :(得分:16)

有类似的问题。事实证明,从Laravel 5.3开始,为此目的有一个@includeIf刀片指令。

只需@includeIf('some-view')

答案 1 :(得分:1)

我创建了此Blade指令以包括存在的第一个视图,如果不存在任何视图,则不返回任何内容:

Blade::directive('includeFirstIfExists', function ($expression) {

        // Strip parentheses
        if (Str::startsWith($expression, '(')) {
            $expression = substr($expression, 1, -1);
        }

        // Generate the string of code to render in the blade
        $code = "<?php ";
        $code .= "foreach ( {$expression} as \$view ) { ";
        $code .=  "if ( view()->exists(\$view) ) { ";
        $code .= "echo view()->make(\$view, \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ";
        $code .= "break; } } ";
        $code .= "echo ''; ";
        $code .= "?>";

        return $code;
    });