Phụ thuộc theo thông tư: Magento \ Khách hàng \ Mô hình \ Phiên phụ thuộc vào Công ty \ Modulename \ Plugin \ Config \ Share và ngược lại


8

Cách ghi đè hoặc Sử dụng plugin cho isWebsiteScope()chức năng từ tệp Magento \ Customer \ Model \ Config \ Share.php ,

Tôi đã sử dụng plugin cho chức năng bên dưới nhưng tôi muốn có phiên khách hàng hiện tại ở chức năng bên dưới, Chủ yếu kiểm tra mã xác nhận có đăng nhập hay không .

Chỉ cần sử dụng plugin và thiết lập di.xml,

<!-- Override Share.php to set value of website scope -->
<type name="Magento\Customer\Model\Config\Share">
    <plugin name="Company_Modulename::Share" type="\Company\Modulename\Plugin\Config\Share\Proxy" sortOrder="1"/>
</type>

Trong tệp Share.php,

<?php
namespace Company\Modulename\Plugin\Config;

class Share
{    
    public function __construct(
        \Magento\Customer\Model\Session $customerSession
    ) {
        $this->session = $customerSession;
    }
    /**
     * Check whether current customers sharing scope is website
     *
     * @return bool
     */
    public function afterIsWebsiteScope(\Magento\Customer\Model\Config\Share $subject)
    {
        if(!$this->session->isLoggedIn()){
            return 1;
        } else {
            return 0;
        }

    }
}

Làm thế nào để có được phiên khách hàng hiện tại trong chức năng trên,

Nếu tôi sử dụng phiên khách hàng hiện tại bằng trình duyệt mô hình phiên khách hàng sẽ xuất hiện lỗi phụ thuộc Thông tư.


Trường hợp có thể được sao chép vấn đề này frontend hoặc admin?
zed Blackbeard

Bạn không thể có được phiên khách hàng sử dụng mẫu ở trên vì Magento\Customer\Model\Config\Sharelà phụ thuộc Magento\Customer\Model\Session, do đó xảy ra lỗi phụ thuộc vòng tròn - Tôi thấy những gì bạn đang cố gắng thực hiện (nghĩa là thay đổi phạm vi trang web nếu khách hàng đăng nhập) nhưng không thể tìm ra một cách không hacky hoặc.
Phil Birnie

@enedBlackbeard, Dành cho lối vào.
Rakesh Jesadiya

1
@RakeshJesadiya, Cuối cùng tôi đã sử dụng Trình quản lý đối tượng để giải quyết vấn đề này, Ngay cả tôi cũng sẵn sàng trả lời tốt hơn
Murtuza Zabuawala

1
Có như @MurtuzaZabuawala Bạn cần sử dụng trình quản lý đối tượng cho vấn đề này. Nhưng sử dụng trình quản lý đối tượng làm phụ thuộc\Magento\Framework\ObjectManagerInterface
Hoàng tử Patel

Câu trả lời:


4

Cách dễ nhất để giải quyết các phụ thuộc vòng tròn (mặc dù không phải lúc nào cũng tốt nhất) là sử dụng Proxy.

Proxy cho một lớp là một lớp được tạo tự động (có nghĩa là Magento sẽ tự động tạo nó nếu không tìm thấy thông qua trình tải tự động) có phụ thuộc vào Trình quản lý đối tượng và có cùng giao diện với lớp gốc.

Việc thực hiện bất kỳ phương thức nào của Proxy chỉ là một lời gọi của cùng một phương thức của lớp gốc. Nó không có lớp gốc được yêu cầu trong hàm tạo, thay vào đó, đối tượng của lớp gốc được tạo thông qua Trình quản lý đối tượng khi lần đầu tiên một số phương thức của Proxy được gọi.

Dưới đây là một ví dụ về Proxy từ lõi ( \Magento\Backend\Model\Auth\Proxy):

/**
 * Get proxied instance
 *
 * @return \Magento\Backend\Model\Auth
 */
protected function _getSubject()
{
    if (!$this->_subject) {
        $this->_subject = true === $this->_isShared
            ? $this->_objectManager->get($this->_instanceName)
            : $this->_objectManager->create($this->_instanceName);
    }
    return $this->_subject;
}

/**
 * {@inheritdoc}
 */
public function setAuthStorage($storage)
{
    return $this->_getSubject()->setAuthStorage($storage);
}

Để sử dụng proxy, thay vì tham chiếu đến lớp (bất kỳ nơi nào trong di.xml hoặc phụ thuộc vào hàm tạo), hãy tham chiếu Proxy bằng cách nối thêm tên của lớp với \Proxy, tức là:

<type name="Magento\Customer\Model\Config\Share">
<plugin name="Company_Modulename::Share" type="\Company\Modulename\Plugin\Config\Share\Proxy" sortOrder="1"/>

Việc phân tích luôn có giá trị là luôn có cách để viết lại logic nghiệp vụ để tránh phụ thuộc vòng tròn trước khi sử dụng Proxy (hoặc cho cùng một vấn đề Trình quản lý đối tượng trong hàm tạo)


Làm cách nào để có được phiên khách hàng trong tệp proxy.php bằng cách trên? Vẫn còn lỗi tương tự
Rakesh Jesadiya

@RakeshJesadiya chỉ giữ plugin theo cách bạn đã viết, nhưng thay đổi di.xml và chỉ định loại plugin có \Proxyhậu tố (như trong ví dụ của tôi ở trên). Không tạo lớp Proxy theo cách thủ công.
Eugene Tulika

Cho cùng một lỗi một lần nữa bằng cách sử dụng ở trên. Phụ thuộc theo thông tư: Magento \ Khách hàng \ Mô hình \ Phiên phụ thuộc vào Công ty \ Modulename \ Plugin \ Config \ Share và ngược lại.
Rakesh Jesadiya

Tôi đã cập nhật các câu hỏi của mình dựa trên nhận xét của bạn nhưng không hoạt động
Rakesh Jesadiya

Tôi thấy, vấn đề là phương thức isWebsiteScope được gọi từ hàm tạo của Magento\Customer\Model\Session\Storage, đó là lý do tại sao mặc dù chúng tôi đã sử dụng Proxy, đối tượng vẫn cần phải được tạo tại thời điểm xây dựng. Tôi không thấy Trình quản lý đối tượng giúp bạn như thế nào (không phù hợp với tôi). Tôi muốn nhìn sâu hơn vào logic kinh doanh mà bạn muốn thực hiện và thêm nó ở một cấp độ khác.
Eugene Tulika

1

Cách duy nhất mà tôi tìm thấy để loại bỏ sự phụ thuộc vòng tròn là sử dụng objectManagertrực tiếp,

Tôi biết đó là cách xấu để giải quyết, nhưng tôi nghĩ đây là cách duy nhất,

Nếu ai đó có giải pháp tốt hơn thì tôi cũng sẵn sàng cho giải pháp

Nhưng cách của tôi dưới đây là giải pháp:

protected $_objectManager;

public function __construct( 
    \Magento\Framework\ObjectManagerInterface $objectManager
)
{
    $this->_objectManager = $objectManager;
}

public function afterIsWebsiteScope(\Magento\Customer\Model\Config\Share $subject)
{
    $customerSession = $this->_objectManager->get('Magento\Customer\Model\Session');
    if(!$customerSession->isLoggedIn()){
        return 1;
    } else {
        return 0;
    }

}

1
Vâng, tôi cũng nghĩ rằng đây là cách duy nhất để giải quyết circular dependencynhưng chúng ta nên sử dụng trình quản lý đối tượng như một phần phụ thuộc trong các tệp lớp. +1 từ tôi :)
Hoàng tử Patel

Nó không hoạt động và hiển thị cùng một lỗi.
Rakesh Jesadiya

@RakeshJesadiya bạn đã xóa Magento\Customer\Model\Sessionkhỏi constructor ?? và xóa var / thế hệ
Murtuza Zabuawala

Vâng, tôi đã thử nó. xóa thư mục được tạo và var khỏi root
Rakesh Jesadiya

bây giờ lỗi trông giống như, Uncaught Error: Gọi tới hàm thành viên get () trên null trong /var/
www/html/studentkare/vendor/magento/framework/ObjectManager/Factory/ AbTHERFactory.php:144
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.