
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ
рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА IoC рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░
рдореЙрдбреНрдпреВрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИред рдЕрдм рдореИрдВ рдФрд░ рднреА рдЖрдЧреЗ рдмрдврд╝ рдЧрдпрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдЬреЛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред рдФрд░ рдореИрдВ рдирдП
рдЧреНрд░реИрдиреБрд▓рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА
рдмрддрд╛рдКрдВрдЧрд╛ ред
рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдПрдХ рдРрд╕реА рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ
рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ред
рдЪрд▓реЛ рднрдВрдбрд╛рд░рдг рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ:
interface StorageInterface { public function set($key, $value); public function get($key); public function save(); public function load(); }
рдареАрдХ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ FileStorageред
FileStorage.php class FileStorage implements StorageInterface { private $file = 'data.json'; private $data = array(); public function set($key, $value) { $this->data[$key] = $value; } public function get($key) { return $this->data[$key]; } public function save() { file_put_contents($this->file, json_encode($this->data)); } public function load() { $this->data = json_decode(file_get_contents($this->file)); } }
рдЕрдм рдПрдХ рдпреВрдЬрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ
class User { public function __construct(StorageInterface $storage) { } }
рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
$user = new User(new FileStorage());
рдЦреИрд░, рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕рд╕реНрдЯреЛрд░реЗрдЬ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ, рд╕реНрдЯреЛрд░реЗрдЬрдЗрдВрдЯрд░рдлреЗрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдлрд╛рдЗрд▓рд╕реНрдЯреЛрд░ рдХреА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдмрджрд▓рдирд╛ рдЕрдкрдиреЗ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ:
$options = array( 'StorageInterface' => 'FileStorage', ); $user = new User($option['StorageInterface']);
рдЕрдм FileStorage рдХреЛ DatabaseStorage рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
$options['StorageInterface'] = 'DatabaseStorage';
рдЬрд┐рд╕реЗ рдЕрдм рд╣рдо рд╡рд┐рдХрд▓реНрдк рдХрд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░ рд╣реИред
рдпрд╣ рдРрд╕реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рдордЭ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЖрдИрдУрд╕реА рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИред
рдЕрдм рдЗрд╕реЗ
рдЧреНрд░реИрдиреБрд▓рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреЛрдИ рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЧреНрд░реИрдиреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк
рд╕рд┐рдореНрдлрдиреА рдХреА рд╕рдорд╛рдирддрд╛ рдореЗрдВ
рд╕рд┐рдореНрдлрдиреА рдШрдЯрдХреЛрдВ рд╕реЗ рдПрдХ рдПрдорд╡реАрд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░реЗрдиреНрдпреБрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЙрд╕рдХреА рдХрдХреНрд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
use Granula\Module; use Inversion\Container; class MyModule extends Module { public function build(Container $container) {
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдордиреЗ рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:
$container['StorageInterface'] = 'FileStorage';
рдЖрдк рдФрд░ рднреА рдЕрдзрд┐рдХ рдХрдЯреМрддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$container[] = 'FileStorage';
рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдлрд╛рдЗрд▓рд╕реНрдЯреЛрд░реНрд╕ рдХреЛ рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд
рдЙрд▓рдЯрд╛ (IoC рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд┐рдореНрдлрдиреА рд░реВрдЯрд┐рдВрдЧ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдореЙрдбреНрдпреВрд▓ рд╡рд┐рд╡рд░рдг $container['request'] = $container['Symfony\Component\HttpFoundation\Request'] = new Factory('Symfony\Component\HttpFoundation\Request', 'createFromGlobals'); $container['Symfony\Component\Config\FileLocator'] = 'Symfony\Component\Config\FileLocator'; $container['Doctrine\Common\Annotations\Reader'] = 'Doctrine\Common\Annotations\AnnotationReader'; $container['Symfony\Component\Routing\Loader\AnnotationClassLoader'] = 'Granula\Router\AnnotatedRouteControllerLoader'; $container['Symfony\Component\Config\Loader\LoaderInterface'] = 'Symfony\Component\Routing\Loader\AnnotationDirectoryLoader'; $container['request.context'] = $container['Symfony\Component\Routing\RequestContext'] = new Service('Symfony\Component\Routing\RequestContext'); $container['router'] = $container['Symfony\Component\Routing\RouterInterface'] = new Factory('Granula\Router\RouterFactory');
рдЕрдм рдЖрдк рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
$object = $container->get('Class');
рдпрд╛ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреА рдорджрдж рд╕реЗ (рдЬрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП):
$user = User::create();
рдлрд┐рд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдлреНрд░рдВрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ:
class App extends Granula\App { public function register() { return array( new MyModule(),
рдФрд░ index.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╡реЗ рдЪрд▓рддреЗ рд╣реИрдВ:
$app = new App(); $app->run();
рдореИрдВрдиреЗ рдПрдХ рдкреВрд░реНрдг MVC рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рддреИрдпрд╛рд░ рдХрд┐рдП рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
composer create-project granula/app www
рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рд╕рд┐рдореНрдлрдиреА рдХреЗ рдШрдЯрдХ
- рдлрд╝реИрд╢рди
- рд╕рд┐рджреНрдзрд╛рдВрдд
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!