Cara yang benar untuk mendapatkan objek sesi?

8

Saya sedang menulis modul pembayaran untuk Magento 2 sekarang dan saya sedang mengeceknya terhadap
"Kode Penyandi Program Kualitas Ekstensi Magento" CodeSniffer
( https://github.com/magento/marketplace-eqp ).

Untuk setiap kelas saya yang menggunakan objek sesi (checkout), CodeSniffer merespons dengan peringatan berikut:

Session object MUST NOT be requested in constructor. It can only be passed as a method argument.

Saya mendapatkan objek sesi dengan cara berikut:

/**
 * Checkout session object
 *
 * @var \Magento\Checkout\Model\Session
 */
protected $checkoutSession;

/**
 * Constructor
 *
 * @param  \Magento\Checkout\Model\Session $checkoutSession
 * @return void
 */
public function __construct(\Magento\Checkout\Model\Session $checkoutSession)
{
    $this->checkoutSession = $checkoutSession;
}

Apakah ada cara yang benar untuk mendapatkan objek sesi?
Saya tidak dapat menemukan apa pun dalam kode inti Magento 2.
Saya hanya bisa menemukan kode di mana ia digunakan dengan cara yang persis sama dengan saya menggunakannya.

Robert M.
sumber
Anda telah terjawab di protected $checkoutSession;hadapan Konstruktor
Ankit Shah
Itu ada di sana, saya hanya tidak menunjukkannya dalam kode contoh ini. Saya menambahkannya pada contoh agar lebih mudah dipahami
Robert M.
masalah yang sama di sini, bagikan jika ada yang punya solusi
Nikhil Vaghela

Jawaban:

4

Magento Docs katakan

Jika konstruktor suatu kelas sangat intensif sumber daya, ini dapat menyebabkan dampak kinerja yang tidak perlu ketika kelas lain bergantung padanya, jika objek mahal tidak akhirnya diperlukan selama permintaan tertentu.

Magento memiliki solusi untuk situasi ini: proksi. Proxy memperluas kelas lain untuk menjadi versi yang malas. Yaitu, contoh nyata dari kelas yang diperluas proxy dibuat hanya setelah salah satu metode kelas benar-benar dipanggil. Proxy mengimplementasikan antarmuka yang sama dengan kelas asli sehingga dapat digunakan sebagai dependensi di mana pun kelas asli dapat. Tidak seperti induknya, proksi hanya memiliki ketergantungan sekali saja: manajer objek.

Proxy adalah kode yang dihasilkan dan karenanya tidak perlu ditulis secara manual. (Lihat Pembuatan kode untuk informasi lebih lanjut.) Cukup referensi kelas dalam bentuk \ Asli \ Kelas \ Nama \ Proksi, dan kelas dihasilkan jika tidak ada.

Magento 2 Proxy

Jadi, dalam kasus Anda

/**
 * Checkout session object
 *
 * @var \Magento\Checkout\Model\Session\Proxy
 */
protected $checkoutSession;

/**
 * Constructor
 *
 * @param  \Magento\Checkout\Model\Session\Proxy $checkoutSession
 * @return void
 */
public function __construct(\Magento\Checkout\Model\Session\Proxy $checkoutSession)
{
    $this->checkoutSession = $checkoutSession;
}

Catatan \ akhiran proxy untuk objek \ Magento \ Checkout \ Model \ Session

Adnan
sumber
0

Sesuai standar pengkodean Magento 2 ECGM2 Anda pertama kali menggunakan kelas sesi maka Anda dapat meneruskannya ke dalam konstuktor jika tidak, kesalahan ini akan ditampilkan

Objek sesi TIDAK HARUS diminta dalam konstruktor. Itu hanya bisa diteruskan sebagai argumen metode.

Contoh:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}
Pangeran Patel
sumber
@ Harga Patel Saya masih mendapatkan kesalahan di atas saat menggunakan kode ini. Ada solusi? Ini adalah kode saya: namespace ...; gunakan Magento \ Checkout \ Model \ Session sebagai CheckoutSession; gunakan Magento \ Pelanggan \ Model \ Sesi sebagai CustomerSession; Tes kelas {private $ checkoutSession; private $ customerSession; fungsi publik __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja