سریع شروع سیمفونی دی (تزریق وابستگی) خودآموز

توسط لوید Watkin استیون ، شنبه 2010 اوت 14 14:21

چیست تزریق وابستگی (دی)؟

تزریق وابستگی تکنیکی است که اجازه می دهد تا آزادانه برای اشیاء همراه در یک برنامه نرم افزاری است. به طور کلی اگر یک شی نیاز به دستیابی به قابلیت های دیگری از این امر می تواند منجر به نمونه سازی داخلی سیستم های محکم همراه. با اجرای تزریق وابستگی ما تزریق اشیاء مورد نیاز برای استفاده آماده است (گاهی اوقات نیز به وارونگی کنترل مراجعه -- کمیته بین المللی المپیک). نگاهی به مثال زیر :

  <؟ پی اچ پی
 کلاس DecisionMaker {
     makeDecision عمومی تابع (پارامتر های آرایه $) {
         / / آیا نیازمند آداپتور پایگاه داده
         داده پردازی $ = جدید DecisionParameters () ؛
         $ = $ parameterScore داده پردازی -> getScore ($ پارامترها) ؛
         / *...  برخی از تصمیم منطق ادامه...  * /
         بازگشت ($ parameterScore> 50) ؛
     }
 } 

این قطعه از کد است گفته می شود شدیدا جسم همراه به DecisionParameters. بازنویسی بالا را در مد چهار گره شل به همراه ما می خواهم چیزی شبیه به... داشته باشد.

  <؟ پی اچ پی
 کلاس DecisionMaker {
     خصوصی _dp $ ؛
     عمومی تابع __construct ($ داده پردازی) {
         این $> - _dp = $ داده پردازی ؛
     }
     makeDecision عمومی تابع (پارامتر های آرایه $) {
         $ = $ parameterScore این -> _dp -> getScore ($ پارامترها) ؛
         / *...  برخی از تصمیم منطق ادامه...  * /
         بازگشت ($ parameterScore> 50) ؛
     }
 } 

در حالیکه به دست آوردن منافع کد آزادانه همراه ما در حال اضافه کردن پیچیدگی به طوری که هر بار یک شیء نمونهای است ما نیز به نمونه از وابستگیها و با تصویب آن در این بیش از حد. به عنوان مثال ، این :

  $ = انتخاب DecisionMaker جدید () ؛
 اکو انتخاب makeDecision $ -> (آرایه ('تلاش' => 'پایین' ، 'بازگشت' => ​​'بالا')) ؛ 

اکنون می شود :

  داده پردازی $ = جدید DecisionParameters () ؛
 $ = انتخاب DecisionMaker جدید ($ داده پردازی) ؛
 اکو انتخاب makeDecision $ -> (آرایه ('تلاش' => 'پایین' ، 'بازگشت' => ​​'بالا')) ؛ 

این وضعیت دردناک تر می شود به عنوان تعدادی از وابستگیهای برای کلاس افزایش می یابد ، و اگر خود را وابسته به وابستگیها؟ این کاملا می تواند به سرعت تبدیل به کابوس دولت شی! وارد وابستگی ظروف تزریق (یا چارچوب)...

ظروف وابستگی به تزریق / چارچوب

ظروف وابستگی به تزریق (یا چارچوب) رسیدگی به روند ایجاد شی ؛ instantiating و تزریق هر گونه وابستگی قبل از بازگشت به عنوان مثال برای تماس گیرنده.

در کد خود را به جای ایجاد اشیاء جدید به طور مستقیم ما درخواست یک کپی از شی از ظرف دی. هدف ما در حال بازگشت در حال حاضر تمام وابستگیها و تزریق آن شی است آماده رفتن است.

سیمفونی وابستگی به تزریق کانتینر

سیمفونی است که احتمالا بهترین پشته شناخته شده خود را برای کامل MVC چارچوب با این حال آنها نیز منتشر شد تعدادی از قطعات است که می تواند به طور مستقل مورد استفاده قرار گیرد. برای مثال ، وابستگی ظرف تزریق ما قصد داریم به بحث در مورد اینجا ، YAML تجزیه کننده ، موتور قالب ، نگاه کنید به اجزای سیمفونی برای اطلاعات بیشتر.

سیمفونی ظرف دی است بر اساس آن از چهارچوب بهار در جاوا .

بوتاسترپینگ

به منظور راه انداز سیمفونی چارچوب وابستگی به تزریق استفاده می کنیم کد زیر را به عنوان شامل. من را انتخاب کرده اند به استفاده از YAML فقط به دلیل آسان خود را به خواندن و راه اندازی. حداکثر سرعت برای شما ممکن است بخواهید برای نوشتن از ظروف خود را به ساده پی اچ پی (ظرف سیمفونی می توانید انجام دهید این کار را برای یک بار راه اندازی) ، و یا معادل آن کش تمام ظرف با استفاده از Zend_Cache ، یا مشابه آن.

برای نصب سیمفونی دی پیروی از دستورالعمل از جمله در اینجا http://components.symfony-project.org/dependency-injection/installation ، اضافه کنید و آن را به مسیر شما.

  / / بار ظرف سیمفونی دی
 نیاز به 'sfServiceContainerBuilder.php' ؛
 $ ظرف = sfServiceContainerBuilder جدید () ؛
 $ لودر = sfServiceContainerLoaderFileYaml جدید ($ ظرف) ؛
 $ لودر -> بار (APPLICATION_PATH / پیکربندی / دی / services.yml ') ؛ 

ابتدا ظرف های جدید ما معرفی کردن بوسیله کنسرت ، و سپس تنظیمات خود را از یک فایل YAML ما بار. توجه : ظرف دی پیکربندی بار می تواند از فرمت های مختلف مانند کاپرفیلد ، YAML ، پی اچ پی ، و فایل *. من تمایل به تنها شامل پرونده YAML و وارد کردن فایل های دیگر را از درون وجود دارد.

فایل های پیکربندی را می توان چندین وارداتی با استفاده از فرمت های مختلف ، تعاریف جدیدتر جای نوشتن آن که از قبل تعریف شده است. فایلهای پیکربندی می تواند اشاره به اشیاء و پارامترها عبارتند از.

این فایل * تنها قادر به تعریف پارامترها و قادر به وارد کردن فایل های دیگر

به عنوان مثال تنظیمات

  واردات :
 -- {منبع :} daos.yml

 پارامترها :
 نام کاربری : دروغ

 خدمات :
 # مدل مشتری
 model.customer :
 کلاس : Pro_Customer
 تماس :
 -- [setLogger ، [@ utils.logger]]
 -- [setDao ، [@ data.userdata.mysql]]
       -- [setUserName ، [نام کاربر ٪ ٪]]

 # مدل محصول
 model.product :
 کلاس : Pro_Product
     آرگومان می گیرد : [٪ ٪ نام کاربری ، {نوع : ٪ accesslevel ، lastlogin : ٪ ٪ lastlogin}]
 تماس :
 -- [setDao ، [@ data.product.mysql]]

 # چوب
 utils.logger :
 کلاس : Pro_Logger
     سازنده : getInstance
 تماس :
 -- [setHandle ، [@ utils.filewriter]] 

من فکر می کنم کد بالا نسبتا خود توضیحی اما برای من وضوح توضیح هر بخش در حال حاضر.

اول از همه برخی از واردات تعریف کنیم (به عنوان مثال فایل های دیگر به تجزیه) ، من می خواهم به گروه بندی من برای DAOs به عنوان مثال در یک فایل ، خدمات شهری و در یکی دیگر از نام فایل مناسب. در حالیکه کمی آهسته تر از آن سرعت تعمیر و نگهداری از فایل های تنظیمات. آن نیز ممکن است به تجزیه فایل از فرمت های دیگر با استفاده از واردات پرچم های متفاوت است. فایلها به ترتیب با تعاریف جدیدتر جای نوشتن و یا خدماتی را که قبلا تعریف اصلاح / پارامترهای تجزیه.

به عنوان یک پارامتر تعریف کنیم ، به طور کلی پارامتر پی اچ پی می توانید هر نوع متغیر می باشد. در این مرحله من نمی دانستم چه پارامتر نام کاربری من باید باشد (برای من که نیاز به تأیید هویت!) ، بنابراین من مقدار پیش فرض تعریف شده و من که ارزش بازنویسی شد. توجه داشته باشید ، کلاس ها نمونه سازی نیست تا زمانی که شما بخواهید آنها را چنان تعریف پارامترهای کمی بعد کاملا خوب است. پس از این تعریف کنم برخی از خدمات :

  1. معرفی کردن بوسیله کنسرت Pro_Customer ، عبور از چوب به عنوان مثال من به setLogger متد () ، اضافه کردن من در خروجی زیر دسترسی شی داده (دائو) ، و با تصویب در نام کاربری نیز هست. هر بار که می خواهم برای این شئ بخواهید من می خواهم یک نمونه جدید
  2. ایجاد یک نمونه از Pro_Product ، بحث عبور از نام کاربری و یک آرایه به گزینه های سازنده. پس از instantiation setDao تماس () و با تصویب آن محصول من دائو
  3. من یک کپی از Pro_Logger بده نمونه از آن را با استفاده از getInstance متد () و با تصویب یک کپی از شی فایل من نویسنده از طریق setHandle () یک بار لود شده است. نویسنده پرونده من در یکی از واردات من تعریف شده است.

در داخل فایل های پیکربندی خدمات نماد اشاره توسط prepending با نام '@' ، پارامترها ٪ اشاره شده توسط prepending و الحاق با '٪' نمادها ، نام کاربری eg@utils.logger ٪.

اضافه کردن داده ها پست بارگذاری

گاهی اوقات شما نمی دانید که چه مقدار از پارامترهای باید تا بعد از شما bootstrapped ، به عنوان پارامتر با نام کاربری خود در بالا. به منظور بازنویسی ارزش offsetSet () روش استفاده شود ، اولا عبور از نام پارامتر به دنبال آن مقدار جدید آن :

  $ ظرف -> offsetSet ('نام کاربری' ، $ نام کاربری) ؛ 

گرفتن اشیاء از ظرف

پس از نصب به جای instantiating اشیاء به طور مستقیم ما در حال حاضر به ظرف دی به دریافت موارد. با دی سیمفونی ما تماس بگیرید getService متد () ، عبور در یک رشته که توصیف متغیر که می خواهید برای بازیابی ، به عنوان مثال

  چوب $ = $ ظرف -> getService ('utils.logger') ؛ 

این معادل از انجام :

  $ چوب = Pro_Logger : : getInstance () ؛
 $ fileWriter = Pro_Writer_FileWriter جدید () ؛
 $ چوب -> setHandler ($ fileWriter) ؛ 

ممکن است برای تعیین اینکه آیا ظرف است نمونه ای از خدمات از طریق تماس hasService متد () ، که باز یک مقدار بولی.

لازم نیست به آن دسترسی دارند ظرف فراتر از سطح بالای برنامه شما از یک بار فراخوانی یک مثال از تمام وابستگیهای مورد نیاز حق کردن به عمیق ترین اعماق درخواست شما در حال حاضر راه اندازی و در انتظار به آن می شود.

واحد آزمون

تزریق وابستگی نیز تا به سود اضافه از اجازه دادن به اشیاء به در انزوا آزمایش می شود. با توجه به DecisionMaker به عنوان مثال قبل از پیاده سازی کلاس وابستگی به راه اندازی تزریق نتایج آزمایش ما نیز وابسته به اجرای کلاس DecisionParameters.

باید DecisionParameters کلاس های مختلف نتایج آزمایشات ما می تواند بازگشت شروع شکست را از طریق هیچ تقصیر از خود ما. با استفاده از تزریق وابستگی ما هم اکنون می توانید در عبور شی DecisionParameters که بازده شناخته شده است / ثابت پارامترهای ورودی مجموعه ای از نتایج مشخصی برای ، ما در حال حاضر تست DecisionMaker در انزوا از هر گونه عوامل بیرونی ، یعنی اگر ما شروع به تست این ناکامی را می توان مستقیما چیزی منسوب به در حال تغییر در کلاس DecisionMakeer. این بسیار مهم است باید به شما با تکیه بر داده ها آزمون از یک پایگاه داده برای تست.

پیکربندی برنامه

روشی که در آن درخواست خود را بر روی سرور رفتار تولید خود را ناچار خواهد شد از راه اندازی خود را توسعه متفاوت است. برای مثال ، در محیط توسعه سطح از ورود به سیستم می شود خیلی بیشتر از گرانول تولید شده بر روی سیستم شما. با تغییر وابستگی به تزریق خود را ظرف یک فایل پیکربندی کمی (یا تجزیه فایل تنظیمات اضافی) تغییر رفتار با توجه به محیط ساده ساخته شده است.

بر اساس نوع hinting در رابط به جای پیاده سازی هنگام ایجاد وابستگیهای خود آن نیز امکان پذیر به مبادله از اجزای سازنده برای اجزاء سازگار با چند خط از YAML یا کاپرفیلد. به عنوان مثال ، شما در حال حاضر ممکن است) شما دسترسی به پایگاه داده از طریق خروجی دائو (دسترسی داده های شی ، اما در زمانی که شما ممکن است یا توسعه PDO ، Zend_Db ، دکترین اجرای این دائو. با اضافه کردن اجرای جدید خود را در فایل پیکربندی را به ناگهان همه اشیاء استفاده می شود که اجرای قدیمی خروجی در حال حاضر با استفاده از اجرای جدید خود را بدون نیاز به حمله روده از درخواست شما.

یادداشت ها

  • با تنظیم مشترک : درست در پیکربندی ما همیشه با توجه به همان مثال یک شی. این بسیار مفید است در هنگام برخورد با اشیاء که شامل منابع مانند اتصال پایگاه داده ، فایل دسته ، و غیره
  • دو روش که در آن وابستگی را می توان تزریق وجود دارد. یکی به تصویب وابستگیها با سازنده ، و یا معادل آن از طریق روش توله شکاری و پشمالوی بویی. الگوی کلی پذیرفته شده است به تصویب وابستگیهای مورد نیاز از طریق سازنده و از طریق optionals setters. ترجیح شخصی من این است که استفاده setters برای همه چیز ، اما این به پایین توسعهدهنده فردی

سرانجام....

همراه با بحث کوتاهی در تزریق وابستگی و مزایای خود را دارد و معایب این نیز راهنمای سریع شروع به اجرای سیمفونی وابستگی به تزریق کانتینر... امیدوارم شما را دیده ام که آن را بسیار سریع و آسان است. از اینجا به بعد شما قادر خواهید بود برای شروع استفاده از تزریق از طریق وابستگی به درخواست شما و نگاه کردن به استفاده از بسیاری دیگر از ویژگی های پیشرفته (هر چند مثال ساده را پوشش می دهد اکثریت قریب به اتفاق عملکرد شما نیاز). مثل همیشه من تو را به نقطه کتابچه راهنمای کاربر برای کسب اطلاعات بیشتر.

4 پاسخ به "شروع سریع سیمفونی دی (تزریق وابستگی) آموزش"

  1. [...]این پست در توییتر توسط وینسنت Jousse ، استیون لوید Watkin ذکر شده است. استیون لوید Watkin گفت : http://bit.ly/cUO2ov سریع برای شروع سیمفونی # چارچوب وابستگی به تزریق پی اچ پی # # zf [...]

  2. هاری هزار تن می گوید :

    مقاله بزرگ.
    من شک در حال حاضر. هنگامی که ما در حال بوتاسترپینگ بارگذاری فایل های پیکربندی yaml. بنابراین می کند که ایجاد اشیاء برای همه ، که ما لازم نیست؟
    برای مثال : من یک چیزی کلاس استفاده شده است که فقط گاهی اوقات. پس آیا آن را ایجاد یک شی و یا آن را به قدر کافی هوشمند از طریق توابع autoload بار زمانی که من خواستار getInstance متد (). من دریافت نمی کند که یعنی چرا.

    با تشکر

  3. نه ، کلاس ها فقط لود زمانی که آنها برای اولین بار مورد نیاز است.

    در getInstance () به عنوان مثال کلاس نمونه سازی مانند :
    $ کلاس کلاس = : : getInstance () ؛
    به جای :
    $ کلاس = کلاس جدید () ؛
    به طور کلی این است که هنگامی استفاده شود که اجرای الگوی تک.

  4. [...]به شما اجازه استفاده در دی پروژه خود را در راه آسان است. استیون لوید Watkin صرف وقت خود را در نوشتن tutorial.It شروع سریع ارزشش به ذکر است که سیمفونی دی کانتینر است یک کتابخانه موجود مستقل به عنوان [...]سیمفونی

پاسخی بنویسید













تم های پانوراما Themocracy

6 بازدید کنندگان آنلاین
4 مهمان ، 2 رباتها ، 0 کاربران
حداکثر بازدید کننده امروز : 24 در 00:36 UTC
این ماه : 26 در 2011/07/05 12:35 UTC
این سال : 130 در 28-03-2011 22:40 UTC
تمام زمان حال : 130 در 28-03-2011 10:40 UTC