【问题标题】:Laravel Blade - custom method for html block?Laravel Blade - html 块的自定义方法?
【发布时间】:2016-04-17 10:56:00
【问题描述】:

是否可以创建自己的刀片方法/标签或解决方案是什么?

例如在一个刀片文件中,它将包含多个form-block 块,如下所示:

<section class="container-fluid container-fixed-lg form-block">
    <div class="row b-b b-grey">
        <div class="col-xs-12 col-md-3 m-r-35">
            <h2>Title</h2>
            <p>Some content here</p>
        </div>
        <div class="col-xs-12 col-md-7">
            <div class="panel panel-default">
                <div class="panel-body">
                    // Custom Block Here
                </div>
            </div>
        </div>
    </div>
</section>

有没有办法提高在刀片文件中的可读性/可维护性:

@form-block('Title','Some content here')
   // Custom Block Here
@end-form-block

【问题讨论】:

    标签: php laravel laravel-5 laravel-blade


    【解决方案1】:

    您可以在刀片中编写自己的custom directives 来做任何您想做的事情。

    您的示例看起来像是在尝试生成表单。 This is a package 这可能会有所帮助。它是 Laravel 5 中移除的表单/html 生成器,现在得到社区的支持。

    【讨论】:

    • 我在问题中没有看到任何形式的使用。
    • 他的刀片指令叫做form-block
    • 刀片文件中将包含许多form-block,而panel-body 块中将包含许多html 输入。我认为您可以通过提供自定义指令示例来改进您的答案。
    【解决方案2】:

    自定义刀片指令,因为它们被称为,写起来有点脏,因为您必须返回一个包含 HTML 的字符串,以及可能会运行的 PHP 代码。更脏的是你没有单独获取参数,你只得到一个像"('Title', 'Some content')" 这样的字符串作为指令的输入。我刚刚发现的一个技巧是您可以使用数组语法来分隔参数。

    Blade::directive('formblock', function ($expression) {
        return '
      <section class="container-fluid container-fixed-lg form-block">
          <div class="row b-b b-grey">
              <div class="col-xs-12 col-md-3 m-r-35">
                  <h2><?=array' . $expression . '[0];?></h2>
                  <p><?=array' . $expression . '[1];?></p>
              </div>
              <div class="col-xs-12 col-md-7">
                  <div class="panel panel-default">
                      <div class="panel-body">
    ';
    });
    
    Blade::directive('endformblock', function () {
        return '
                      </div>
                  </div>
              </div>
          </div>
      </section>
    ';
    });
    

    正如我所说,它很脏,但这会起作用。请注意,您不能在指令名称中使用破折号,这就是为什么我称它们为 formblockendformblock 而不是 form-blockend-form-block

    更简单的方法是只使用@include 指令来包含部分。但是,您必须在刀片文件中编写的代码有点冗长:

    @include('partials.form_block_start', ['title' => 'My Title', 'content' => 'The extra content..']);
    Main content...
    @include('partials.form_block_end');
    

    然后在views/partials/form_block_start.blade.phpviews/partials/form_block_end.blade.php中创建两个文件。在第一个中,您可以只使用标题和内容作为变量$title$content。请参阅https://laravel.com/docs/5.2/blade#control-structures 了解更多信息。

    【讨论】:

    • 谢谢!如果你要为你的项目做类似的事情,你会怎么做?
    • 我想我会使用带有 @include 指令的部分。检查我的更新答案!
    • 太棒了,我从来不知道@include 支持参数。我肯定会使用它。谢谢!
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 2014-10-03
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2015-09-13
    • 2019-02-19
    相关资源
    最近更新 更多