рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ PHP рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд░рд▓ рдбрд┐ рдХрдВрдЯреЗрдирд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрднреА рднреА Habr├й рдкрд░ рдХреЛрдИ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реИред
рдХреНрдпреЛрдВ рд╢рд╛рдирджрд╛рд░? рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб 80 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ - рдорд╣рд╛рди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рд╡рд╕реНрддреБред
рдХрдВрдЯреЗрдирд░ рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдВрдмрдВрдз рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
require_once '/path/to/Pimple.php';
рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИ:
$container = new Pimple();
рдХрдИ рдЕрдиреНрдп DI рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рддрд░рд╣, рдкрд┐рдВрдкрд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ: рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ред
рдбрд┐рдХреНрд▓реЗрдпрд░ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕
рдкрд┐рдВрдкрд▓ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдХрдВрдЯреЗрдирд░ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
рд╕реЗрд╡рд╛ рдШреЛрд╖рдгрд╛
рдПрдХ рд╕реЗрд╡рд╛ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рдЕрдкрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрд╡рд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ: рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореЗрд▓ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ, рдЖрджрд┐ред
Pimple рдореЗрдВ, рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЙрди рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрдВрдЯреЗрдирд░ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдпрд╛ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗрд╡рд▓ рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рддреЗ рд╕рдордп рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдШреЛрд╖рдгрд╛ рдХрд╛ рдХреНрд░рдо рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рдирд┐рд░реНрдорд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИ:
рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗрд╡рд╛ рдШреЛрд╖рдгрд╛
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рд░ рдмрд╛рд░ рдкрд┐рдВрдкрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдирдИ рд╕реЗрд╡рд╛ рд╡рд╕реНрддреБ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╢реЗрдпрд░ () рд╡рд┐рдзрд┐ рдореЗрдВ рдШреЛрд╖рдгрд╛ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛:
$container['session'] = $container->share(function ($c) { return new Session($c['session_storage']); });
рд╕рдорд╛рд░реЛрд╣ рдШреЛрд╖рдгрд╛
рдЪреВрдВрдХрд┐ рдкрд┐рдВрдкрд▓ рд╕рднреА рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдореЗрдВ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ () рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$container['random'] = $container->protect(function () { return rand(); });
рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рдж рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрд┐рдд рд╕реЗрд╡рд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдлрд┐рд░ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реЗрд╡рд╛ рдмрдирдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
$container['mail'] = function ($c) { return new \Zend_Mail(); }; $container['mail'] = $container->extend('mail', function($mail, $c) { $mail->setFrom($c['mail.default_from']); return $mail; });
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕реЗ рдкреВрд░рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕реЗрд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╡рд░реНрддрдорд╛рди рдХрдВрдЯреЗрдирд░ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рд╕реЗрд╡рд╛ "рд╕рд┐рдВрдЧрд▓рдЯрди" рдереА, рддреЛ рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдРрдб-рдСрди рдХреЗ рдХреЛрдб рдХреЛ рд╢реЗрдпрд░ () рд╡рд┐рдзрд┐ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╣реИрдВ рддреЛ рдРрдб-рдСрди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
$container['twig'] = $container->share(function ($c) { return new Twig_Environment($c['twig.loader'], $c['twig.options']); }); $container['twig'] = $container->share($container->extend('twig', function ($twig, $c) { $twig->addExtension(new MyTwigExtension()); return $twig; }));
рдПрдХреНрд╕реЗрд╕ рдлрдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рд╕рд░реНрд╡рд┐рд╕
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдкрд┐рдВрдкрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реАрдзреА рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдЪреНрдЪреЗ () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$container['session'] = $container->share(function ($c) { return new Session($c['session_storage']); }); $sessionFunction = $container->raw('session');
рддреИрдпрд╛рд░ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ
рдпрджрд┐ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрдВрдЯреЗрдирд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд┐рдВрдкрд▓ рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╣реИ:
class SomeContainer extends Pimple { public function __construct() { $this['parameter'] = 'foo'; $this['object'] = function () { return stdClass(); }; } }
рдФрд░ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рддреИрдпрд╛рд░ рдХрдВрдЯреЗрдирд░ рдХреЛ рджреВрд╕рд░реЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$container = new Pimple();
рдирд┐рд╖реНрдХрд░реНрд╖
рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреМрдЦрдЯреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдмрд┐рдирд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд┐рдВрдкрд▓ рдХреЛ рдПрдХ рд╕рд░рд▓ рдФрд░ рдЫреЛрдЯреЗ рдбреАрдЖрдИ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдиреВрдВрдЧрд╛ред
рдкреБрдирд╢реНрдЪ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг - рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рд░реАрдбрдореА рдкрд┐рдВрдкрд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рджред