如何在不破坏MVC的情况下将格式化文本保存在控制器中?

时间:2017-06-20 15:14:46

标签: cakephp cakephp-3.0

我们说我有一个Comments模型,其中有一个名为text的字段,可以存储格式化的(html)文本

大多数情况下,此文字来自表单,并且像往常一样保存Comments->patchEntity()等等...

有时我会自动生成评论。现在我在控制器中创建该内容。这样的事情(注意这是一个过于简单的例子):

 // PostsController


 public function view($id)
 {
     //
     //
     // if Post views are >= 1 billion 

     $comment = $this->Comments->newEntity();
     $comment->text = "<strong>Congratulations!</strong> your Post just    
               hit 1 billion views! This is an auto generated 
               comment";
     $this->Posts->Comments->save($comment);
 }

我知道这是错误的,它违背了MVC模式

此外,我无法在控制器中使用HtmlHelper,因此我必须手动创建html标签。

我已经看过this问题,但这似乎不是一个干净的方法(也是蛋糕2的问题)

那么:在没有打破MVC的情况下,实现我已经做过的更干净的方法是什么?

其他信息

问题一般是关于如何使用cakephp 3将生成的(HTML)内容保存到数据库。以上只是一个示例:我可以将该代码移动到afterSave方法或创建一个监听器。我可以使用Element或Helper来生成内容(或者更可能是两者)

我认为应该有类似于Email类的方式:我可以在我的代码(控制器,模型,监听器)中的任何地方调用Email(),并使用模板生成电子邮件正文。我想做同样的事情并保存到DB

我为什么需要这个?

也许这是一个XY问题,所以这是我的实际问题

我有一个非常复杂的视图,它取决于许多表中存储的记录。我希望每次发生更改时跟踪此视图的历史记录,因此我的想法是创建一个侦听器,将此侦听器附加到创建视图所涉及的每个表,并在每次存在时保存视图的快照。更新

1 个答案:

答案 0 :(得分:0)

所以,按照@ndm的建议,这就是我所做的

 $vars = [/* my viewVars here */]
 $view = new ViewBuilder();
 $content = $view->setTemplate("path_to_my_template")
    ->setLayout(false) // I need an empty layout
    ->setHelpers(['Number'])  // I need some additional helper
    ->build($vars)  //here I pass my vars to the template
    ->render();

通过这种方式,我可以获得我生成的内容。我可以在模型或事件侦听器中使用以上代码。即在模型中我可以做到

$entity = $this->newEntity():
$entity->content = $content;
$this->save($entity);