рдореБрдЭреЗ рдмрд╛рд░-рдмрд╛рд░ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ DI рдХреБрдЫ рдЬрдЯрд┐рд▓, рднрд╛рд░реА, рдзреАрдорд╛ рд╣реИ, рдХреЗрд╡рд▓ "рдмрдбрд╝реА" рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп (500+ рдореЙрдбрд▓ рд╡рд░реНрдЧ, 300+ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧ) рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдЪрд┐рдд рд╣реИред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдбреАрдЖрдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд┐рдореНрдлрдиреА рдХреЗ "рдж рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдШрдЯрдХ" рдЬреИрд╕реЗ рдкреИрдХреЗрдЬреЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдиреНрдпреВрдирддрдо рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдПрдХ рд╕рдордЭ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдо рд╕реНрд╡рдпрдВ рдХрд╛рдлреА рд╕рд░рд▓ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рдордЧреНрд░реА
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдХреА 500 рд▓рд╛рдЗрдиреЛрдВ рдХреА 2 рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ:
SimpleDi \ ClassManager - рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдХреИрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╣рдо Doctrine \ Common \ Cache \ ApcCache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ), рдпрд╣ рд╣рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╣рд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрд┐рдВрдм рдирд╣реАрдВ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдмрд╛рдж рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реНрд╕ рдХрд╛ рдПрдиреЛрдЯреЗрд╢рдиред рдпрд╣ рдмреВрдЯрд▓реЛрдбрд░ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
SimpleDi \ ServiceLocator - рдЗрд╕рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЗрдВрдЬреЗрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИред
1) рд╕рд░рд▓рддрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реЗрдЯрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ SimpleDi \ ServiceLocator рдорд▓реНрдЯреАрдЯрди рдкреИрдЯрд░реНрди (рдЙрд░реНрдл рдСрдмреНрдЬреЗрдХреНрдЯ рдкреВрд▓) рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
$service_locator->get('HelperTime');
2) рдХреНрд╖реЗрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк
class A { protected $helper_time; } $service_locator->get('A');
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреГрд╖реНрда рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╡рд░реНрдЧ рдХрдИ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдХреЙрд▓ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рд╣рд╛рдирд┐ рдХрд╛рдлреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧреАред
рдпрд╣рд╛рдВ рдореИрдВ рд╕рд┐рдореНрдлрдиреА рдХреА рдУрд░ рдПрдХ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд╣рд╛рдБ, рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрдореЗрдп рд╣реИ:
- рдХрд┐рд╕реА рднреА рджреГрд╢реНрдпрддрд╛ (рд╕рдВрд░рдХреНрд╖рд┐рдд, рдирд┐рдЬреА рд╕рд╣рд┐рдд) рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рдФрд░ рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдереЛрдбрд╝реЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрд╡рдпрдВ рдПрдХ рд╕реЗрд╡рд╛ рдХрдВрдЯреЗрдирд░ рд╣реИ (рдФрд░ рд╣рдорд╛рд░реЗ ServiceLocator :: get () рдХреЗ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рд╣реИ)
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ (рд╕реЗрд╡рд╛рдУрдВ) рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ $ рд╕реЗрд╡рд╛ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ-> рдлрд╝реАрд▓реНрдб = $ рдЗрдВрдЬреЗрдХреНрдЯ_ рд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдирд┐рдЬреА / рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣рдореЗрд╢рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдореЗрд╢рд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд╛рдкреНрдд рд╣реЛрдЧрд╛ред
3) рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
class B { protected $helper_time; public function setHelperTime($helper) { $this->helper_time = $helper; } } $service_locator->get('B');
рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╕рдмрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ рдФрд░, рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
4) рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреИрдирд╛рддреА
$service_locator->setConfigs(array( 'class_b_service' => array( 'class' => 'B', 'calls' => array( array('setHelperTime', array('@CustomHelperTime')), ) ) )); $service_locator->get('class_b_service');
рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдХреНрд╖рд╛ рдмреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╣рд╛рдпрдХ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд░реНрдЧ рдмреА рдЦреБрдж рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
5) рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред рдЬрдм рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХреЗ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдк ServiceLocator рдХреЛ рдПрдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
$users_factory = $service_locator; $users_row = array( array('id' => 1, 'name' => 'admin'), array('id' => 2, 'name' => 'guest'), ); $users = array(); foreach ($users_rows as $row) { $user = $users_factory->createService('User'); $user->setData($row); }
рдЙрджрд╛рд╣рд░рдг
рдПрдХ рдордирдорд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдпрд╣
github.com/yiisoft/yii/blob/master/framework/utils/CPasswordHelper.php рд╣реИрдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд░реНрдЧреЛрдВ Yii рдФрд░ CException рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред
class CPasswordHelper { тАж public static function generateSalt($cost=13) { if(!is_numeric($cost)) throw new CException(Yii::t('yii','{class}::$cost must be a number.',array('{class}'=>__CLASS__))); $cost=(int)$cost; if($cost<4 || $cost>31) throw new CException(Yii::t('yii','{class}::$cost must be between 4 and 31.',array('{class}'=>__CLASS__))); if(($random=Yii::app()->getSecurityManager()->generateRandomString(22,true))===false) if(($random=Yii::app()->getSecurityManager()->generateRandomString(22,false))===false) throw new CException(Yii::t('yii','Unable to generate random string.')); return sprintf('$2a$%02d$',$cost).strtr($random,array('_'=>'.','~'=>'/')); } }
рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛ рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╕рд╣реА рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:
class CPasswordHelper { public $securityManager; public $exceptor; тАж public function generateSalt($cost=13) { if(!is_numeric($cost)) $this->exceptor->create('yii','{class}::$cost must be a number.',array('{class}'=>__CLASS__)); $cost=(int)$cost; if($cost<4 || $cost>31) $this->exceptor->create('yii','{class}::$cost must be between 4 and 31.',array('{class}'=>__CLASS__)); if(($random=$this->securityManager->generateRandomString(22,true))===false) if(($random=$this->securityManager()->generateRandomString(22,false))===false) this->exceptor->create('yii','Unable to generate random string.'); return sprintf('$2a$%02d$',$cost).strtr($random,array('_'=>'.','~'=>'/')); } }
рдФрд░ рдПрдХ рд╡рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ - рдПрдХ рдЕрдкрд╡рд╛рдж рдЬрдирд░реЗрдЯрд░
class YiiExceptor { public function create($a, $b, $c = null) { throw new CException(Yii:t($a, $b, $c)); } }
рдирд┐рд╖реНрдХрд░реНрд╖
рдбрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ (рдЕрдХреНрд╕рд░ рд╢реНрд░реЗрдгреАрдмрджреНрдз) рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╣рд╕реНрддрд╛рдВрддрд░рдг рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╕реНрдерд┐рд░ рддрд░реАрдХреЛрдВ рд╕реЗ рдмрдВрдзреЗ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред
рд╕рдВрджрд░реНрдн
Github.com/mthps/SimpleDi рд╕реНрд╡рдпрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИ
рдереНрдпреЛрд░реА
en.wikipedia.org/wiki/D dependency_InjectionSymfony.com/doc/current/compenders/d dependency_injection/index.html рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ
рдПрдХ