Cakephp3中控制器的可重用代码

时间:2017-01-12 07:45:10

标签: php cakephp cakephp-3.0

我想在“Cakephp方式”中在控制器中创建可重用的代码。我想在渲染网站之前替换少数控制器中的一个字段。例如,我想替换字段“body”中的字符串。我可以在show方法中这样做:

public function show($id = null) {
  $site = $this->Sites->findById($id)->first();
  $new_value = 'test2';
  $site['body'] = str_replace('test', $new_value, $site['body']);
}

有没有更好的方法以cakephp方式执行此操作,例如initalize方法或beforeRender?我不能在这里使用行为。

编辑: 我知道组件,但如何使用它替换所有控制器方法的所有$ site ['body](在我的代码中)(所以我想自动执行此操作,如实体的行为)?

3 个答案:

答案 0 :(得分:2)

了解Components

  

组件是控制器之间共享的逻辑包。 CakePHP带有一套出色的核心组件,可用于辅助各种常见任务。您还可以创建自己的组件。如果您发现自己想要在控制器之间复制和粘贴内容,则应考虑创建自己的组件以包含该功能。创建组件可以保持控制器代码的清洁,并允许您在不同的控制器之间重用代码。

请参阅Component Callbacks

答案 1 :(得分:1)

您可以使用组件

https://book.cakephp.org/3.0/en/controllers/components.html

不要忘记在appController或您需要的地方加载

编辑后:

@nexequ

也许你在appController中设置了beforeRender

public function beforeRender()
{
    debug($this->request);
}

在$ this-> request->数据数组中,您需要替换数据。

例:

data => array(
        'Reunion' => array(
            'begin' => '2017-01-13 20:00:00',
            'end' => '2017-01-13 20:30:00'
        )

如果您找到了获取模型的方法(在我的示例中为“Reunion”。)

你可以做一个像

这样的技巧

替换 - > $这 - >请求 - >数据[$模型] [ '体']

答案 2 :(得分:-1)

我找到了burzum帮助的解决方案,我可以在src / Model / Entity中使用虚拟属性:

protected function _getBody() {
  $new_value = 'test2';
  $test = str_replace('test2', $new_value, $this->_properties['body']);
  return $test;
}

它将取代例如' test2'在所有控制器方法中使用$ new_value。