Magento 2: Membuat Objek Data dengan Status Tidak Berubah?

9

Menghindari komentar di Magento 2 lainnya

Jika Anda perlu berbagi beberapa nilai yang dihitung, letakkan perilaku penghitungan untuk memisahkan objek dan menyebutnya dari blok yang memerlukan nilai itu. Registri tidak disarankan karena keadaan global bisa berubah dan Anda tidak pernah yakin apa yang akan Anda dapatkan dari sana.

Apakah ada cara untuk membuat Obyek di Magento 2 dengan status tidak berubah? Menggunakan registri ( Magento\Framework\Registry) tidak disarankan karena statusnya bisa berubah secara global (mungkin karena, meskipun registermetode ini tidak membiarkan Anda mengubah kunci yang ada, Anda dapat menghapus dan mengatur ulang kunci itu).

Namun - masalah yang sama ada untuk objek apa pun di Magento 2. Jika saya membuat objek

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

class ViewVars extends DataObject
{
}

Kemudian injeksi dependensi konstruktor otomatis memastikan bahwa siapa pun dapat mengambil objek yang dibagikan itu. Jika objek tidak dibagi, maka tampilan / blok tidak dapat mengambilnya.

Secara teori, kita bisa melakukan sesuatu seperti

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;
    }
}

Tapi itu sepertinya banyak pekerjaan untuk tugas yang biasa seperti mengatur variabel individu untuk tampilan . Apakah ada cara yang lebih baik di Magento 2 untuk membuat objek data tidak berubah yang tidak saya sadari?

Alan Storm
sumber
Tidakkah pola Registry Mage lama berusaha membuat nilai tidak berubah? IMHO ini harus menjadi lang konstruksi. M2 kompatibel dengan HHVM jadi jika Anda sangat membutuhkan konstruk ini, Anda dapat mengadopsi Hack, yang menyediakan tipe data yang tidak dapat diubah. Jelas ini dikatakan dalam bercanda dan dengan kepala saya condong ke samping seolah-olah untuk memberi isyarat bahwa ini mungkin benar-benar Hal yang Bisa Dilakukan ™.
philwinkle
1
Saya pikir inti dari komentar Anton lebih dari itu jika Anda menggunakan antarmuka registri, tidak ada jaminan tentang apa yang sebenarnya Anda dapatkan. Anda dapat mengatakan, 'oke, saya akan menyimpan \ My \ Model di kunci registri current_model di sini, dan menggunakannya sesuai kebutuhan'. Tetapi (1) tidak ada yang menjamin bahwa current_model adalah turunan dari \ My \ Model (atau apa pun); dan (2) kode apa pun di mana pun di jalur eksekusi dapat menggunakan atau memodifikasi kunci registri dengan cara apa pun. Itu bisa menyebabkan masalah besar. Lebih baik menggunakan antarmuka yang ditentukan dan tunggal dengan injeksi ketergantungan untuk mempertahankan data keadaan itu.
Ryan Hoerr
Objek dengan setter tidak berubah. Gunakan konstruktor untuk mengatur data di objek.
KAndy

Jawaban:

4

Tidak, saat ini tidak ada cara yang lebih baik di Magento 2 untuk membuat objek data yang tidak dapat diubah. Anda dapat membuatnya, misalnya oleh generasi getter dan konstruktor dari antarmuka.

KAndy
sumber