Magento 2: การส่งผ่านตัวแปรจากแอคชั่นคอนโทรลเลอร์ไปที่“ ดู”


12

ใน Magento 1 หากคุณต้องการส่งผ่านข้อมูลจากแอ็คชั่นคอนโทรลเลอร์ของคุณไปยัง "มุมมอง" (เช่นบล็อกในเลย์เอาต์ของคุณคุณสามารถทำได้)

  1. เพิ่มค่า / วัตถุให้กับรีจิสตรีส่วนกลางผ่าน Mage::register

  2. ดึงวัตถุบล็อกโดยตรงและตั้งค่าคุณสมบัติข้อมูลบนวัตถุบล็อกที่ถูกดึงข้อมูลหลังจากเรียกใช้ loadLayout

  3. วิธีการโทรบนบล็อกวัตถุในphtmlไฟล์และให้วัตถุบล็อกใช้เลเยอร์โมเดล / ฐานข้อมูลเพื่ออ่านข้อมูลที่บันทึกไว้ก่อนหน้านี้ในแอคชั่นคอนโทรลเลอร์

การใช้วิธีการบล็อกวัตถุเพื่ออ่านจากฐานข้อมูลยังคงปรากฏว่าทำงานได้ใน Magento 2 - ซึ่งเหมาะสำหรับการใช้งานบางประเภท อย่างไรก็ตาม

  1. ไม่มีการลงทะเบียนระดับโลกใน Magento 2 อีกต่อไป (หรือมีอยู่แล้ว)

  2. ตอนนี้ระบบเลย์เอาต์ทำงานโดยการสร้างวัตถุหน้าผ่านโรงงานและคุณไม่สามารถคว้าการอ้างอิงบล็อกแบบเดียวกับที่คุณทำได้ใน Magento 1

เป็นไปได้ไหมใน Magento 2 ที่จะส่งผ่านข้อมูลโดยตรงจากคอนโทรลเลอร์ลงสู่มุมมอง? หรือนี่เป็นรูปแบบที่ตรงกับโลกแห่ง Design Pattern ™ที่กล้าหาญของวีโอไอพีหรือไม่? หากนี่เป็นรูปแบบที่ตรงเกินไปสิ่งที่ควรทำถ้ามีข้อมูลจากการคำนวณบางอย่างที่เราต้องการแสดงในเทมเพลต แต่ไม่ต้องการเก็บข้อมูลนั้นไว้ในระบบ stateful (เช่นเราไม่ต้องการบันทึกลงใน ฐานข้อมูล)

ฉันสามารถคิดถึงวิธีที่แตกต่างกันเล็กน้อยในการแฮ็คข้อมูลนี้ด้วยตนเอง - แต่ฉันสนใจว่า Magento 2 ต้องการให้คุณทำอย่างไร

หมายเหตุ : ฉันรู้ว่าเป็นไปได้ที่จะดึงข้อมูลอินสแตนซ์บล็อกในแอคชั่นคอนโทรลเลอร์โดยใช้บางสิ่งเช่นนี้

$resultPage = $this->resultPageFactory->create();    
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');        

var_dump(spl_object_hash($block));

โค้ดหลักของ Magento 2 ทำเช่นนี้บ่อยครั้ง อย่างไรก็ตาม - วัตถุบล็อกที่ดึงมาในวัตถุตัวควบคุมดูเหมือนว่าจะเป็นวัตถุที่แตกต่างจากที่มีอยู่ในphtmlแม่แบบผ่าน$thisหรือ$block(อดีต ( $this) ดูเหมือนจะเป็นวัตถุที่จริงทำให้แม่แบบในขณะที่ในภายหลัง ( $block) ดูเหมือนจะเป็น ตัวอย่างของ Magento Block type)

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

ฉันพูดว่า "ดูเหมือนจะเป็น" เพราะถ้าฉันตั้งค่าข้อมูลในวิธีการดำเนินการควบคุมจะไม่สามารถใช้ได้ในphtmlแม่แบบ - และถ้าฉันเปรียบเทียบspl_object_hashผลลัพธ์ข้างต้นฉันได้รับแฮชสามแบบ อย่างไรก็ตามฉันยังใหม่พอที่ทั้งหมดข้างต้นอาจเป็นข้อผิดพลาดอื่น ๆ ที่ฉันทำ - ดังนั้นหากคุณสามารถตั้งค่าข้อมูลในบล็อกและดึงข้อมูลในแม่แบบฉันชอบที่จะได้ยินเกี่ยวกับมัน !

คำตอบ:


17

เกี่ยวกับ # 1 รีจิสทรียังคงมีอยู่คล้ายกับสิ่งที่คุณรู้จาก Magento 1 มันเพิ่งจะย้าย ดู:\Magento\Framework\Registry

เพิ่มลงในคอนสตรัคเตอร์ของคุณผ่านการฉีดพึ่งพาและจากนั้นคุณสามารถใช้ความคุ้นเคย$registry->register($key, $value)และ$registry->registry($key)วิธีการในการจัดเก็บ / เข้าถึงข้อมูล

ฉันขอแนะนำ poking รอบ namespace \ Magento \ Framework ถ้าคุณยังไม่ได้ มีหลายสิ่งที่เข้าถึงได้จาก Mage หรือแอปก่อนที่จะยังอยู่ที่นั่นเพียงแยกออก

เท่าที่ปฏิบัติที่ดีที่สุดฉันไม่สามารถตอบได้ แต่ฉันคาดหวังว่าคำตอบจะต้องป้องกันตรรกะให้มากที่สุดเท่าที่จะทำได้ การมองที่แกนกลางน่าจะเป็นทางออกที่ดีที่สุดของคุณ ตัวอย่างเช่นดูหน้าแก้ไขที่อยู่ลูกค้า: ตัวควบคุมพื้นฐาน ; บล็อกที่กว้างขวาง - รวมถึงการดึงรหัสที่อยู่และการโหลดหากจำเป็น พวกเขาจัดการกับสิ่งนั้นโดยตรงในบล็อก พวกเขาไม่ได้ทำมันในตัวควบคุมแล้วผ่านมันไป


2
แน่นอนว่าเคล็ดลับคือการรู้ว่าส่วนใดที่แกนกลางจะต้องดูและต้องละเว้น :) ขอบคุณสำหรับตัวชี้ +1 สำหรับข้อมูลที่เป็นประโยชน์!
Alan Storm

1
+1 สำหรับย่อหน้าสุดท้าย หากคุณต้องการแชร์ค่าที่คำนวณได้ให้วางพฤติกรรมการคำนวณเพื่อแยกวัตถุและเรียกมันจากบล็อกที่ต้องใช้ค่านั้น รีจิสทรีไม่ได้รับการสนับสนุนเนื่องจากเป็นสถานะที่ไม่แน่นอนในระดับโลกและคุณไม่แน่ใจว่าจะได้รับสิ่งใดจากที่นั่น ตรงที่อยู่ของบล็อกจากการกระทำเป็นกำลังใจยังเพราะคุณจะไม่แน่ใจว่าบล็อกเป็นปัจจุบันบนหน้าเว็บ (รูปแบบที่สามารถฆ่ามัน)
แอนตัน Kril

@AntonKril ผู้ช่วยเพจเรดเดอร์เป็นอย่างไร? ตัวช่วยหน้า CMS ตัวช่วยดูผลิตภัณฑ์มีวัตถุประสงค์เพื่อแยกการแสดงผลออกจากคำขอ HTTP หรือไม่
Ivan Chepurnyi

5

คุณไม่ควรส่งตัวแปรจาก Controller Action ไปยัง View ใช้บล็อกเพื่อส่งตัวแปรไปยังมุมมอง (เอ็นจิ้นแม่แบบ)


ทำไม? คุณจะผ่านการรับ / โพสต์ params จากบล็อกเพื่อดูได้อย่างไร ตรรกะส่วนใหญ่ไม่ผ่านพวกเขาจากตัวควบคุมเพื่อดู?
LucScu

ใช้คำขอวัตถุในบล็อก ถ้าคุณบล็อกรับข้อมูลจากตัวควบคุมผ่านรีจิสตรีคุณจะไม่สามารถใช้มันบล็อกกับตัวควบคุมอื่น ๆ ได้ มันเรียกว่าการมีเพศสัมพันธ์ชั่วคราวและการปฏิบัติที่ไม่ดี
KAndy

ฉันใช้ $ block-> assign () เพื่อส่งผ่านพารามิเตอร์ของคำขอจากคอนโทรลเลอร์ไปยังบล็อก มันเป็นวิธีปฏิบัติที่ไม่ดีด้วยหรือไม่?
LucScu

การไม่แนะนำที่อยู่โดยตรงของบล็อกจากการกระทำก็เพราะคุณไม่แน่ใจว่ามีบล็อกอยู่ในหน้าเว็บหรือไม่
KAndy

ในกรณีของฉันฉันแน่ใจเพราะเป็นสถานการณ์ที่กำหนดเองที่ตัวควบคุมเลย์เอาต์และบล็อกถูกควบคุมโดยรหัสของฉันเท่านั้นดังนั้นฉันคิดว่าเป็นพารามิเตอร์ของคำขอผ่านตรรกะของตัวควบคุมจากตัวควบคุมถึงบล็อก ขอบคุณสำหรับคำตอบของคุณ!
LucScu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.