【问题标题】:Save blade templates to database rather than file将刀片模板保存到数据库而不是文件
【发布时间】:2016-11-24 04:37:40
【问题描述】:

我想将我的blade 模板保存到数据库,因为每个页面的header and footer 为用户is customizable。我想让我的用户自己创建布局,然后对于来自给定用户的每个请求,我想使用该用户指定的布局来提供页面。

控制器传递的必要变量在文档中提供给它们。

注意:我信任我的用户。他们都是项目的利益相关者,都是程序员,所以服务器端代码执行是可以接受的。

【问题讨论】:

    标签: php laravel laravel-5 blade


    【解决方案1】:

    虽然这是一篇旧帖子,但以防万一有人像我一样偶然发现它。我在使用 Laravel 框架时实现了类似的效果,方法是将视图保存在数据库中,这样,每当我需要显示视图时,我就从数据库中检索它,并使用 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】:

      我意识到如果我只让他们插入静态内容,我可以提高安全性和缓存。我唯一需要改变的是主要内容,所以我可以让他们设置一个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,因为我在我的blade 模板中使用bootstrap styles,但在我的情况下这是可以接受的。

      【讨论】:

      • 但是字符串替换也是开销。但我也不知道有什么更好的解决方案。
      【解决方案3】:

      几天前我问并回答了一个类似的问题。据我所知,Blade 不处理来自数据库列的视图内容。虽然您可以使用 View 的 compileString() 方法。但是你应该看看以下问题。

      Extend Blade Template from Database stored string

      Let users create custom blade layouts / store in database

      【讨论】:

      • 我应该去保存每个请求的模板然后处理它吗? @huzaib-shafi
      • 我绝对不鼓励这样做,因为它涉及资源使用。我认为你应该选择token 概念
      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 2020-05-19
      • 2018-12-05
      相关资源
      最近更新 更多