问题:我需要让我的网络应用用户创建自己的刀片布局模板。因此,最方便的解决方案是将刀片模板存储到数据库中。但是,我从extend
中的布局代码view
中看不到NOT SPECIFIED
孩子blade file
的方法。
此外,下一个问题是安全问题。我不能依赖用户插入safe code
。允许访问插入php
代码或直接blade
代码对系统来说是灾难性的。
那怎么样?
作为旁注,我可以让用户在代码中提到预先指定的令牌,这些令牌将被系统的结果取代。
答案 0 :(得分:-2)
解决方案1:让用户填写数据库列(在过滤任何可能的PHP代码的给定代码之后)并将其保存到“主”文件中,从中扩展最终视图。用户可以使用给定代码进行内容替换
//master.blade.php
<html>
<head>
<%token%>
</head>
<body>
<%content%>
...
<%scripts%>
</body>
</html>
在上面的代码中,&lt;%content%&gt;
应替换为
@yield( '内容')
在处理实际视图之前。
//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);
但这不是一个好的解决方案。每个请求的文件写操作,缓存问题,安全问题(如服务端执行脚本注入)等。 另一种方法是为每个用户创建一个主服务器,仅在用户在模板列中进行更改时创建。因此受益于较少的文件写入操作,但服务器上的文件过载,因为文件系统中的每个用户都有一个文件。
解决方案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;
应使用户在模板代码中包含三个&lt;%X%&gt; 标记。 好处是没有服务器端代码执行,因此增加了安全性。缓存问题最小化为 final &amp;可以缓存 final_scripts 刀片模板。但是字符串替换会增加额外的工作量。