התחלה מהירה Symfony DI (הזרקת תלות) מדריך
מהי הזרקת תלות (DI)?
הזרקת תלות היא טכניקה המאפשרת אובייקטים מצמידים ברפיון בתוך יישום תוכנה. בדרך כלל, אם אובייקט דורש גישה לפונקציות של אחרת זה יהיה מופעים פנימי המוביל אל מערכות מצמידים בחוזקה. על ידי יישום הזרקת התלות שאנו מזריקים את האובייקטים הדרושים מוכן לשימוש (המכונה לעתים גם היפוך של שליטה - IOC). קחו את הדוגמה הבאה:
<? PHP בכיתה DecisionMaker { הפונקציה makeDecision הציבור (מערך הפרמטרים $) { / / צריך את המתאם באתר $ = DP DecisionParameters חדש (); $ = ParameterScore getScore $ DP-> ($ פרמטרים); / * ... כמה היגיון בהחלטה יותר ... * / התשואה ($ parameterScore> 50); } }
קטע זה של הקוד היא אמרה להיות מצמידים בחוזקה את DecisionParameters האובייקט. שכתוב לעיל באופן רופף מצמידים היינו צריכים משהו כזה ....
<? בכיתה PHP DecisionMaker {$ _dp פרטית; תפקיד ציבורי __construct ($ DP) {$ הזה-> _dp = $ DP;} makeDecision תפקיד ציבורי (מערך $ פרמטרים) {$ parameterScore = $ זה getScore> _dp-> ($ פרמטרים); / * ... כמה היגיון בהחלטה יותר ... * / לחזור ($ parameterScore> 50);}}
בעוד להשיג את היתרונות של הקוד מצמידים ברפיון אנחנו מוסיפים למורכבות כזו שבכל פעם אובייקט מופעים לנו גם להפעלת החסות שלו ולהעביר אלה מדי. לדוגמה, זה:
$ = בחירה DecisionMaker חדש (); הד makeDecision $ ברירה-> (מערך ('מאמץ' => 'נמוך', 'לחזור' => 'גבוהה'));
כעת הופך:
$ = DP DecisionParameters חדש (); $ = בחירה DecisionMaker חדש ($ DP); הד makeDecision $ ברירה-> (מערך ('מאמץ' => 'נמוך', 'לחזור' => 'גבוהה'));
מצב זה הופך להיות כואב יותר ככל שמספר תלות בכיתה הוא גדל, ומה אם תלות עצמם יש תלות? זה יכול די מהר להפוך לסיוט הממשל אובייקט! הזן הזרקת מכולות תלות (או מסגרות) ...
תלות מכולות הזרקה / Frameworks
תלות מכולות הזרקה (או מסגרות) לטפל בתהליך של יצירת אובייקט; מופע ו הזרקת תלות לפני שחזר מופע למתקשר.
בקוד שלך ולא ליצור אובייקטים חדשים ישירות לנו לבקש עותק של האובייקט מן המיכל DI. את האובייקט שאנחנו חזר כבר את כל החסות שלו הזריק ואת האובייקט הוא מוכן ללכת.
Symfony הזרקת תלות מיכל
Symfony הוא כנראה הידוע המלא שלהם מחסנית MVC במסגרת זאת הם שוחררו גם מספר של רכיבים שניתן להשתמש בהם באופן עצמאי. לדוגמה, את הזריקה תלות מיכל אנחנו הולכים לדבר כאן, YAML מנתח, מנוע templating, לראות רכיבים Symfony יותר.
Symfony מיכל DI מבוססת על כך מן המסגרת האביב ב -Java .
Bootstrapping
כדי bootstrap את הזריקה תלות Symfony במסגרת לנו להשתמש בקוד כפי שנכללו להלן. בחרתי להשתמש YAML רק בגלל לקרוא בקלות ההתקנה שלו. עבור המהירות המרבית מומלץ לכתוב את מכולות שלך רגיל PHP (Symfony המיכל יכול לעשות את זה בשבילך פעם ההתקנה), או לחילופין המטמון מיכל שלם באמצעות Zend_Cache , או דומה.
כדי להתקין Symfony DI אחר ההוראות הכלול כאן http://components.symfony-project.org/dependency-injection/installation , ולהוסיף אותו הנתיב שלך.
/ / טעינת המכולה DI Symfony דורשים "sfServiceContainerBuilder.php '; $ = מיכל sfServiceContainerBuilder חדש (); $ = מטעין sfServiceContainerLoaderFileYaml חדש ($ מכולה); עומס $ מטעין-> (APPLICATION_PATH '/ config / di / services.yml'.);
ראשית אנו instantiate מכולה חדשה, ולאחר מכן אנו לטעון תצורת שלנו מקובץ YAML. הערה: את המיכל DI יכול לטעון config מתוך מספר פורמטים כגון XML , YAML, PHP, ו INI *. אני נוטה לכלול קובץ יחיד YAML ולייבא קבצים אחרים מבפנים שם.
קבצי תצורה אחדים ניתן לייבא באמצעות פורמטים שונים, ההגדרות הבאות להחליף אלה שכבר הוגדרו. קבצי התצורה יכול לכלול התייחסויות עצמים ופרמטרים.
INI * הוא רק מסוגל להגדיר את הפרמטרים אינו מסוגל לייבא קבצים אחרים
תצורת דוגמה
יבוא: - {משאב: daos.yml} פרמטרים: שם משתמש: שווא שירותים: # מודל הלקוח model.customer: הכיתה: Pro_Customer קורא: - [SetLogger, [@] utils.logger] - [SetDao, [@ data.userdata.mysql]] - [SetUserName, [username%%]] # דגם המוצר model.product: הכיתה: Pro_Product הטיעונים: [% username%, {סוג:%% accesslevel, lastlogin:% lastlogin%}] קורא: - [SetDao, [@ data.product.mysql]] # לוגר utils.logger: הכיתה: Pro_Logger בנאי: getInstance קורא: - [SetHandle, [@] utils.filewriter]
אני חושב את הקוד לעיל היא עצמית די ההסבר אבל למען הבהירות אני אסביר כל חלק כעת.
ראשית נגדיר כמה היבוא (כלומר קבצים אחרים כדי לנתח), אני רוצה קבוצה תצורות שלי DAOs למשל בקובץ אחד, שירות אחר ואת שם הקובץ כראוי. בעוד קצת איטי זה מאיץ את התחזוקה של קבצי תצורה. שלו גם ניתן לנתח קבצים של תבניות אחרות באמצעות דגלים ייבוא שונים. קבצים הם נותחו כדי עם ההגדרות הבאות להחליף או לתקן השירותים שהוגדרו בעבר / פרמטרים.
הבא אנו מגדירים פרמטר, פרמטר יכול כלל להיות כל סוג משתנה PHP. בשלב זה אני לא יודע מה פרמטר את שם המשתמש שלי צריך להיות (אני צריך לאמת את זה!), אז אני כבר מוגדר ערך ברירת מחדל ואני לדרוס ערך זה מאוחר יותר. , כיתות הערה אינם מופעים עד שאתה מבקש מהם כל כך הגדרת הפרמטרים קצת מאוחר יותר הוא בסדר גמור. בעקבות כך אני מגדיר כמה שירותים:
- מופע Pro_Customer, לעבור מופע של לוגר שלי setLogger () שיטה, להוסיף שלי MySQL אובייקט גישה לנתונים (DAO), ולהעביר את שם המשתמש גם כן. בכל פעם אני שואלת עבור אובייקט זה אני רוצה מופע חדש
- יצירת מופע של Pro_Product, לעבור הטיעונים של שם המשתמש ואת מערך אפשרויות הבנאי. לאחר setDao אדגום קוראים () ולהעביר אותו המוצר שלי DAO
- תן לי עותק של Pro_Logger, מופע זה באמצעות getInstance () שיטה ולהעביר עותק של האובייקט שלי הקובץ הסופר דרך setHandle () פעם טעון שלה. הסופר הקובץ שלי מוגדר אחד של היבוא שלי.
בתוך התצורה שירותי הקבצים הפניה prepending שם עם '@' סמל, הפרמטרים הם הפניה prepending ואת צירוף עם "%" סמלים, eg@utils.logger% username%.
הנתונים הוספת הודעה הטעינה
לפעמים אתה לא יודע מה הערך של הפרמטרים צריך להיות עד אחרי שיש לך bootstrapped, כמו עם פרמטר שם המשתמש שלנו לעיל. כדי להחליף את הערך offsetSet () שיטה משמש, קודם כל להעביר את שם הפרמטר ואחריו הערך החדש שלה:
offsetSet $ מכולה-> ('username', $ username); תחילת אובייקטים מן המיכל
לאחר ההתקנה במקום מופע אובייקטים ישירות עכשיו אנחנו הולכים המיכל די כדי לקבל מקרים. עם DI Symfony שאנו מכנים getService () שיטה, עובר בתוך מחרוזת שמתארת את המשתנה שאתה רוצה להחזיר, למשל
$ = לוגר getService $ מכולה-> ("utils.logger '); זה יהיה לבצע את המקבילה של:
$ = לוגר Pro_Logger:: getInstance (); $ = FileWriter Pro_Writer_FileWriter חדש (); $-> לוגר setHandler ($ fileWriter);
אפשר לקבוע אם המיכל יש מופע של שירות על ידי קריאה hasService () שיטה, אשר מחזירה ערך בוליאני.
כדי לקבל גישה למכולות מעבר לרמה העליונה של היישום שלך מאז פעם אחזור מופע כל תלות נדרש ימין למטה אל מעמקי העמוקים ביותר של היישום שלך הצורך שלה לא כבר ההתקנה מחכה שיקראו.
יחידת בדיקה
הזרקת תלות יש גם ערך מוסף המאפשר אובייקטים כדי להיבדק בבידוד. לקחת את הדוגמה בכיתה DecisionMaker לפני ביצוע ההתקנה הזרקת תלות בתוצאות הבדיקה שלנו היו גם מותנה בביצועה של DecisionParameters הכיתה.
תוצאות צריך לחזור DecisionParameters השונות בכיתה הבדיקות שלנו יכול להתחיל שלא באשמתו לא משלנו. באמצעות הזרקת תלות כעת אנו יכולים לעבור באובייקט DecisionParameters אשר מחזירה ידוע / קבוע קבוצה של תוצאות עבור פרמטרים של קלט מסוים, אנו נמצאים כעת בדיקות DecisionMaker בבידוד מכל הגורמים החיצוניים, כלומר אם הבדיקות שלנו להתחיל כושלת זו ניתן לייחס באופן ישיר משהו שינוי ב DecisionMakeer הכיתה. הדבר חשוב במיוחד אתה צריך להיות להסתמך על נתוני הבדיקה ממסד נתונים לבדיקה.
יישום תצורת
האופן שבו היישום שלך מתנהג על שרת הייצור שלך תהיה בהכרח שונה ההתקנה הפיתוח שלך. לדוגמה, בסביבת פיתוח רמת בכניסה יהיה הרבה יותר מפורט יותר על מערכת הייצור שלך. על ידי שינוי הזרקת התלות שלך מכיל קבצי תצורה קלה (או ניתוח קובץ תצורה נוספת) את שינוי ההתנהגות בהתאם לסביבה נעשית פשוטה.
לפי סוג רומז על ממשקים ולא מימושים כאשר הגדרת התלות שלך בו אפשר גם להחליף את הרכיבים עבור רכיבים תואמים עם כמה שורות של YAML או XML. לדוגמה, ייתכן כרגע גישה למסד הנתונים באמצעות DAO MySQL (Data Access Object), אבל עם הזמן אתה עלול לפתח PDO, Zend_Db, או דוקטרינת הביצוע של DAO זה. על ידי הוספת יישום חדש לתוך התצורה שלך הקובץ פתאום כל האובייקטים בשימוש יישום הישן MySQL כיום באמצעות יישום חדש שלך ללא צורך לתקוף את המעיים של היישום שלך.
הערות
- לפי הגדרה משותפת: נכון בתצורת אנחנו מקבלים תמיד את המופע באותו חפץ. זה מאוד שימושי כאשר התמודדות עם אובייקטים אשר מכילים מקורות כגון חיבורי מסד נתונים, הקובץ ידיות, וכו '
- קיימות שתי שיטות ידי אשר תלות יהיה ניתן להזריק. אחת היא להעביר תלות עם הבנאי, או לחילופין באמצעות שיטות ציד. התבנית המקובלת היא לעבור תלות הנדרש באמצעות הבנאי ו optionals דרך סטר. ההעדפה האישית שלי היא להשתמש setters לכל דבר, אבל זה עד מפתח את הפרט
לבסוף ....
יחד עם דיון קצר על הזרקת תלות היתרונות והחסרונות שלה זה גם היה מדריך להתחלה מהירה, כדי ליישם את התלות Symfony הזרקת מיכל ... אני מקווה שראית כי זה מהיר באופן מפתיע וקל. מכאן תוכל להפעיל באמצעות הזרקת התלות באמצעות היישום שלך כדי לחפש משתמש הרבה יותר של תכונות מתקדמות (אף דוגמה פשוטה מכסה את הרוב המכריע של פונקציונליות תוכל לדרוש). כמו תמיד אני מצביע לך על ספר לקבלת מידע נוסף.


















































[...] הודעה זו הוזכר לצפצף על ידי וינסנט Jousse, סטיבן לויד ווטקין. סטיבן לויד ווטקין אמר: http://bit.ly/cUO2ov התחלה מהירה עבור # תלות Symfony הזרקת במסגרת # # PHP ZF [...]
מאמר מצוין.
יש לי ספק עכשיו. כאשר bootstrapping אנחנו מעמיסים את קבצי התצורה yaml. אז זה יוצר אובייקטים לכל, שבו אנחנו לא צריכים?
עבור למשל: יש לי משהו בכיתה שבה הוא משמש רק לפעמים. אז זה יוצר אובייקט או שזה מספיק חכם כדי לטעון באמצעות פונקציות autoload כאשר אני קורא getInstance () שיטה. אני לא מקבל את זה, כלומר למה.
תודה
לא, כיתות נטענים רק כאשר הם נדרשים הראשון.
ב getInstance () למשל הכיתה היא מופעים כמו:
$ = מחלקה מחלקה:: getInstance ();
במקום:
$ = מחלקה מחלקה חדשה ();
בדרך כלל זה משמש כאשר יישום דפוס סינגלטון.
[...] ומאפשרות לך להשתמש DI בפרוייקט באופן קל. סטיבן לויד ווטקין לבלות את זמנו על כתיבת tutorial.It להתחלה מהירה שווה להזכיר כי Symfony DI מיכל היא ספריית העצמאי זמין כמו [...] Symfony