【问题标题】:How to include a blade template only if it exists?如何仅在刀片模板存在时才包含它?
【发布时间】:2015-11-13 03:39:55
【问题描述】:

如果刀片模板存在,如何@include only? 我可以做这样的事情:

@if (File::exists('great/path/to/blade/template.blade.php'))
   @include('path.to.blade.template')
@endif

但这确实不够优雅和高效。

我可以在没有 if 语句的情况下包含它,如果文件不在这里,我可以捕获并隐藏错误,但这有点脏,如果不是野蛮的话。

这样的事情会很棒:

@includeifexists('path.to.blade.template')

(伪代码,但是这个刀片命令不存在)

【问题讨论】:

  • 您当然可以通过添加自定义函数来隐藏if 语句来extend Blade,但我认为只有在您有大量此类案例可以使用它时才值得。
  • 我只是想知道你为什么要包含一些不存在的东西或者你想要解决的场景是什么?
  • @mdamia :我有数百页,结构相同。有些有部分文件。我只为需要它的页面包含部分内容。我可以使用两个模板:一个包含需要它的页面的包含指令,另一个没有。但是第一种方式的逻辑更简单。
  • 警告:只有在绝对需要时才使用所描述的东西。关于它的两个缺点:首先,由于它不是标准方法,您的同事首先会感到困惑 - 这不符合 KISS 原则。其次,我猜这会导致页面稍微变慢,因为 PHP 必须检查文件是否存在才能包含它(我猜)。

标签: laravel blade


【解决方案1】:

有类似的问题。原来有一个@includeIf刀片指令用于此目的。

只需@includeIf('path.to.blade.template')

【讨论】:

  • 这应该是公认的答案。
【解决方案2】:

您可以使用View::exists() 来检查视图是否存在。

@if(View::exists('path.to.view'))
    @include('path.to.view')
@endif

或者你可以扩展刀片并添加新指令

Blade::directive('includeIfExists', function($view) {

});

在这里查看官方文档:http://laravel.com/docs/5.1/blade#extending-blade

【讨论】:

  • 这是正确的。在您的第一个示例中,您错过了包含参数末尾的 '。
【解决方案3】:

在控制器中需要时 (from this documentation):

确定视图是否存在如果您需要确定视图是否存在 存在,你可以在调用视图助手后使用exists方法 没有论据。如果视图存在于 磁盘:

use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
    \\
}

【讨论】:

    【解决方案4】:

    Laravel >= 7,有指令includeIf

    @includeIf('view.name', ['some' => 'data'])
    

    https://laravel.com/docs/7.x/blade#including-subviews

    【讨论】:

      【解决方案5】:

      晚了,但还有另一个非常方便的模板功能:

      当模板存在时,您通常希望包含一个模板,如果没有,包含一些其他模板。这可能会导致非常丑陋的 if-then 结构,即使您使用 '@includeIf' 也是如此。你也可以这样做:

      @includeFirst([$variableTemplateName, "default"]);

      这将包括 - 正如函数名称所暗示的 - 找到的第一个模板。

      【讨论】:

        猜你喜欢
        • 2014-05-14
        • 2018-03-25
        • 2020-11-21
        • 1970-01-01
        • 2011-01-22
        • 2019-09-23
        • 1970-01-01
        • 1970-01-01
        • 2012-12-26
        相关资源
        最近更新 更多