使用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还是有另一种方式?
答案 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;
});