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
相关产品推荐
相关产品推荐

