ฉันพบปัญหานี้อีกครั้งในวันนี้และสิ่งสำคัญคือต้องรู้ว่าปัญหานี้เกิดขึ้นเมื่อใดก็ตามที่การพึ่งพาเครือข่ายเริ่มต้นอินสแตนซ์ที่จำเป็นต้องรู้สถานะของแอปพลิเคชัน
ในหลายกรณีข้อผิดพลาดนี้ถูกผูกไว้กับเซสชัน (เนื่องจากเซสชันจำเป็นต้องทราบสถานะของแอปพลิเคชัน (ส่วนหน้าหรือ adminhtml)
ในกรณีของฉันฉันจำเป็นต้องมีMagento\Tax\Api\TaxCalculationInterface
ในคำสั่ง CLI แต่สิ่งนี้ต้องการในบางจุดในห่วงโซ่พึ่งพาเซสชันลูกค้า (อาจจะได้รับกลุ่มลูกค้า)
แก้ไข:ฉันพบโซลูชันที่ดีขึ้นโดยใช้พร็อกซี แต่เพื่อประโยชน์ของประวัติศาสตร์นี่คือคำตอบก่อนหน้าของฉัน:
เพื่อแก้ปัญหานี้ฉันไม่ได้รวมส่วนต่อประสานนี้ไว้ในตัวสร้างของฉัน แต่เป็นแบบโรงงาน:
/**
* @var \Magento\Tax\Api\TaxCalculationInterfaceFactory
*/
protected $taxCalculationFactory;
/**
* @param \Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterfaceFactory $taxCalculationFactory
) {
$this->taxCalculationFactory = $taxCalculationFactory;
}
ด้วยวิธีนี้คลาสจะถูกสร้างอินสแตนซ์ในวิธีเดียวที่ฉันต้องการและไม่ได้อยู่ในตัวสร้าง:
$taxCalculation = $this->taxCalculationFactory->create();
นี่เป็นการแก้ไขปัญหาสำหรับฉันในกรณีนี้โดยเฉพาะ
และตอนนี้คำตอบโดยใช้พร็อกซี:
หากคุณไม่ต้องการทริกเกอร์การพึ่งพาทั้งหมดลงในโซ่คุณควรใช้พร็อกซีในคอนสตรัคเตอร์ของคุณ ตามเอกสารต้นฉบับ :
... การสร้างคอนสตรัคเตอร์ก็หมายความว่าปฏิกิริยาลูกโซ่ของการสร้างอินสแตนซ์ของวัตถุมักจะเป็นผลลัพธ์เมื่อคุณสร้างวัตถุ
และ:
... ผู้รับมอบฉันทะขยายชั้นเรียนอื่น ๆ เพื่อให้เป็นรุ่นที่ขี้เกียจ นั่นคืออินสแตนซ์จริงของคลาสที่พร็อกซีขยายสร้างขึ้นเฉพาะหลังจากที่หนึ่งในวิธีการของคลาสนั้นถูกเรียก
ดังนั้นในสถานการณ์ของฉันด้วยTaxCalculationInterface
สิ่งที่ฉันต้องทำคือยกตัวอย่างการคำนวณภาษีของฉันในฐานะตัวแทนในตัวสร้างของฉัน:
/**
* @var \Magento\Tax\Api\TaxCalculationInterface\Proxy
*/
protected $taxCalculation;
/**
* @param \Magento\Tax\Api\TaxCalculationInterface\Proxy $taxCalculation
*/
public function __construct(
\Magento\Tax\Api\TaxCalculationInterface\Proxy $taxCalculation
) {
$this->taxCalculation = $taxCalculation;
}
ด้วยวิธีนี้ชั้นเรียนของฉันขี้เกียจ นั่นคือมันเป็นอินสแตนซ์เท่านั้นทันทีที่ฉันเรียกวิธีการอย่างใดอย่างหนึ่ง ตัวอย่างเช่น:
$rate = $this->taxCalculation->getCalculatedRate($productRateId);