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 可能导致您的连接崩溃(可能是由悬空的*/ ?&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
--

【讨论】:

以上是关于Laravel - 刀片注释,刀片渲染导致页面崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Laravel刀片:模板无法渲染

Laravel 4刀片模板导致FatalErrorException?

Laravel 5刀片在出现错误而不是抛出异常时显示空白页面

在 laravel 刀片中解析数组

Laravel 刀片模板不使用 slug 渲染

laravel5.1 - 刀片模板不渲染