cakePHP 3.0 在保存时忽略实体访问器

cakePHP 3.0 ignore entity accessors on save

我正在将项目从 2.x 转换为 3.x。一周后,我终于开始掌握新的 ORM,除了...

我现在不想尝试做曾经可以通过模型中的 afterFind 生命周期回调轻松实现的事情。

我有一个 Files table 和 createdmodified DATETIME 列。我在 FilesTable class 中使用蛋糕的时间戳行为。到目前为止一切正常。

当我尝试在 File 实体 class 中使用访问器 _getModified($modified) 来格式化任一字段时,问题就开始了。它在检索已经采用正确 DATETIME 格式的现有记录时工作正常,但是当我尝试保存任何新内容时,它会尝试保存访问者的格式化版本,而不是时间戳行为的版本,这会导致 0000-00-00 00:00:00正在得救。

简而言之:我希望在 inserting/updating 记录时忽略访问器。

这是我的 File 实体 class:

class File extends Entity {
    protected function _getModified($modified) {
        $today = date("m-d-y");
        $year = date("Y");
        $file_day = date("m-d-y", strtotime($modified));
        $file_year = date("Y", strtotime($modified));

        if( $today === $file_day){
            return 'Today ' . date('g:ia', strtotime($modified)); 
        } else if ($year !== $file_year) {
            return date('M j, Y', strtotime($modified));
        } else {
            return date('M j, g:ia', strtotime($modified));  
        }
    }
}

在此先感谢您的帮助!

您应该考虑创建 虚拟 属性,例如

protected function _getFormattedDate()
{
    // Move here code from _getModified
    // $modified = $this->_properties['modified']
}

删除您的 _getModified 方法并让时间戳行为控制 accessors/mutators for modified 属性

Entities > Creating Virtual Properties

注意:将实体转换为JSON或数组时,必须显式列出应导出到结果的虚拟字段。在这种情况下,将其添加到实体 Class

protected $_virtual = ['formatted_date'];

Entities > Exposing Virtual Properties