Tôi phải lưu một updated_at
thuộc tính của một thực thể tùy chỉnh và để biết đó là cách thực hành tốt nhất tôi đã xem qua cách Magento 2 xử lý nó.
Tôi đã xem \Magento\Eav\Model\Entity\Attribute\Backend\Time\Updated
lớp mô hình phụ trợ thuộc tính và đây là đoạn mã:
public function beforeSave($object)
{
$object->setData(
$this->getAttribute()->getAttributeCode(),
(new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT)
);
return $this;
}
Nghi ngờ đầu tiên của tôi là: múi giờ nào được xem xét?
Chữ ký của nhà DateTime
xây dựng là:
public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )
Theo tài liệu xây dựng :
Nếu $ múi giờ bị bỏ qua, múi giờ hiện tại sẽ được sử dụng.
Tôi cho rằng múi giờ hiện tại là múi giờ được cấu hình ở cấp máy chủ.
Để chứng minh điều đó, chỉ cần thực thi đoạn mã PHP sau:
<?php
var_dump(new DateTime());
Kết quả dự kiến là:
object(DateTime)#1 (3) {
["date"]=>
string(26) "2016-05-10 12:47:11.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(11) "Europe/Rome"
}
Các Europe/Rome
múi giờ là một trong những địa phương cấu hình trên máy chủ của tôi.
Nhưng Magento 1 đã được sử dụng để tiết kiệm ngày và thời gian theo GMT 0 vì vậy để có xác nhận rằng phương pháp này đã thay đổi với Magento 2 tôi đã mở \Magento\Eav\Model\Entity\Attribute\Backend\Time\Created
và đây là điều bất ngờ:
public function beforeSave($object)
{
$attributeCode = $this->getAttribute()->getAttributeCode();
if ($object->isObjectNew() && $object->getData($attributeCode) === null) {
//$object->setData($attributeCode, $this->dateTime->gmtDate());
$object->setData($attributeCode, gmdate('Y-m-d H:i:s'));
}
return $this;
}
Các created_at
thuộc tính cho thực thể EAV dường như được lưu theo giờ GMT 0 múi giờ. Các updated_at
theo múi giờ địa phương.
Hơn nữa có hai cách tiếp cận trong Created
mô hình phụ trợ, một trong số đó được nhận xét.
Nghiên cứu của tôi cho cách tiếp cận tốt nhất cần sự giúp đỡ của bạn. Cảm ơn bạn