【问题标题】:Laravel - Blade comments , blade rendering causing page to crashLaravel - 刀片注释,刀片渲染导致页面崩溃
【发布时间】:2015-03-05 23:33:48
【问题描述】:

我正在渲染一个页面,该页面主要是 Laravel 中带有 view::make 的表单,它正在崩溃,导致 ERR_CONNECTION_RESET。经过长时间的调查和许多红鲱鱼,我开始从刀片文件中删除(不评论)随机部分以供查看,并意识到如果我

a) 删除表单此部分内的两个 {{Form}} 调用

b) 从表单的此部分周围删除{{-- and --}}

    {{--
    <div class="form-row">
      {{ Form::label('foo', 'foo:') }}
      {{ Form::text('foo') }}
    </div>
    <div class="form-row">
      {{ Form::label('foo', 'foo:') }}
      {{ Form::text('foo') }}
    </div>
    <div class="form-row">
      {{ Form::label('foo', 'foo') }}
      {{ Form::text('foo') }}
    </div>
    --}}

页面将呈现。我不确定这里到底是什么原因。上面和下面还有其他块,尽管这是一个 3-div 注释掉的部分,其他块都没有。

有人知道是什么原因造成的吗?如果这很重要,请在 WAMP 上运行。

【问题讨论】:

  • @maytham 我想我不太明白什么是主评论。您是否暗示“主评论”是导致页面崩溃的原因?
  • 好的,如果我们重新开始,您的代码之前是否正确运行,或者您正在处理一个新项目?因为如果它是新项目,那么我想知道这个表格是否与数据库有关?如果是,是用于插入或编辑数据还是两者兼而有之,我需要知道一些事实来告诉如何处理。

标签: php laravel web blade


【解决方案1】:

我们必须使用双花括号后跟双连字符。 这将适用于单行以及多行。 {{-- --}}

【讨论】:

    【解决方案2】:

    Blade 中的评论非常简单!

    {{-- Blade comments that wil not appear in the rendered HTML output --}}
    

    你可以做普通的 PHP cmets:

    <? /* some comment here */
    // or single line comments
    # or these :)
    ?>
    

    【讨论】:

      【解决方案3】:

      我试过了

      嵌套 PHP:

      {{-- <?php 
      echo "foo";
      echo "bar";
      ?> --}} 
      

      @TonyArra

      在使用 .它不评论内容并阻止编译为 HTML

      这是 htmlsource {{-- foobar --}}

      我有什么

      那是因为如果你想在 Blade 中注释 php 代码

      试试这个

      <!-- @php echo 'hai'; @endphp -->
      

      或

      <!-- <?php echo 'hai'; ?> -->
      

      并尝试查看页面源代码

      【讨论】:

        【解决方案4】:

        注意:这个答案是针对 Laravel 4.2 给出的,但仍然应该适用。 Blade 编译问题的一些特殊情况取决于 Laravel 和/或 PHP 的版本,因此最好只将 Blade cmets 用于最简单的用例。

        解决方法是只用Blade cmets做简单的注释,或者注释掉单行的Blade函数。不要在 Blade cmets 内嵌套 Blade/PHP 代码。使用标准 PHP 块 cmets 在单个注释中注释掉多行代码(PHP、HTML、多个刀片函数等)。


        有效刀片评论:

        单刀功能:

        {{-- Form::text('foo') --}}
        

        备注:

        {{-- Form Section 1 --}}
        

        无效的刀片评论:

        语法错误:

        {{-- Form::text('foo') --  }} 
        

        “@”在 Blade 注释内

        {{-- @Form::text('foo') --}} 
        

        嵌套 PHP:

        {{-- <?php 
        echo "foo";
        echo "bar
        ?> --}} 
        

        嵌套刀片:

        {{-- 
        {{ HTML::form("foo") }};
        {{ HTML::form("bar") }};
        --}} 
        

        改用 PHP 块注释。它们仍然可以在blade.php 文件中使用

        <?php /* 
        {{ HTML::form("foo") }};
        {{ HTML::form("bar") }};
        */ ?> 
        

        或者,一次注释掉你的 Blade 一行:

        {{-- HTML::form("foo") --}};
        {{-- HTML::form("bar") --}};
        

        内部:

        对于 OP 的代码,Laravel 的 Blade Compiler 会生成一个包含以下 PHP/HTML 的临时 PHP 文件:

        <?php /* 
            <div class="form-row">
              <?php echo Form::label('foo', 'foo:'); ?>
        
        <?php echo Form::text('foo'); ?>
        
        </div>
        <div class="form-row">
            <?php echo Form::label('foo', 'foo:'); ?>
        
            <?php echo Form::text('foo'); ?>
        
        </div>
        <div class="form-row">
            <?php echo Form::label('foo', 'foo'); ?>
        
            <?php echo Form::text('foo'); ?>
        
        </div>
        */ ?>
        

        Blade cmets 内部的 Blade 仍在被解析为 PHP。 PHP 块注释中的 PHP 结束标记导致 Apache 的解析器提前结束,从而导致一些格式错误的 PHP/HTML 可能导致您的连接崩溃(可能是由悬空的*/ ?&gt; 引起的)。

        ?> breaks out of PHP mode and returns to HTML mode, and // or # cannot influence that.

        使用上述任何无效的 Blade cmets 都会导致类似的编译问题。避免将 Blade cmets 用于注释或注释 Blade 功能以外的任何内容。

        【讨论】:

        • 你错了。请看一下这个例子phpfiddle.org/main/code/2uz7-sze9
        • 我对 laravel 5.1 和 PHP 7(新宅基地)有同样的问题。解决方法是使用这个 而不是这个 {{-- XXX -- }}。这表明您的想法不适用于我的情况。您只是“想象”问题出在“PHP 和/或 Apache 的版本”中。你这边没有证据。但是我这边是实验的结果,我已经提供了我的测试配置。
        • 不,这无济于事。我感谢您的奉献精神,但我们已经有了更好的答案,而这个答案具有误导性。请不要把它当作私人的。感谢您的合作。
        【解决方案5】:

        我对 laravel 5.1 和 PHP 7(新宅基地)有同样的问题。解决方法是使用这个:

        <?php /* XXX */?>
        

        而不是这个:

        {{-- XXX -- }}.
        

        【讨论】:

          【解决方案6】:

          我有类似的症状,似乎与评论的长度有关。我用完全不包含任何 PHP 代码或刀片语句的注释对其进行了测试:

          {{--
          0123456789abcdef
          0123456789abcdef
          0123456789abcdef
          --}}
          

          我不断添加重复行的副本,直到它崩溃。注释后面跟着一个刀片@if 语句,对应的&lt;php if(...): ?&gt; 并没有出现在编译的模板中,但是结束的&lt;?php endif; ?&gt; 出现了,导致语法上无效的编译模板.

          这似乎是刀片编译器中的一个错误,我会报告它。

          解决方法是用 --}}{{-- 分割长刀片 cmets。

          【讨论】:

          • 我很确定你和我遇到了同样的错误,但我不是 100% 确定它与原始问题中的错误相同。症状是相似的,但让我怀疑原因是共享的事实是,在我的应用程序中,这个问题只是在迁移到 PHP 7 后才开始出现,这与您的经验一致。所以很可能 PHP 版本毕竟是相关的,而不是 TonyArra 所相信的方式。 (1/2)
          • 我还没有检查刀片编译器代码,但我怀疑刀片 cmets 处理或多或少是作为修改输入流的 hack 实现的,并且它错误计算了所需片段的长度取代。对此的一个强烈暗示是,换行似乎总是算作实验确定的破损限制的 2 个字符,即使我在 Linux 上并且我的换行只是\n,而不是\r\n。 (2/2)
          • 哦,如果你还有这个环境,可以试试 Laravel 5.2,听说可以解决问题。我已经回到了以前的宅基地,我太忙了,不能试一试。
          • 你是对的,这可能是最初的问题中的另一个问题,因为它是在一年前提出的,当时还没有 PHP-7。谢谢。
          • 抱歉,由于我们的代码库已经更改,并且很久没有出现该错误,因此我无法确认您的回答。
          【解决方案7】:

          像这样的刀片 cmet 是我的问题:

          {{--    
              @if ($test)
                  <div>something</div>
              @else
                  <div>something else</div>
              @endif
          --}}
          

          【讨论】:

            猜你喜欢
            • 2016-04-04
            • 2018-10-03
            • 2023-04-08
            • 1970-01-01
            • 1970-01-01
            • 2013-05-08
            • 2016-02-27
            • 1970-01-01
            • 2014-08-14
            相关资源
            最近更新 更多