CakePHP3:修改所有读取的实体
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CakePHP3:修改所有读取的实体相关的知识,希望对你有一定的参考价值。
我很难找到解决问题的最佳方法。我的files
模型中有两个字段,例如file_path
和file_name
。无论何时读取file_name
字段(无论是通过get()
,find()
调用,无论是JSON还是普通视图)我都希望它被修改并返回两个字段的连接($file_name = $file_path .'/'.$file_name
)。
我想在一个地方做这个以使代码DRY。我认为这样做的一种方法是文档中指定的实体的访问器方法,但访问器仅在通过对象表示法访问实体时才起作用,并且它们不与find()
一起使用)。
有没有办法在一个地方透明地做这件事(最好是模特)?我正在研究模型事件,但无法弄清楚哪种事件在我的情况下会有用(看起来我需要像afterRead这样的东西......)
这是我尝试过的,但它不适用于finders:
namespace AppModelEntity;
use CakeORMEntity;
class File extends Entity
{
protected function _getFileName($f)
{
return $this->file_path.''.$f;
}
}
您已经为名为_getFileName($f)
的实体添加了一个方法,它将改变您的数据。它没有做你认为它做的事情。
从关于Accessors和Mutators的Cakephp手册:
https://book.cakephp.org/3.0/en/orm/entities.html#accessors-mutators
保存实体时将使用访问器,因此在定义格式化数据的方法时要小心,因为格式化数据将被保留。
因此,当您保存实体时,file_name
字段将保存为$this->file_path.''.$f
,并且每次保存时都会发生这种情况。
对于大多数CakePHP开发人员来说,这是一个非常混乱的问题。我会快速解释一下这些方法。
function _getXXXX()
返回要保存在数据库中的值。当您返回不同的值时。这意味着存储在实体对象中的值不是您希望存储在数据库中的值。这可以骗人,因为他们在视图中看到更新的值。所以他们认为它用于格式化。
function _setXXXX()
返回要分配给实体对象的值。执行此操作时,$entity->title = 'FooBar';
将调用_setTitle("FooBar")
并将返回值用作分配给实体的title
值。同样,这将保存在数据库中。
你看。这两种方法都会更改数据库中存储的内容。
使用功能
我所做的就是让它变得简单。
public function getFullFileName() {
return $this->file_path.' '.$this->file_name;
}
在您的视图中,只需调用函数echo $entity->getFullFileName()
。
支持序列化
如果需要用于序列化的自定义属性(即JSON)。上述功能方法不起作用。您需要使用virtual properties方法并使用不同的字段名称。这里的关键是虚拟属性不会与任何表列冲突。
class Document extends Entity {
protected $_virtual = ['full_path'];
public function _getFullPath() {
return $this->file_path.' '.$this->file_name;
}
}
所以在上面的例子中我们使用了一个Accessor函数。我们还将这个新的字段名称添加到$_virtual
,以便CakePHP知道包含在JSON输出中。由于名为full_path
的表模式中没有列,因此不会将其保留到数据库中。
以上是关于CakePHP3:修改所有读取的实体的主要内容,如果未能解决你的问题,请参考以下文章
CakePHP3:newEntity()Nulls Date