LaravelCollective/html 使用双花括号转义不一致

LaravelCollective/html escape inconsistency with double curly braces

On Laravel 5.8 我可以使用双花括号转义字符串 {{ "<script>alert('does not work');</script>" }} 或变量 {{ $comment }}

但是,如果我使用 LaravelCollective/html 包来创建 html 元素,双花括号不会转义任何内容。 {{ Form::input('edit', 'test') }} 创建输入。

LaravelCollective/html 是如何做到这一点的,或者这是 Blade 语法本身的一个例外? {{ }} 是一种安全的方式来逃避任何东西,如果它有时被逃脱,有时又不是?我可以自定义 class 来愚弄 Laravel 以为我正在使用 LaravelCollective/html 并使用自定义 class/object 和 {{ }} 打印未转义的内容吗?

似乎 LaravelCollective/html 通过向 BladeCompiler::directive() 注册自定义处理程序来实现此目的,因此这是 Blade 提供的扩展功能。因此,使用 {{ }} 转义和使用 LaravelCollective 创建 html 元素是安全的。

作为参考,这里是 LaravelCollective/Html 中 HtmlServiceProvider.php 的片段,说明了它是如何完成的。

/**
 * Register Blade directives.
 *
 * @return void
 */
protected function registerBladeDirectives()
{
    $this->app->afterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) {
        $namespaces = [
            'Html' => get_class_methods(HtmlBuilder::class),
            'Form' => get_class_methods(FormBuilder::class),
        ];

        foreach ($namespaces as $namespace => $methods) {
            foreach ($methods as $method) {
                if (in_array($method, $this->directives)) {
                    $snakeMethod = Str::snake($method);
                    $directive = strtolower($namespace).'_'.$snakeMethod;

                    $bladeCompiler->directive($directive, function ($expression) use ($namespace, $method) {
                        return "<?php echo $namespace::$method($expression); ?>";
                    });
                }
            }
        }
    });
}