You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Blade代码看似无误却频繁报hasEvenNumberOfParentheses错误

Laravel Blade编译报错:括号数量检测异常解决方法

问题场景

项目中使用以下Blade代码片段:

@if (isset($scripts) && is_array($scripts))
    @foreach ($scripts as $script)
        <script src="{{ $script }}"></script>
    @endforeach
@endif

每次修改保存文件后,需等待30秒以上并生成大量日志,最终抛出报错:

PHP  66. Illuminate\View\Compilers\BladeCompiler->hasEvenNumberOfParentheses($expression = '@if (isset($scripts) && is_array($scripts)') /Users/[user]/Documents/GitHub/[repo]/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:541
PHP  67. token_get_all($code = '<?php @if (isset($scripts) && is_array($scripts)') /Users/[user]/Documents/GitHub/[repo]/vendor/laravel/framework/src/Illuminate/View/Compilers/BladeCompiler.php:606

移除这段代码后文件可立即重载,但即使添加其他看似括号数量正确的@if、@foreach等Blade指令,仍会触发相同问题。

解决步骤

  • 检查Blade文件语法与编码
    排查文件是否存在不可见特殊字符(比如全角括号、零宽空格),这些字符会导致Blade编译器解析括号时出错。可以用文本编辑器的"显示所有字符"功能查看,或者将代码复制到纯文本编辑器后重新粘贴回文件。
    同时确认文件编码为UTF-8无BOM,BOM头可能干扰编译器的语法解析。

  • 清理Blade缓存
    手动删除Laravel的Blade缓存文件,路径通常为storage/framework/views/下的所有文件。执行命令:

    rm -rf storage/framework/views/*
    

    或者用Artisan命令:

    php artisan view:clear
    

    缓存文件损坏也可能导致编译逻辑异常。

  • 排查Laravel框架版本问题
    如果使用的Laravel版本存在Blade编译器的括号解析bug(比如特定版本的hasEvenNumberOfParentheses方法逻辑缺陷),可以尝试:

    • 升级Laravel到最新稳定版本,官方更新通常会修复这类解析问题;
    • 临时替换BladeCompiler.php中的hasEvenNumberOfParentheses方法(仅作临时测试,不推荐长期使用),修改为更健壮的括号计数逻辑:
      protected function hasEvenNumberOfParentheses($expression)
      {
          $count = substr_count($expression, '(') - substr_count($expression, ')');
          return $count === 0;
      }
      

    注意:修改vendor文件后,后续composer更新会覆盖此修改,优先选择升级框架。

  • 检查视图文件的嵌套结构
    有时候其他位置的未闭合括号(比如之前的Blade指令漏写了@endif/@endforeach)会导致编译器解析当前代码时出现上下文错误。检查整个视图文件及引入的子视图,确保所有Blade指令的嵌套和闭合都正确。

内容的提问来源于stack exchange,提问作者Anshu Shrestha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:27:46