我想将blade
模板保存到数据库,因为用户每页header and footer
is customizable
。我想让我的用户自己创建布局,然后对于给定用户的每个请求,我想使用该用户指定的布局来提供页面。
控制器传递的必要变量将在文档中提供给他们。
注意:我相信我的用户。他们都是项目的利益相关者,也是程序员,所以服务器端代码执行是可以接受的。
答案 0 :(得分:1)
我意识到如果我只让他们插入静态内容,我可以提高安全性和缓存。我唯一需要改变的是主要内容,所以我可以让他们设置一个token
来放置内容。正如@ huzaib-shafi的上述回答,我做了以下......
//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;
这会强制他们在模板中使用bootstrap
,因为我在bootstrap styles
模板中使用blade
,但在我的情况下这是可以接受的。
答案 1 :(得分:1)
虽然这是一篇很老的帖子,但万一有人会像我一样偶然发现它。我在使用Laravel Framework时实现了类似的功能,通过在数据库中保存视图,每当我需要显示视图时,我从DB检索它,并使用file_put_contents()
php函数将其加载到文件中并渲染它使用view()
方法。例如;
$blade = DB::table('pages')->where('name', 'index')->first();
file_put_contents('template.blade.php', $blade->view);
//Note if I also need to pass data to the view I can also pass it like so
//$data = ['page_title' => 'Testing Blade Compilation using views Saved in DB'];
// return view(template, $data);
return view('template');
在我自己的情况下,为了增加安全性,我使用刀片模板方案创建了基本模板。在使用HTMLPurifier清理生成的输入并渲染视图后,注入用户创建的输入到模板中。例如
$view = view('base.template')->render();
//similarly like the above I can load any data into the view like so
//$data = ['page_title' => 'Testing Blade Compilation using views Saved in DB'];
//$view = view('base.template', $data)->render();
$purifier = new HTMLPurifier(HTMLPurifier_Config::createDefault());
$with_purified_input = $purifier->purify($user_generated_input);
str_replace('view_variable', $with_purified_input, $view);
return $view;
答案 2 :(得分:0)
前几天我问过并回答了类似的问题。据我所知,Blade不会处理来自数据库列的视图内容。虽然可以使用View的compileString()方法。但是你应该看看以下问题。