在 php 字符串中返回 Laravel blade 语法

Returning Laravel blade syntax in php string

我正在使用 Laravel,在我的控制器中我有一个函数 returns 一个构建的字符串:

public function getAddEditRemoveColumnData()
    {
        $projects = Project::select(['id', 'name', 'cost', 'created_at']);

        return Datatables::of($projects)
            ->addColumn('action', function ($project) {
                return '<div class="btn-group">
                            <span class="caret"></span>
                            <span class="sr-only">Toggle Dropdown</span>
                          </button>
                          <ul class="dropdown-menu">
                            <li><a href="/projects/' . $project->id . '/edit">Edit</a></li>
                            <li>
                                <a>{!! Form::open(array("url" => "projects/" . $project->id, "class" => "", "id" => "delete-form")) !!}
                                {!! Form::hidden("_method", "DELETE") !!}
                                    <button type="submit" class="btn-link delete-action" style="color:inherit; text-decoration: none;">Delete</button>
                                {!! Form::close() !!}
                                </a>
                            </li>
                          </ul>
                        </div>';
            })
            ->make(true);
    }

创建表单的 blade 语法未被评估,因为它被视为字符串文字。有什么办法可以解决这个问题并解释 blade 语法 {{ }}

我想,您正在寻找 \Blade::compileString()。此函数采用您的 blade 字符串和 returns 已编译的 php 代码。

所以你之后必须使用eval来解释php代码。

function compile($string, $args) {
    $code = \Blade::compileString($string);
    ob_start();
    extract($args);
    eval('?>' . $code);
    return ob_end_clean();
}

您可以将 html/blade 放入模板中,这样您就可以使用 View Facade/class 的 render() 功能,例如:

 $string = view('your_template_file')->render();

render() returns 编译后的模板为字符串,所以你可以尝试这样做:

public function getAddEditRemoveColumnData()
{
    $projects = Project::select(['id', 'name', 'cost', 'created_at']);

     return Datatables::of($projects)
        ->addColumn('action', function ($project) {
            return view('your_template_file', compact('project'))->render();
        })
        ->make(true);
}