Magento 2: Tạo đối tượng dữ liệu với trạng thái bất biến?


9

Bỏ qua một bình luận trong một Magento 2 khác

Nếu bạn cần chia sẻ một số giá trị được tính toán, hãy đặt hành vi tính toán để tách đối tượng và gọi nó từ các khối yêu cầu giá trị đó. Đăng ký không được khuyến khích vì đó là trạng thái có thể thay đổi toàn cầu và bạn không bao giờ chắc chắn mình sẽ nhận được gì từ đó.

Có cách nào để tạo Object trong Magento 2 với trạng thái bất biến không? Việc sử dụng sổ đăng ký ( Magento\Framework\Registry) không được khuyến khích vì đó là trạng thái có thể thay đổi toàn cầu (có thể là do mặc dù registerphương thức này không cho phép bạn thay đổi khóa hiện tại, nhưng bạn có thể hủy đặt lại và sau đó đặt lại khóa đó).

Tuy nhiên - vấn đề tương tự tồn tại với bất kỳ đối tượng nào trong Magento 2. Nếu tôi tạo một đối tượng

namespace Pulsestorm\Helloworld\Model;
use Magento\Framework\DataObject;

class ViewVars extends DataObject
{
}

Sau đó, trình tự phụ thuộc hàm tạo tự động đảm bảo rằng bất kỳ ai cũng có thể lấy đối tượng chia sẻ đó. Nếu đối tượng không được chia sẻ, thì khung nhìn / khối không thể lấy nó.

Về lý thuyết, chúng ta có thể làm một cái gì đó như

namespace Pulsestorm\Helloworld\Model;

class ViewVars
{
    protected $_data=false;
    protected function setData($data)
    {
        if($_data)
        {
            throw new Exception("Immutable");
        }
        $this->_data = $data;
    }

    public function getData()
    {
        return $this->_data;
    }
}

Nhưng điều đó có vẻ như rất nhiều công việc cho một nhiệm vụ phổ biến như đặt các biến riêng lẻ cho một khung nhìn . Có cách nào tốt hơn trong Magento 2 để tạo các đối tượng dữ liệu bất biến mà tôi không biết?


Không phải mẫu Mage Registry cũ cố gắng làm cho giá trị không thay đổi? IMHO đây phải là một cấu trúc lang. M2 tương thích với HHVM, vì vậy nếu bạn rất cần cấu trúc này, bạn có thể áp dụng Hack, cung cấp các kiểu dữ liệu không thay đổi. Rõ ràng điều này được nói trong cả trò đùa và với đầu tôi nghiêng sang một bên như thể để ra hiệu rằng đây thực sự có thể là một điều có thể làm ™.
philwinkle

1
Tôi nghĩ rằng quan điểm của Anton là nhiều hơn nếu bạn đang sử dụng giao diện đăng ký, không có gì đảm bảo về những gì bạn thực sự nhận ra. Bạn có thể nói, 'được rồi, tôi sẽ lưu trữ \ My \ Model trong khóa đăng ký current_model tại đây và sử dụng nó khi cần thiết'. Nhưng (1) không có gì đảm bảo rằng current_model là một phiên bản của \ My \ Model (hoặc bất cứ thứ gì cả); và (2) bất kỳ mã nào ở bất kỳ nơi nào khác trong đường dẫn thực thi đều có thể sử dụng hoặc sửa đổi khóa đăng ký đó theo bất kỳ cách nào. Điều đó có thể gây ra vấn đề lớn. Tốt hơn là sử dụng một giao diện được xác định và singleton với nội xạ phụ thuộc để duy trì dữ liệu trạng thái đó.
Ryan Hoerr

Đối tượng với setters không phải là bất biến. Sử dụng constructor để thiết lập dữ liệu trong đối tượng.
KAndy

Câu trả lời:


4

Không, hiện tại không có cách nào tốt hơn trong Magento 2 để tạo các đối tượng dữ liệu bất biến. Bạn có thể tạo nó, ví dụ bằng cách tạo getters và constructor từ giao diện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.