Laravel - 刀片注释,刀片渲染导致页面崩溃
Posted
技术标签:
【中文标题】Laravel - 刀片注释,刀片渲染导致页面崩溃【英文标题】:Laravel - Blade comments , blade rendering causing page to crash 【发布时间】: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 我想我不太明白什么是主评论。您是否暗示“主评论”是导致页面崩溃的原因? 好的,如果我们重新开始,您的代码之前是否正确运行,或者您正在处理一个新项目?因为如果它是新项目,那么我想知道这个表格是否与数据库有关?如果是,是用于插入或编辑数据还是两者兼而有之,我需要知道一些事实来告诉如何处理。 【参考方案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 可能导致您的连接崩溃(可能是由悬空的*/ ?>
引起的)。
?> 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
语句,对应的<php if(...): ?>
并没有出现在编译的模板中,但是结束的<?php endif; ?>
出现了,导致语法上无效的编译模板.
这似乎是刀片编译器中的一个错误,我会报告它。
解决方法是用 ---- 分割长刀片 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
--
【讨论】:
以上是关于Laravel - 刀片注释,刀片渲染导致页面崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 4刀片模板导致FatalErrorException?