Nhắc nhở quan trọng: Không bao giờ nên gọi trực tiếp Trình quản lý đối tượng
Vì vậy, đây là cách để làm điều đó một cách sạch sẽ
Trong bất kỳ lớp học nào ngoại trừ các mẫu
Trước tiên bạn cần tiêm lớp sau vào hàm tạo của mình /Magento/Customer/Model/Session
::
protected $_session;
public function __construct(
...
\Magento\Customer\Model\Session $session,
...
) {
...
$this->_session = $session;
...
}
Sau đó, trong lớp của bạn, bạn có thể gọi như sau:
if ($this->_session->isLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Trong một mẫu
Nó đòi hỏi nhiều công việc hơn trong một mẫu vì bạn sẽ phải thiết lập tùy chọn cho khối kết xuất lại mẫu để thực hiện theo cách sạch sẽ:
<preference for="Block\That\Renders\The\Template"
type="Vendor\Module\Block\Your\Custom\Block" />
Sau đó, trong máy tạo khối tùy chỉnh của bạn, bạn cần tuân theo cách tiêm phụ thuộc tương tự như đối với bất kỳ lớp nào (giải thích ở trên).
Bước bổ sung ở đây là tạo một phương thức công khai có thể được sử dụng trong mẫu của bạn để kiểm tra xem khách hàng có đăng nhập hay không
public function isCustomerLoggedIn()
{
return $this->_session->isLoggedIn();
}
Sau đó, trong mẫu của bạn, bạn có thể gọi:
if ($block->isCustomerLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Thay thế nếu phiên khách hàng chưa được khởi tạo
Có một cách khác để làm điều đó ngụ ý sử dụng Magento\Framework\App\Http\Context
thay vìMagento/Customer/Model/Session
Sau đó, bạn có thể gọi $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
thay vì $this->_session->isLoggedIn()
kiểm tra xem khách hàng đã đăng nhập hay chưa.
Tuy nhiên phương pháp này có thể cung cấp cho bạn các kết quả khác nhau , tôi khuyên bạn nên đọc câu trả lời tuyệt vời này để biết thêm thông tin: https://magento.stackexchange.com/a/92133/2380