我有个突变者:
protected function _setPurchaseTime($purchase_time) {
return Time($purchase_time);
}
当我像这样设置值时,这个mutator运行得很好:
$transaction->purchase_time = $this->request->data['purchase_time'];
变送器正确地获得$purchase_time
。但当我试图把它设置成这样:
$transaction = $this->Transactions->patchEntity($transaction, $this->request->data);
$purchase_time
为空。我搞不懂为什么会这样?mutator运行得很好,但是变量为null。
编辑:
我还要补充一点,purchase_time
是可访问的:
protected $_accessible = [
'ticker' => TRUE,
'name' => TRUE,
'market' => TRUE,
'transaction_type' => TRUE,
'price' => TRUE,
'currency' => TRUE,
'commission' => TRUE,
'shares' => TRUE,
'purchase_time' => TRUE
];
编辑:添加额外数据
这是进入patchEntity的数据:
[
'ticker_label' => 'AAPL (Apple Inc.)',
'ticker' => 'AAPL',
'currency' => 'USD',
'market' => 'NASDAQ',
'transaction_type' => 'Buy',
'price' => '10',
'commission' => '10',
'shares' => '10',
'date' => 'Yesterday',
'purchase_time' => 'July 12, 2015 12:00',
'time' => '12:00',
'name' => 'Apple Inc.'
]
这是运行patchEntity之后的数据:
object(App\Model\Entity\Transaction) {
'portfolio_id' => '43',
'ticker' => 'AAPL',
'currency' => 'USD',
'market' => 'NASDAQ',
'transaction_type' => 'Buy',
'price' => (float) 10,
'commission' => (float) 10,
'shares' => (float) 10,
'purchase_time' => (int) 1436803512,
'name' => 'Apple Inc.',
'[new]' => true,
'[accessible]' => [
'ticker' => true,
'name' => true,
'market' => true,
'transaction_type' => true,
'price' => true,
'currency' => true,
'commission' => true,
'shares' => true,
'purchase_time' => true
],
'[dirty]' => [
'portfolio_id' => true,
'ticker' => true,
'currency' => true,
'market' => true,
'transaction_type' => true,
'price' => true,
'commission' => true,
'shares' => true,
'purchase_time' => true,
'name' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Transactions'
}
如您所见,如果您在purchase_time
字段中进行Unix时间戳的转换,则它不等于输入。它等于现在的时间,当将一个NULL
值传入Time()
时,这是预期的。
发布于 2015-07-15 09:57:56
问题是,DatetimeType
类在CakePHP中需要标准化格式的输入。作为数组(表单输入)或ISO格式的字符串。
由于您是以本地化格式提供输入,所以您需要启用地区解析器、以ISO格式发送输入、在数据转换为日期时间之前转换数据,或者扩展DateTimeType
类以满足您的需要。
这样做的一个简单方法是使用Model.beforeMarshal
事件:
$table->eventManager()->on('Model.beforeMarshal', function ($event, $data) {
if (!empty($data['the_time_field']) {
$data['the_time_field'] = new Time($data['the_time_field'])
}
});
重要的是要记住,如果数据不能被正确验证,或者不能在Type类的帮助下被Marshaller“解析”,数据就不会被设置为实体。这就是为什么在使用patchEntity时没有调用setter的原因。
https://stackoverflow.com/questions/31331334
复制相似问题