Cách chính xác để có được một đối tượng phiên?


8

Tôi đang viết một mô-đun thanh toán cho Magento 2 ngay bây giờ và tôi đang kiểm tra nó theo
"Tiêu chuẩn mã hóa chương trình chất lượng mở rộng Magento" CodeSniffer
( https://github.com/magento/marketplace-eqp ).

Đối với mọi lớp học của tôi đang sử dụng một đối tượng phiên (thanh toán), CodeSniffer trả lời với cảnh báo sau:

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

Tôi nhận được đối tượng phiên theo cách sau:

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

Có một cách chính xác để có được đối tượng phiên?
Tôi không thể tìm thấy bất cứ điều gì trong mã lõi Magento 2.
Tôi chỉ có thể tìm thấy mã nơi nó được sử dụng chính xác giống như cách tôi sử dụng nó.


Bạn đã bỏ lỡ protected $checkoutSession;trước Người xây dựng
Ankit Shah

Ở đó, tôi chỉ không hiển thị nó trong ví dụ này - mã. Tôi đã thêm nó vào ví dụ để dễ hiểu hơn
Robert M.

vấn đề tương tự ở đây, chia sẻ nó nếu có ai có giải pháp
Nikhil Vaghela

Câu trả lời:


4

Tài liệu Magento đang nói

Nếu hàm tạo của một lớp đặc biệt nhiều tài nguyên, điều này có thể dẫn đến tác động hiệu suất không cần thiết khi một lớp khác phụ thuộc vào nó, nếu đối tượng đắt tiền cuối cùng không cần thiết trong một yêu cầu cụ thể.

Magento có một giải pháp cho tình huống này: proxy. Proxy mở rộng các lớp khác để trở thành phiên bản lười biếng của chúng. Đó là, một thể hiện thực của lớp mà một proxy mở rộng chỉ được tạo sau khi một trong các phương thức của lớp thực sự được gọi. Một proxy thực hiện giao diện giống như lớp gốc và do đó có thể được sử dụng như một phụ thuộc ở bất cứ nơi nào mà lớp gốc có thể. Không giống như cha mẹ của nó, một proxy chỉ có một lần phụ thuộc: trình quản lý đối tượng.

Proxy được tạo mã và do đó không cần phải viết thủ công. (Xem Tạo mã để biết thêm thông tin.) Chỉ cần tham khảo một lớp ở dạng \ Original \ Class \ Name \ Proxy và lớp được tạo nếu nó không tồn tại.

Magento 2 proxy

Vì vậy, trong trường hợp của bạn

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

Lưu ý \ Hậu tố proxy cho đối tượng \ Magento \ Checkout \ Model \ Phiên



0

Theo tiêu chuẩn mã hóa Magento 2 ECGM2, trước tiên bạn sử dụng lớp phiên sau đó bạn có thể chuyển nó vào bộ tạo nếu không lỗi này sẽ được hiển thị

Đối tượng phiên PHẢI KHÔNG được yêu cầu trong hàm tạo. Nó chỉ có thể được thông qua như là một đối số phương thức.

Thí dụ:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}

@Price Patel Tôi vẫn nhận được lỗi trên khi sử dụng mã này. Đây là giải pháp nào? Đây là mã của tôi: không gian tên ...; sử dụng Magento \ Checkout \ Model \ Phiên làm CheckoutSession; sử dụng Magento \ Khách hàng \ Mô hình \ Phiên làm Khách hàng; Kiểm tra lớp {private $ checkoutSession; tư nhân $ khách hàngSession; chức năng công cộng __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja
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.