Php Laravel-刀片注释,刀片渲染导致页面崩溃

Php Laravel-刀片注释,刀片渲染导致页面崩溃,php,laravel,web,blade,Php,Laravel,Web,Blade,我在Laravel中呈现一个主要是带有view::make的表单的页面,它正在崩溃,导致错误连接重置。经过长时间的调查和大量的转移注意力后,我开始从blade文件中删除(而不是评论)视图的随机部分,并意识到如果我 a) 擦除表单此部分中的2个{{Form}调用 b) 从表单的此部分周围删除{--and--} {{-- <div class="form-row"> {{ Form::label('foo', 'foo:') }} {{ Form:

我在Laravel中呈现一个主要是带有
view::make
的表单的页面,它正在崩溃,导致错误连接重置。经过长时间的调查和大量的转移注意力后,我开始从blade文件中删除(而不是评论)视图的随机部分,并意识到如果我

a) 擦除表单此部分中的2个
{{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>
    --}}
{{--
{{Form::label('foo','foo:')}
{{Form::text('foo')}
{{Form::label('foo','foo:')}
{{Form::text('foo')}
{{Form::label('foo','foo')}
{{Form::text('foo')}
--}}
页面将呈现。我不确定到底是什么原因造成的。上面和下面还有其他块,尽管这是一个3-div注释掉的部分,其他块都没有

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

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

解决方案是仅对简单注释使用刀片注释,或注释掉单行刀片函数。不要在Blade注释中嵌套Blade/PHP代码。使用标准PHP块注释在一条注释中注释出多行代码(PHP、HTML、多刀片函数等)。


有效的刀片评论:

{{-- HTML::form("foo") --}};
{{-- HTML::form("bar") --}};
单刀片功能:

备注:


无效刀片评论:

{{-- HTML::form("foo") --}};
{{-- HTML::form("bar") --}};
语法不正确:

刀片评论内的“@”

嵌套PHP:

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

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

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

内部构件:

{{-- HTML::form("foo") --}};
{{-- HTML::form("bar") --}};
对于OP的代码,Laravel的Blade编译器将生成一个临时PHP文件,其中包含以下PHP/HTML:

<?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>
*/ ?>

*/ ?>
刀片注释中的刀片仍在解析为PHP。PHP块注释中的PHP end标记导致Apache解析器提前结束,导致一些格式错误的PHP/HTML可能会破坏您的连接(可能是由于悬挂的
*/?>


使用上述任何无效刀片注释都会导致类似的编译问题。避免对除注释或注释刀片功能以外的任何内容进行刀片注释。

像这样的刀片注释是我的问题:

{{--    
    @if ($test)
        <div>something</div>
    @else
        <div>something else</div>
    @endif
--}}
{{--
@如果($测试)
某物
@否则
别的
@恩迪夫
--}}

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

{{--
0123456789abcdef
0123456789abcdef
0123456789abcdef
--}}
我不断添加重复行的副本,直到它崩溃。注释在词汇上后跟一个blade
@if
语句,相应的
没有在编译模板中结束,但是结尾的
没有,导致编译模板在语法上无效

这似乎是刀片编译器中的一个bug,我将报告它


解决方法是使用--}{{--.

拆分长刀片注释。我对laravel 5.1和PHP 7(新家园)有相同的问题。解决方法是使用以下内容:

<?php /* XXX */?>
我已经试过了

嵌套PHP:

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



并尝试查看页面源

Blade中的评论非常简单

{{-- Blade comments that wil not appear in the rendered HTML output --}}
您可以执行以下操作之一:

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

@maytham我想我不太明白什么是大师评论。你是在暗示“大师评论”吗是什么导致页面崩溃?好的,如果我们重新开始,你的代码在你开始一个新项目之前是否正确工作?因为如果它是一个新项目,那么我想知道这个表单是否与数据库相关?如果是,是用于插入或编辑数据还是两者,我需要知道一些事实来告诉如何处理。你We’错了。请看一下这个例子@YevGeniyafanasysev,正如我在回答中所说的,这可能是由PHP/Apache的版本决定的。无论如何,在Laravel中,将PHP或嵌套刀片封装在刀片注释中似乎有问题。我对Laravel 5.1和PHP7(新家园)也有同样的问题。解决的办法是使用这个而不是这个{{--XXX--}。这表明你的想法不适用于我的情况。你只是“想象”问题出在“PHP和/或Apache版本”。你方面没有证据。但我方面是实验结果,我提供了我的测试配置。“解决的办法是使用这个而不是这个{--XXX--}。”这不是我的答案吗…?我说过不要将PHP/Blade封装在Blade注释中。我们说的是同样的事情。事实上,你可以使用PHP块注释作为Blade注释的替代,但我可以编辑粗体文本来明确说明这一点,如果它有帮助的话。我很确定你和我遇到了相同的错误,但我不是100%确定我遇到了相同的错误这与最初的问题中的错误是一样的。症状类似,但让我怀疑原因是否相同的是,在我的应用程序中,这个问题是在迁移到PHP7之后才开始出现的,这与您的经验是一致的。因此很可能PHP版本毕竟是相关的,而不是TonyArra believ的方式ed.(1/2)我还没有检查blade编译器代码,但我怀疑blade注释处理或多或少是作为修改输入流的黑客实现的,它错误地计算了需要替换的片段的长度。这方面的一个强烈提示是,换行符alwa
{{-- XXX -- }}.
{{-- <?php 
echo "foo";
echo "bar";
?> --}} 
<!-- @php echo 'hai'; @endphp -->
<!-- <?php echo 'hai'; ?> -->
{{-- Blade comments that wil not appear in the rendered HTML output --}}
<? /* some comment here */
// or single line comments
# or these :)
?>