ស្វែងយល់អំពី DependencyInjection Component នៅក្នុង Symfony3

កាលពីអត្ថបទមុន យើងខ្ញុំបានចែករំលែកនូវចំណេះដឹងនៃ Components ជាច្រើនរបស់ Symfony3 ដូចជា Debug, CssSelector, Cache និង ClassLoader Component ជាដើម។ នៅក្នុងនោះផងដែរ រាល់អត្ថបទនីមួយៗ តែងតែមានការពន្យល់អំពី តើគួរធ្វើរបៀបណាដើម្បីទទួលបាន component មួយនោះយកមកប្រើប្រាស់ តើការតម្លើង Component នីមួយៗមានប៉ុន្មានរបៀប ហើយការប្រើប្រាស់របស់វាមានលក្ខណៈបែបណាដែរ។ ចំណែកនៅក្នុងអត្ថបទនេះវិញ យើងខ្ញុំនឹងណែនាំលោកអ្នកអំពី DependencyInjection Component វិញម្ដង ដែលអត្ថបទនេះក៏មិនខុសគ្នាពីអត្ថបទមុនៗនោះដែរ ដែលនឹងបង្ហាញលោកអ្នកអំពី ការតម្លើង មូលដ្ឋានគ្រឹះនៃការប្រើប្រាស់ និងការកំណត់នូវ Configuration files មួយចំនួនទៀត។

DependencyInjection component អាចអោយអ្នក ធ្វើអ្វីតាមលក្ខណៈស្តង់ដារនិងប្រើនូវវិធីរួមមួយនៃ objects ដែលបានបង្កើតឡើងក្នុង application របស់អ្នក។ ដើម្បីយល់អោយកាន់តែច្បាស់អំពី Dependency Injection ហើយនិង service containers សូមមើលទៅលើ​ Service Container

១) ការតម្លើង

មានវិធីចំនួន២ដែលលោកអ្នកអាចធ្វើការតម្លើង DependencyInjection component បានគឺ៖

ទី១៖ តម្លើងតាមរយៈ Composer (symfony/dependency-injection នៅលើ Packagist)

ទី២៖ ប្រើប្រាស់នូវ official Git repository (https://github.com/symfony/dependency-injection)

បន្ទាប់មកទៀត គឺទាមទារអោយមាន vendor/autoload.php file ដើម្បី enable នូវការធ្វើ autoload mechanism ដែលបានផ្ដល់ដោយ Composer។ បើមិនដូច្នោះទេ application របស់អ្នកនឹងមិនអាចស្វែងរកនូវ classes នៃ Symfony component បាននោះទេ។

២) មូលដ្ឋានគ្រឹះនៃការប្រើប្រាស់

អ្នកប្រហែលជាមាននូវ simple class មួយហើយដូចជា Mailer ខាងក្រោម ដែលអ្នកចង់ធ្វើអោយវាទៅជា service៖

អ្នកអាច register វាបានទៅក្នុង container ជា service៖

ការកែប្រែគឺធ្វើអោយ class កាន់តែមានភាពបត់បែនដែលនឹងអាចធ្វើអោយ container ធ្វើការកំណត់នូវ transport ដែលបានប្រើ។ ប្រសិនបើអ្នកធ្វើការកែប្រែនូវ class ដូចនេះវានឹងធ្វើការ pass ទៅកាន់ constructor៖

បន្ទាប់ពីនោះ អ្នកអាចធ្វើការកំណត់នូវ ជម្រើស (choice) នៃ transport ក្នុង container បាន៖

ឥលូវ Class មួយនេះគឺមានលក្ខណៈបត់បែនណាស់ ដូចដែលអ្នកបានបំបែកនូវ choice នៃ transport ចេញពី implementation និងដាក់ទៅក្នុង container។

Mail transport ណាមួយដែលអ្នកបានជ្រើសរើស អាចជា service អ្វីមួយដែលអ្នកត្រូវដឹងអំពីវា។ អ្នកអាចជៀសវាងនូវការធ្វើការកែប្រែវាក្នុង កន្លែងជាច្រើនដោយដាក់ parameter របស់វាទៅក្នុង container ហើយបន្ទាប់មកទៀតគឺសំដៅទៅលើ parameter មួយនេះសម្រាប់ Mailer service’s constructor argument៖

ពេលនេះ mailer service គឺស្ថិតនៅក្នុង container អ្នកអាច Inject វាជា dependency នៃ classes ផ្សេងទៀតបាន។ ប្រសិនបើអ្នកមាន NewsletterManager class ដូចនេះ៖

ពេលដែលធ្វើការកំណត់នូវ newsletter_manager service នោះ mailer service គឺមិនទាន់មាននោះទេ។ សូមប្រើនូវ Reference class ដើម្បីប្រាប់ទៅកាន់ container ដើម្បីធ្វើការ inject នូវ mailer service ពេលដែលវាធ្វើការ initializes នូវ newsletter manager៖

ប្រសិនបើ NewsletterManager មិនបានទាមទារនូវ Mailer និងធ្វើការ inject នោះវាគ្រាន់តែជា optional បន្ទាប់មកអ្នកអាចប្រើប្រាស់នូវ setter injection ជំនួសបាន៖

ពេលនេះអ្នកអាចជ្រើសរើសមិនអោយធ្វើការ Inject នូវ Mailer ទៅកាន់ NewsletterManager ។ ប្រសិនបើអ្នកពិតជាចង់ បើទោះបីជា បន្ទាប់ពី container អាចហៅ setter method៖

បន្ទាប់មកអ្នកអាចទទួលបាននូវ newsletter_manager service របស់អ្នកពី container ដូចរូបខាងក្រោមនេះ៖

៣) ការធ្វើអោយកូដរបស់អ្នក មិនពឹងផ្អែកទៅលើ Container

ខណៈពេលដែលអ្នកអាចទទួលយកនូវ services ពី container ដោយស្វ័យប្រវត្តិនោះ គឺវាជារឿងល្អបំផុតដើម្បីធ្វើវាអោយតូច (minimize)។ ឧទាហរណ៏៖ នៅក្នុង NewsletterManager អ្នកបាន inject នូវ mailer service ជាជាងធ្វើការស្នើរវាពី container។ អ្នកអាច inject នូវ container ដែលស្ថិតនៅ និងបានទទួលនូវ mailer service ពីវាបានប៉ុន្តែ បន្ទាប់ពីនេះ វាអាចនឹងត្រូវបានភ្ជាប់ទៅនឹង container ពិសេសនេះ ដែលធ្វើអោយវាពិបាកក្នុងការ ប្រើប្រាស់ class នៅកន្លែងផ្សេងទៀត។

អ្នកអាចនឹងត្រូវការនូវ service ពី container នៅត្រង់ចំណុចមួយចំនួន ប៉ុន្តែវាគួរតែត្រូវការពេលខ្លះបើអាចទៅរួចក្នុងការបញ្ចូល​ (entry) point ទៅកាន់ application របស់អ្នក។

៤) ការតម្លើង (Setting up) Container ជាមួយនឹង Configuration Files

អាចធ្វើទៅបានជាមួយនឹងការតម្លើង services ដោយប្រើប្រាស់នូវ PHP ដូចខាងលើ  ដែលអ្នកអាចប្រើប្រាស់ configuration files។ នេះវាអាចអនុញ្ញាតអោយអ្នកក្នុងការប្រើប្រាស់ XML រឹក៏ YAML ដើម្បីធ្វើការសរសេរនូវអ្វីដែលលម្អិតសម្រាប់ service ជាជាងការប្រើនូវ PHP ដើម្បីកំណត់ services ដូចដែលបានបង្ហាញក្នុងឧទាហរណ៏ខាងលើ។ នៅក្នុងអ្វីមួយ ប៉ុន្តែ applications ដែលតូចជាងគេ គឺវាធ្វើយ៉ាងសមហេតុផលក្នុងការរៀបចំ service definitions ដោយធ្វើការ move ពួកគេទៅកាន់ configuration files មួយរឺច្រើន។ ដើម្បីធ្វើដូចនេះអ្នកក៏ត្រូវការតម្លើង Config component ផងដែរ។

ការ load នូវ XML config file៖

ការ load នូវ YAML config file៖

ប្រសិនបើអ្នកចង់ធ្វើការ load YAML config files អ្នកត្រូវធ្វើការតម្លើង Yaml component ជាមុនសិន។

ប្រសិនបើអ្នក ពិត ជាចង់ប្រើ PHP ដើម្បីបង្កើត services នោះ អ្នកអាច ផ្លាស់ទី (move) ទៅក្នុង config file ដោយឡែកពីគ្នានិង load វាស្ថិតក្នុងវិធីដែលស្រដៀងគ្នាបាន៖

ពេលនេះអ្នកអាចតម្លើងនូវ newsletter_manager និង mailer service ដោយប្រើប្រាស់ config files៖

YAML

XML

PHP