我想在“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](在我的代码中)(所以我想自动执行此操作,如实体的行为)?
答案 0 :(得分:2)
了解Components。
组件是控制器之间共享的逻辑包。 CakePHP带有一套出色的核心组件,可用于辅助各种常见任务。您还可以创建自己的组件。如果您发现自己想要在控制器之间复制和粘贴内容,则应考虑创建自己的组件以包含该功能。创建组件可以保持控制器代码的清洁,并允许您在不同的控制器之间重用代码。
答案 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。