addArgument() เพิ่มอาร์กิวเมนต์ผ่านไปยัง service constructor
setShared() เช็คว่ามี service นี้ซ้ำใน container หรือไม่ (ค่าเริ่มต้นเป็น true)
addMethodCall() เมธอดถูกเรียกหลังจาก service ถูกสร้างขึ้นมาแล้ว
การอ้างอิง service เสร็จสิ้นด้วยการใช้ sfServiceReference instance โดยนี่คือ special object แบบไดนามิกซึ่งถูกแทนที่ด้วย service จริง ๆ เมื่อการอ้างอิง service ถูกสร้างขึ้น
ในระหว่างขั้นตอนการลงทะเบียน service ยังไม่ได้ถูกสร้างจริง ๆ มันยังเป็นเพียงแค่การให้คำจำกัดความกับ service เท่านั้น service จะถูกสร้างขึ้นจริง ๆ ก็ต่อเมื่อคุณทำงานกับมันจริง ๆ นั้นหมายความว่าคุณสามารถลงทะเบียน service ในคำสั่งต่าง ๆ ได้โดยไม่ต้องคำนึงถึง dependency ของมัน ซึ่งก็หมายความอีกว่าคุณสามารถแทนที่ service ที่มีอยู่แล้วและลงทะเบียนมันอีกครั้งในชื่อเดิมได้ นี่เป็นอีกหนึ่งวิธีง่าย ๆ ในการแทนที่ service เพื่อการทดสอบ
The sfServiceDefinition Class
service นั้นมีหลาย property ที่เปลี่ยนแปลงวิธีในการสร้างและกำหนดค่า
Symfony Service Container: Using a Builder to create Services
ในบทความก่อนหน้านี้ของ Dependency Injection คุณได้เรียนรู้การใช้คลาส
sfServiceContainer
เพื่อทำให้ interface ของ service container น่าสนใจมากขึ้น โดยในบทความนี้ เราจะเรียนรู้การใช้คลาส sfServiceContainerBuilder ที่ใช้จัดการ serviceการกำหนด services ทำได้โดยการลงทะเบียนข้อกำหนดของ service โดยแต่ละข้อกำหนดของ service จะอธิบายถึงแต่ละ service จากคลาสที่จะใช้เพื่อส่งอาร์กิวเมนต์ที่ผ่าน constructor และพวงการกำหนดค่าอื่น ๆ ของ properties (ดู sfServiceDefinition ด้านล่าง)
จากตัวอย่าง
Zend_Mail
สามารถเขียนใหม่และทำให้มีความยืดหยุ่นโดยใช้คลาส builderการสร้าง service เสร็จสิ้นโดยการเรียกเมธอด
register()
ซึ่งเราได้ส่งชื่อ service และชื่อคลาสไป ทำให้ได้sfServiceDefinition
instance กลับมาในตัวอย่างข้างบน เราได้ใช้สิ่งเหล่านี้
addArgument()
เพิ่มอาร์กิวเมนต์ผ่านไปยัง service constructorsetShared()
เช็คว่ามี service นี้ซ้ำใน container หรือไม่ (ค่าเริ่มต้นเป็น true)addMethodCall()
เมธอดถูกเรียกหลังจาก service ถูกสร้างขึ้นมาแล้วการอ้างอิง service เสร็จสิ้นด้วยการใช้
sfServiceReference
instance โดยนี่คือ special object แบบไดนามิกซึ่งถูกแทนที่ด้วย service จริง ๆ เมื่อการอ้างอิง service ถูกสร้างขึ้นในระหว่างขั้นตอนการลงทะเบียน service ยังไม่ได้ถูกสร้างจริง ๆ มันยังเป็นเพียงแค่การให้คำจำกัดความกับ service เท่านั้น service จะถูกสร้างขึ้นจริง ๆ ก็ต่อเมื่อคุณทำงานกับมันจริง ๆ นั้นหมายความว่าคุณสามารถลงทะเบียน service ในคำสั่งต่าง ๆ ได้โดยไม่ต้องคำนึงถึง dependency ของมัน ซึ่งก็หมายความอีกว่าคุณสามารถแทนที่ service ที่มีอยู่แล้วและลงทะเบียนมันอีกครั้งในชื่อเดิมได้ นี่เป็นอีกหนึ่งวิธีง่าย ๆ ในการแทนที่ service เพื่อการทดสอบ
เนื่องจากคลาส
sfServiceContainerBuilder
ใช้อินเทอร์เฟซsfServiceContainerInterface
ทำให้การใช้ service container ไม่จำเป็นต้องมีการเปลี่ยนแปลงsfServiceContainerBuilder
สามารถอธิบาย object instantiation และการกำหนดค่าได้ เราได้แสดงให้เห็นการใช้แล้วกับคลาสZend_Mail
และนี่คืออีกตัวอย่างหนึ่งที่ใช้คลาสsfUser
จาก Symfonyการใช้ PHP code ในการกำหนด service ทำได้ง่ายและมีประสิทธิภาพ มันช่วยให้คุณมีเครื่องมือเพื่อใช้สร้าง container ของคุณ โดยที่ไม่มี duplicate code เกิดขึ้น, การสร้าง abstract object, การกำหนดค่า ในบทความหน้าเราจะได้รู้วิธีการระบุ services ในรูปแบบ XML และ YAML
source