让用户创建自定义 blade 布局/存储在数据库中

Let users create custom blade layouts / store in database

问题:我需要让我的web-app用户创建他们自己的blade布局模板。所以最方便的解决方案是将 blade 模板存储到数据库中。但是,我看不到从 blade file 中的布局代码 NOT SPECIFIEDextend child view 的方法。 此外,下一个问题是安全性。我不能依赖用户插入 safe code。授予插入 php 代码或直接 blade 代码的权限对系统来说是灾难性的。 那么如何呢?

  1. 在数据库中保存布局模板
  2. 确保没有任何代码部分在服务器端执行。

附带说明一下,我可以让用户在代码中提及 pre-specified 个令牌,这些令牌应由系统的结果替换。

解决方案 1: 让用户填写数据库列(在为任何可能的 php 代码过滤给定代码之后)并将其保存到 'master'文件,从中扩展最终视图。用户可以使用给定的代码进行内容替换

//master.blade.php
<html>
<head>
<%token%>
</head>
<body>
<%content%>
...
<%scripts%>
</body>
</html>

上面代码中,<%内容%>

应替换为

@yield('content')

在处理实际视图之前。

//final.blade.php
@extends('layouts.master')
@section('content')
...
@endsection

所以控制器,将数据库列内容保存到master.blade.php然后调用查看('final') 根据需要运行。

//In Controller
//Save the contents of database column in master.blade.php
return view('final',$data);

但这不是一个好的解决方案。每次请求的文件写操作、缓存问题、安全问题(如服务端执行脚本注入)等。 另一种方法是为每个用户创建一个主控,仅当用户在模板列中进行更改时才创建。因此受益于较少的文件写入操作,但服务器上的文件过载,因为 file-system.

中的每个用户都有一个文件

解决方案 2: 将用户的布局代码保存到数据库列中(无需过滤)。

//In controller
$content = View::make('final',compact('data'));
$token = "<meta name='_token' content='" . csrf_token() ."'";
$scripts = View::make('final_scripts',compact('data'));

$view = str_replace_first("<%content%>", $content, $templateInDatabase);
$view = str_replace_first("<%token%>", $token, $view);
$view = str_replace_first("<%scripts%>", $scripts, $view);

return $view;

用户应在模板代码中包含三个<%X%>标签。 好处是没有服务器端代码执行,因此增加了安全性。缓存问题最小化,因为可以缓存 final & final_scripts blade 模板。但是字符串替换会增加额外的工作量。