รูปแบบ XML รองรับการใช้ service ที่ไม่ระบุชื่อ โดย service ที่ไม่ระบุชื่อ คือ service ที่ไม่จำเป็นต้อง
มีชื่อและไม่จำเป็นต้องกำหนดบริบทในการใช้งาน ซึ่งมันจะมีความสะดวกมากเมื่อคุณจำเป็นต้องใช้ service ที่
ไม่สามารถใช้งานได้นอก scope ของมัน
[xml]
<container xmlns="http://symfony-project.org/2.0/container">
<imports>
<import resource="default.xml" />
</imports>
<parameters>
<!-- These parameters override the ones defined in default.xml -->
</parameters>
<services>
<!-- These service definitions override the ones defined in default.xml -->
</services>
</container>
Symfony Service Container: Using XML or YAML to describe Services
จากบทความที่แล้วของ Dependency Injection คุณได้เรียนรู้วิธีการกำหนด service ด้วย PHP code โดยใช้คลาส
sfServiceContainerBuilder
มาวันนี้ ด้วยตัวช่วยเหลือของ service loaders และ dumpers คุณจะได้เรียนรู้วิธีการกำหนด service ในรูปแบบของ XML และ YAMLโดย Dependency Injection component ของ Symfony มีคลาสช่วยเหลือในการโหลด service โดยใช้ "loader object" โดยค่าเริ่มต้น component มีสองส่วนได้แก่
sfServiceContainerLoaderFileXml
ใช้เพื่อโหลด XML files และsfServiceContainerLoaderFileYaml
ใช้เพื่อโหลด YAML filesก่อนที่จะไปต่อในเรื่อง XML และ YAML notataions ลองพิจารณาส่วนอื่นของ Dependency Injection component คือ "dumper object" ซึ่งเป็น service dumper ที่จะนำเอา container object มาแปลงให้อยู่ในรูปแบบอื่น โดย component นี้มาพร้อมกับ bundle ซึ่งมี dumper สำหรับรูปแบบ XML และ YAML
เพื่อแนะนำให้รู้จัก XML Format เราจะนำ container service มาแปลงให้อยู่ในรูปแบบ
container.xml
โดยการใช้คลาสsfServiceContainerDumperXml
ลองดูตัวอย่างการแปลง
Zend_Mail
serviceเพื่อแปลง container นี้ให้เป็นรูปแบบ XML ทำได้โดยใช้โค้ดนี้
โดย constructor ของคลาส dumper ต้องการ service container builder object เป็นอาร์กิวเมนต์ตัวแรก จากนั้นเมธอด
dump()
จะแปลง container service ไปเป็นรูปแบบที่เราต้องการ ถ้าทุกอย่างเป็นปกติ ไฟล์container.xml
ควรจะมีรูปร่างหน้าตาดังโค้ดข้างล่างการโหลด container.xml ทำได้โดยใช้คลาส XML service loader
เช่นเดียวกับ dumper โดย constructor ของคลาส loader ก็ต้องการ service container builder เป็นอาร์กิวเมนต์ตัวแรกเหมือนกัน และเมธอด
load()
จะอ่านไฟล์และลงทะเบียน service ไปใน container นั้นจึงทำให้ container สามารถใช้งานได้ถ้าคุณเปลี่ยน dumper code ไปใช้คลาส
sfServiceContainerDumperYaml
คุณก็จะได้ service มาเป็นรูปแบบ YAML เช่นเดียวกันตัวอย่าง container ในรูปแบบ YAML
คุณสามารถผสมและจับคู่การใช้ loader และ dumper เพื่อแปลงรูปแบบหนึ่ง ๆ ไปสู่อีกรูปแบบหนึ่งได้ ดังตัวอย่าง
หนึ่งในสิ่งที่สำคัญที่สุดคือ ความสามารถในการ import "resource" อื่น ๆ โดยที่ resource สามารถเป็นไฟล์การกำหนดค่าใด ๆ ก็ได้
ในส่วนของการ import คือรายการของ resource ที่ต้องการนำเข้ามาก่อนที่จะให้ส่วนอื่นประมวลผล โดยค่าเริ่มต้น มันจะค้นหาไฟล์ที่มี path ตรงกับไฟล์นั้น ๆ นอกจากนี้คุณยังสามารถส่งอาเรย์ของ path ไปในอาร์กิวเมนต์ที่สองของ loader ได้
คุณสามารถ import ไฟล์ YAML ลงไปใน XML ได้โดยการระบุคลาสที่จะใช้โหลด resource
ในทำนองเดียวกัน การ import ไฟล์ XML ในรูปแบบ YAML ก็สามารถทำได้เช่นกัน
การ
import
นี้ช่วยให้คุณมีความยืดหยุ่นในการจัดระเบียบ service ของคุณ ซึ่งนี่คือวิธีการที่ดีในการแชร์และนำข้อกำหนดของอื่น ๆ ของ service กลับมาใช้ใหม่ ลองนึกถึงตัวอย่าง web session ที่ได้ยกตัวอย่างไปในบทความแรก เมื่อคุณใช้ web session บน test environment ตัว session storage object อาจต้องการการจำลองเพื่อทดสอบ ในทางตรงกันข้ามถ้าคุณมี load-balanced ของ web servers หลายตัว บน production environment จำเป็นต้องเก็บ session ไว้ในฐานข้อมูล เช่น MySQL เป็นต้น ทางเดียวที่จะกำหนดค่า config ให้มีความแตกต่างกันเป็นค่าเริ่มต้นสำหรับ environment ต่าง ๆ คือการสร้างไฟล์ config ที่แตกต่างกันหลาย ๆ ไฟล์แล้วค่อย import เข้ามาใช้ ดังตัวอย่างดังนั้นการใช้ค่า config ที่ต้องการก็จะเป็นเรื่องง่าย
ผู้คนทั่วไปอาจหนักใจกับการ config ในรูปแบบ XML เนื่องจาก XML อาจไม่ใช่รูปแบบของการ config ที่สามารถอ่านเข้าใจได้ง่าย ใน Symfony นั้นคุณอาจเขียนไฟล์ทั้งหมดในรูปแบบ YAML แต่คุณก็สามารถแยกแยะการกำหนด service จากการ config ได้เช่นกันเนื่องจากคุณสามารถ import ไฟล์รูปแบบอื่น ๆ ได้, คุณสามารถกำหนด service ได้ในไฟล์
services.xml
และจัดเก็บการ config ที่เกี่ยวข้องไว้ในไฟล์parameter.xml
รวมถึงคุณยังสามารถกำหนดพารามิเตอร์ในไฟล์ YAML (parameter.yml) และสุดท้าย มีเครื่องมือ built-in INI loader ที่สามารถอ่านพารามิเตอร์จากไฟล์มาตรฐาน INI ได้ตัวอย่างเหล่านี้เป็นแค่เรื่องผิวเผินของ container loader และ dumpers features แต่หวังว่าในบทความนี้จะทำให้มองเห็นภาพรวมของรูปแบบ XML และ YAML ที่มีประสิทธิภาพมากกว่ารูปแบบ PHP สำหรับใครที่สงสัยเกี่ยวกับประสิทธิภาพของ container ในการโหลดไฟล์หลาย ๆ ไฟล์เพื่อ config เราจะพูดถึงในบทความถัดไป
source