рдпрд╣ Zend рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд▓реЗрдЦ рдХреЗ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛ рд╣реИ
ред рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ ZendSkeletonApplication рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдФрд░ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред
рддреАрд╕рд░рд╛ рднрд╛рдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЯреНрд╡рд┐рдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ред
рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ Zend рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдЗрди рдЪрд╛рд░ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:
- рдХрдВрдкреЛрдЬрд╝рд░ рдХреЛ рдирдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреЛрдЬрд╝рд░.рдЬреЙрди рдореЗрдВ рдЙрдЪрд┐рдд рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВред
- php рдХрдВрдкреЛрдЬрд╝рд░ .phar рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдХрдореНрдкреЛрдЬрд╝рд░ рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗ рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдСрдЯреЛреЛрд▓реЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреБрди: рдмрдирд╛рддрд╛ рд╣реИ,
- config / application.config.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реВрдЪреА рдореЗрдВ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдВ,
- рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди / рдСрдЯреЛрд▓реЙрдб рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ) рдХреЛ рдЬрдЧрд╣ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдЙрдирдХреЗ рдкреНрд░рд▓реЗрдЦрди рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА Zend Developer Tools рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред
рдбреЗрд╡рд▓рдкрд░ рдЙрдкрдХрд░рдг Zend
Zend Developer Tools рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЯреВрд▓рдмрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рдкреГрд╖реНрда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИ: рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реВрдЪреА, рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА, Entity рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ, рд▓реЛрдб рд╕рд╛рдЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдЖрджрд┐ред рдмреЗрд╢рдХ, рдЯреВрд▓рдмрд╛рд░ рдХреЛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
github.com/zendframework/ZendDeveloperTools ред
рдЯреВрд▓рдмрд╛рд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
"zendframework/zend-developer-tools": "dev-master",
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдореЗрдВ
рдХрдВрдкреЛрдЬрд╝рд░.рдЬрд╕рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдореЗрдВ
php рдХрдВрдкреЛрдЬрд╝рд░.рдлрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБред
рдлрд┐рд░,
config / application.config.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдореЗрдВ ZendDeveloperTools рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВ:
'modules' => array( 'Application', 'ZendDeveloperTools', ),
рдЕрдм рдпрд╣ рдлрд╝рд╛рдЗрд▓
рд╡рд┐рдХреНрд░реЗрддрд╛ / zendframework / zend-developer-tools / config / zenddevelopertools.local.php.dist рдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ
config / autoload рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
zenddevelopertools.local.php (рд▓реЛрдХрд▓.рдлреИрдк рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛)ред рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛)ред
рд╕рдм рдХреБрдЫ, рдЕрдм, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рдиреАрдЪреЗ рдкреГрд╖реНрда рдкреАрдврд╝реА, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдиреНрдпрд╛рд╕, рдЖрджрд┐ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЯреВрд▓рдмрд╛рд░ рд╕рд╛рдЗрдЯ рдкрд░ рд╕рднреА рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрд╡реЗрджрди рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг
рдЬрд╝реЗрдВрдбрдбреЗрд╡реЗрд▓рдкреНрдЯрд░рдЯреВрд▓ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ
рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ:
github.com/romka/zend-blog-example/tree/zenddevelopertoolsрд╕рд┐рджреНрдзрд╛рдВрдд
Doctrine рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ DoctrineModule рдФрд░ DoctrineORMModule рдореЙрдбреНрдпреВрд▓ (
https://github.com/doctrine/DoctrineModule рдФрд░
github.com/doctrine/DoctrineModule ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдХрдВрдкреЛрдЬрд╝рд░.рдЬреЙрд╕рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
"doctrine/common": ">=2.1", "doctrine/doctrine-orm-module": "0.7.*"
рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ
php рдХрдВрдкреЛрдЬрд╝рд░.рдкрд╣рд░ рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
DoctrineModule рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ
рдХрдВрдкреЛрдЬрд░ .json рдореЗрдВ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ DoctrineORMModule рдореЙрдбреНрдпреВрд▓ рд╕реНрддрд░ рдкрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИред
рдЕрдм рдЖрдкрдХреЛ
doctrine.local.php рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде
config / autoload рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ Doctrine рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
<?php return array( 'doctrine' => array( 'connection' => array( 'orm_default' => array( 'driverClass' =>'Doctrine\DBAL\Driver\PDOMySql\Driver', 'params' => array( 'host' => 'localhost', 'port' => '3306', 'user' => 'username', 'password' => 'pass', 'dbname' => 'dbname', ) ) ), ), );
рдЕрдм рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХрд╛ рдкреГрд╖реНрда рдкреБрдирдГ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Zend devloper рдЯреВрд▓рдмрд╛рд░ рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рдиреАрдЪреЗ рд╣рдо рджреЛ рдирдП рдмреНрд▓реЙрдХ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдкреВрд░реНрдг рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдорд╛рди рд╢реВрдиреНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрднреА рддрдХ рдореИрдкрд┐рдВрдЧ рдирд╣реАрдВ рдХреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреНрд▓реЙрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдм рдирдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред
MyBlog рдореЙрдбреНрдпреВрд▓
рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдирд┐рдореНрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:
MyBlog/ config/ module.config.php src/ MyBlog/ Entity/ BlogPost.php Module.php
Module.php рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдЗрд╕
рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
<?php namespace MyBlog; class Module { public function getAutoloaderConfig() { return array( 'Zend\Loader\StandardAutoloader' => array( 'namespaces' => array( __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, ), ), ); } public function getConfig() { return include __DIR__ . '/config/module.config.php'; } }
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╣рдо рдЙрд╕ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдореВрд▓ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдФрд░ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣реИред
рдЕрднреА рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╣рдо рдирдП рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред
Src / MyBlog / Entity / BlogPost.php рдлрд╝рд╛рдЗрд▓ рдбреЙрдХреНрдЯреНрд░рд┐рди рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди (рдореИрдкрд┐рдВрдЧ) рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
BlogPost.php
рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:
- рд╣реИрдбрд░
- рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рдмреЙрдбреА
- рд▓реЗрдЦрдХ рдЖрдИрдбреА (рдЕрдирд╛рдо рдХреЗ рд▓рд┐рдП 0),
- рд╕реНрдерд┐рддрд┐ (рдкреНрд░рдХрд╛рд╢рд┐рдд / рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ)
- рдкреНрд░рдХрд╛рд╢рди рдХреА рддрд╛рд░реАрдЦред
рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЯреИрдЧреНрд╕, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдЕрдиреНрдп рдмреНрд▓реЙрдЧ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдПрдХ BlogPost рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░рд╛ рд╕рдВрд╕реНрдХрд░рдг Github (
https://github.com/romka/zend-blog-example/blob/master/module/MyBlog/src/MyBlog/Entity/BlogPost.php ) рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рднрд╛рдЧ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
<?php namespace MyBlog\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; class BlogPost { protected $id; protected $title; public function getId() { return $this->id; } public function setId($id) { $this->id = (int) $id; } public function getTitle() { return $this->title; } public function setTitle($title) { $this->title = $title; } }
рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдмрди рдЬрд╛рдПрдЧрд╛, рдлрд╝реАрд▓реНрдб рдкреИрд░рд╛рдореАрдЯрд░ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдбреЙрдХреНрдЯреНрд░рд┐рди рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреИрд╕реЗ:
php.net/manual/en/reflectionclass.getdoccomment.php , рдХреНрд▓рд╛рд╕
Doctrine \ Common \ AnnotationsReader рд╡рд┐рдзрд┐ getClassAnnotationsред ))ред
рдЕрдм рдореЙрдбреНрдпреВрд▓
config / рдореЙрдбреНрдпреВрд▓.
config.php рдХреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдк рд╣рдорд╛рд░реА рдирдИ рдЗрдХрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
return array( 'doctrine' => array( 'driver' => array( 'myblog_entity' => array( 'class' =>'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 'paths' => array(__DIR__ . '/../src/MyBlog/Entity') ), 'orm_default' => array( 'drivers' => array( 'MyBlog\Entity' => 'myblog_entity', ) ) ) ), );
рдФрд░ рдпрд╣
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдореЗрдВ MyBlog рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ редconfig.phpред
рд╣рдордиреЗ BlogPost рдЗрдХрд╛рдИ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдкреВрд░реА рдХрд░ рд▓реА рд╣реИ рдФрд░ рдЕрдм рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореВрд▓ рдореЗрдВ, рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
./vendor/bin/doctrine-module orm:info
рдФрд░ рдкрд░рд┐рдгрд╛рдо рдлреЙрд░реНрдо рдХрд╛ рд╕рдВрджреЗрд╢ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
Found 1 mapped entities: [OK] MyBlog\Entity\BlogPost
рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдбреЙрдХреНрдЯреНрд░рд┐рди рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧрдкреЛрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рджреЗрдЦрддреА рд╣реИ, рд╣рдо рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗ:
./vendor/bin/doctrine-module orm:validate-schema
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлреЙрд░реНрдо рдХреА рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдЖрдиреА рдЪрд╛рд╣рд┐рдП:
[Mapping] OK - The mapping files are correct. [Database] FAIL - The database schema is not in sync with the current mapping file.
рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрднреА рднреА рдЦрд╛рд▓реА рд╣реИ рдФрд░ рдЕрдм рд╣рдо рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВрдЧреЗ:
./vendor/bin/doctrine-module orm:schema-tool:update
рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реЛрдЧрд╛:
Updating database schema... Database schema updated successfully! "1" queries were executed
рдФрд░ рдЕрдм рдХрдорд╛рдВрдб рдХреЙрд▓:
./vendor/bin/doctrine-module orm:validate-schema
рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛:
[Mapping] OK - The mapping files are correct. [Database] OK - The database schema is in sync with the mapping files.
рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХреЗ рдкреЗрдЬ рдХреЛ рдЕрднреА рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреЗрдЬ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЯреВрд▓рдмрд╛рд░ рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдбреЙрдХреНрдЯреНрд░рд┐рди рдПрдХ рдореИрдкрд┐рдВрдЧ рдорд╛рдпрдмреНрд▓реЙрдЧ \ рдПрдВрдЯрд┐рдЯреА \ рдмреНрд▓реЙрдЧрдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ
рдмреНрд▓реЙрдЧ рдмреНрд▓реЙрдЧрдкреЛрд╕реНрдЯ_рдПрдВрдЯрд┐рдЯреА :
github.com/romka/zend-blog-example/tree/blogpost-entity рдХреЗ рд╕рд╛рде рдЬреАрдердм рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рд░ рд╣реИ, рддреЛ рд╣рдо рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдЬреЛрдбрд╝рдирд╛
рдореЙрдбреНрдпреВрд▓ рдХреЗ src / MyBlog рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдмрдирд╛рдПрдБ:
Controller/ BlogController.php Form/ BlogPostForm.php BlogPostInputFilter.php
рдЗрд╕рдХреЗ рдмрд╛рдж, рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ, рдорд╛рд░реНрдЧреЛрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдкрде рдХреА рд╕реВрдЪреА рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:
'controllers' => array( 'invokables' => array( 'MyBlog\Controller\BlogPost' => 'MyBlog\Controller\BlogController', ), ), 'router' => array( 'routes' => array( 'blog' => array( 'type' => 'segment', 'options' => array( 'route' => '/blog[/][:action][/:id]', 'constraints' => array( 'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 'id' => '[0-9]+', ), 'defaults' => array( 'controller' => 'MyBlog\Controller\BlogPost', 'action' => 'index', ), ), ), ), ), 'view_manager' => array( 'template_path_stack' => array( __DIR__ . '/../view', ), ),
рдЙрдкрд░реЛрдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдХреЗ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдлреЙрд░реНрдо
рдмреНрд▓реЙрдЧ / [рдПрдХреНрд╢рди] / [рдЖрдИрдбреА] рдХреЗ рдпреВрдЖрд░рдПрд▓ рд╣реЛрдВрдЧреЗ (рд╕реНрдХреНрд╡рд╛рдпрд░ рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдкрде рддрддреНрд╡ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ)ред
BlogPostForm.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдлрд╝реЙрд░реНрдо рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЖрдЗрдП рдЗрд╕ рдлрд╝реЙрд░реНрдо рдХреЛ рдмрдирд╛рдПрдБред
BlogPostForm.php
рд╕рд░рд▓рддрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдлрд╝реЙрд░реНрдо рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдпрд╣ рдлрд╝реЙрд░реНрдо рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдВ рдЗрд╕рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
github.com/romka/zend-blog-example/blob/master/module/MyBlog/MyBlog/MyBlog/Form/ BlogPostForm.php ):
class BlogPostForm extends Form { public function __construct($name = null) { parent::__construct('blogpost'); $this->setAttribute('method', 'post'); $this->add(array( 'name' => 'id', 'type' => 'Hidden', )); $this->add(array( 'name' => 'title', 'type' => 'Text', 'options' => array( 'label' => 'Title', ), 'options' => array( 'min' => 3, 'max' => 25 ), )); $this->add(array( 'name' => 'text', 'type' => 'Textarea', 'options' => array( 'label' => 'Text', ), )); $this->add(array( 'name' => 'state', 'type' => 'Checkbox', )); $this->add(array( 'name' => 'submit', 'type' => 'Submit', 'attributes' => array( 'value' => 'Save', 'id' => 'submitbutton', ), )); } }
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдХреЛрдб рдЖрд╡рд╢реНрдпрдХ рдлрд╝реЙрд░реНрдо рдлрд╝реАрд▓реНрдб рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рди рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЛ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ) рдФрд░ рди рд╣реА рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ (рдЬреЛ рдЧрд▓рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдВрдЧреЗ)ред рд╣рдо рдЙрдирд╕реЗ рдмрд╛рдж рдореЗрдВ рдкреВрдЫреЗрдВрдЧреЗ, рдФрд░ рдЕрдм рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред
BlogController.php
рдЖрдк рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (
https://github.com/romka/zend-blog-example/blob/master/module/MyBlog/src/MyBlog/Controller/Blogontontontroller.php ) рдореЗрдВ рдкреВрд░рд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдиреАрдЪреЗ рдореБрдЦреНрдп рднрд╛рдЧ рд╣реИ:
class BlogController extends AbstractActionController { public function indexAction() { return new ViewModel(); } public function addAction() { $form = new \MyBlog\Form\BlogPostForm(); $form->get('submit')->setValue('Add'); $request = $this->getRequest(); if ($request->isPost()) { $form->setData($request->getPost()); if ($form->isValid()) { $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $blogpost = new \MyBlog\Entity\BlogPost(); $blogpost->exchangeArray($form->getData()); $blogpost->setCreated(time()); $blogpost->setUserId(0); $objectManager->persist($blogpost); $objectManager->flush();
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг AddAction рдПрдХреНрд╢рди рдХреЛрдб рд╣реИ (nameAction () рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдмрдирд╛рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдлреЙрд░реНрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рд╕рдмрдорд┐рдЯ рдмрдЯрди рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрдЯрди рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреЗрдХреНрд╕реНрдЯ рд░рдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ):
$form = new \MyBlog\Form\BlogPostForm(); $form->get('submit')->setValue('Add');
рдлрд┐рд░, рдпрджрд┐ рдлреЙрд░реНрдо рдиреЗ рд╕рддреНрдпрд╛рдкрди рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдФрд░ рд╕рддреНрдпрд╛рдкрди рдЕрдм рд╡реИрд╕реЗ рднреА рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ), рд╣рдо \ MyBlog \ Entity \ BlogPost () рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╣реИ, рдФрд░ рдмрдирд╛рдП рдЧрдП рдХреЛ рднрд░реЗрдВред рдбреЗрдЯрд╛ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ:
$blogpost->exchangeArray($form->getData()); $blogpost->setCreated(time()); $blogpost->setUserId(0); $objectManager->persist($blogpost); $objectManager->flush();
рдкреНрд░рдкрддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рджрд╛рдпреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг
github.com/romka/zend-blog-example/blob/blogpost_form_1/module/MyBlog/view/my/blog/blog/add.phtml рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЕрдм рдПрдХ рдЦрд╛рд▓реА рдлреЙрд░реНрдо рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рдПрдЧрд╛:
An exception occurred while executing 'INSERT INTO blogposts (title, text, userId, created, state) VALUES (?, ?, ?, ?, ?)' with params [null, null, 0, 1377086855, null]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'title' cannot be null
рдпрд╣ рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдЬреЛ рдЕрд╢рдХреНрдд = "рд╕рддреНрдп" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ - рдпрд╣ рд░рд╛рдЬреНрдп рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдФрд░ рд╢реЗрд╖ рд╕рднреА рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╕реНрддрд░ рдкрд░, рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ) рд╕реЗ рдкрд╣рд▓реЗ рднреА рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо рдореЗрдВ рдЗрдирдкреБрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдЬреЛрдбрд╝ рджреЗрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛред
рдкреНрд░рдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди
рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП
BlogPostInputFilter.php рдлрд╝рд╛рдЗрд▓ рдореЗрдВ,
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб (Github рдкрд░ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг:
github.com/romka/zend-blog-example/blob/master/module/MyBlog/src/MyBlog/Form/BlogPostInputFilter.php )
рдбрд╛рд▓реЗрдВрдЧреЗ :
class BlogPostInputFilter extends InputFilter { public function __construct() { $this->add(array( 'name' => 'title', 'required' => true, 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 3, 'max' => 100, ), ), ), 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), )); $this->add(array( 'name' => 'text', 'required' => true, 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'min' => 50, ), ), ), 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), )); $this->add(array( 'name' => 'state', 'required' => false, )); } }
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЕрд░реНрде рд╕рд╣рдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд╢реАрд░реНрд╖рдХ рдФрд░ рдкрд╛рда рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрдирдкреБрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рда рд╕реЗ рд╕рднреА html рдЯреИрдЧ (рд╕реНрдЯреНрд░рд┐рдкрдЯреИрдЧ) рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ (рд╕реНрдЯреНрд░рд┐рдВрдЧрдЯреНрд░рд┐рдо) рдкрд░ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рдЯреНрд░рд┐рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдиреНрдпреВрдирддрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реИрдзрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрддрдо рдлрд╝реАрд▓реНрдб рд▓рдВрдмрд╛рдИ (StringLength)ред
рдпрд╣ рдлрд╛рд░реНрдо рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдирдП рдлрд┐рд▓реНрдЯрд░ рдХреЛ рдлреЙрд░реНрдо рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ:
$this->setInputFilter(new \MyBlog\Form\BlogPostInputFilter());
рдпрджрд┐ рдЧрд▓рдд рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЕрдм рдлреЙрд░реНрдо рд╕рддреНрдпрд╛рдкрди рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдкреНрд▓рдЧрдЗрдиреНрд╕ рджреЗрдЦреЗрдВ
рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рд╣реЗрдЬрдиреЗ (рдпрд╛ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рдиреЗ) рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ / рдмреНрд▓реЙрдЧ рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╣реЛрдЧреАред рдореИрдВ рди рдХреЗрд╡рд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдмрд▓реНрдХрд┐ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рдХреА рдЧрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЖрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реЗ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
$this->flashMessenger()->addMessage($message); $this->flashMessenger()->addErrorMessage($message);
рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдпрд╛ phtml рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$this->flashMessenger()->getMessages(); $this->flashMessenger()->getErrorMessages();
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдФрд░ рдЯреНрд╡рд┐рдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯреНрд╕ рдореЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PHP рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рджреГрд╢реНрдп-рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреА src \ MyBlog рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд┐рдореНрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВ:
View\ Helper\ ShowMessages.php
ShowMessages.php рдХреА рд╕рд╛рдордЧреНрд░реА рдпрд╣рд╛рдБ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
github.com/romka/zend-blog-example/blob/master/module/MyBlog/src/MyBlog/View/Helper-ShowMessages.php , рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдПрдХ рд╕реВрдЪреА рдорд┐рд▓ рд░рд╣реА рд╣реИред рд╕рдВрджреЗрд╢, рдкреНрд░рд╛рд░реВрдк рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрдд HTML-code рд▓реМрдЯрд╛рдПрдВред
рдпрд╣ рддреАрди рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИ:
- рд░рдЬрд┐рд╕реНрдЯрд░ рджреЗрдЦреЗрдВ рдкреНрд▓рдЧрдЗрди,
- рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрдбрд╝реЗрдВ,
- рдФрд░ рдлреЙрд░реНрдо рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓рддрд╛ / рд╡рд┐рдлрд▓рддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд▓рдЧрдЗрди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, view_helper => invokables рд▓рд╛рдЗрди рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдирд┐рдореНрди рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ:
'view_helpers' => array( 'invokables' => array( 'showMessages' => 'MyBlog\View\Helper\ShowMessages', ), ),
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рдЬреЛрдбрд╝реЗрдВ:
print $this->showMessages();
рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:
$message = 'Blogpost succesfully saved!'; $this->flashMessenger()->addMessage($message);
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред
рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЯреИрдЧ
blogpost_form_1 :
github.com/romka/zend-blog-example/tree/blogpost_form_1 рдХреЗ рд╕рд╛рде рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд░реНрддрдорд╛рди рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕:
- рдбреЙрдХреНрдЯреНрд░рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ,
- рдирд┐рдпрдВрддреНрд░рдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдХреА рд╕реЗрд╡рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ,
- рдЗрдирдкреБрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЙрд░реНрдо,
- рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХрд╛ рдХрд╕реНрдЯрдо рд╡реНрдпреВ рдкреНрд▓рдЧрдЗрдиред
рдЕрдм рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рдкреЗрдЬ, рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рдФрд░ рдкреЛрд╕реНрдЯ рдлреЙрд░реНрдо рдХреЛ рдПрдбрд┐рдЯ / рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВред
рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкреЗрдЬ
BlogpostController рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рджреГрд╢реНрдп рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ:
public function viewAction() { $id = (int) $this->params()->fromRoute('id', 0); if (!$id) { $this->flashMessenger()->addErrorMessage('Blogpost id doesn\'t set'); return $this->redirect()->toRoute('blog'); } $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $post = $objectManager ->getRepository('\MyBlog\Entity\BlogPost') ->findOneBy(array('id' => $id)); if (!$post) { $this->flashMessenger()->addErrorMessage(sprintf('Blogpost with id %s doesn\'t exists', $id)); return $this->redirect()->toRoute('blog'); } $view = new ViewModel(array( 'post' => $post->getArrayCopy(), )); return $view; }
рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдмреНрд▓реЙрдЧ / рджреГрд╢реНрдп / рдЖрдИрдбреА рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдЖрдИрдбреА URL рдореЗрдВ рд╕реЗрдЯ рд╣реИ, рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдИрдбреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рддреЛ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреЛрд╕реНрдЯ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рджреГрд╢реНрдп / my-blog / рдмреНрд▓реЙрдЧ рдореЙрдбреНрдпреВрд▓ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ view.phtml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<?php print $this->showMessages(); print '<h1>' . $post['title'] . '</h1>'; print '<div>' . $post['text'] . '</div>';
рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА
рд╣рдорд╛рд░реЗ рдЗрдВрдбреЗрдХреНрд╕рдПрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рджреЗрдЦреЗрдВ:
public function indexAction() { $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $posts = $objectManager ->getRepository('\MyBlog\Entity\BlogPost') ->findBy(array('state' => 1), array('created' => 'DESC')); $view = new ViewModel(array( 'posts' => $posts, )); return $view; }
рдпрд╣рд╛рдВ рд╣рдо рд╕рднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ (рд░рд╛рдЬреНрдп == 1) рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдХрд╛рд╢рди рддрд┐рдерд┐ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ
index.phtml github.com/romka/zend-blog-example/blob/blogpost_form_2/module/MyBlog/view/my-blog рдкрд░ рд╕рдмрдорд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ
/blog/index.phtml рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рд╢реАрд░реНрд╖рдХ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЫреЛрдЯрд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░
рдКрдкрд░, рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╕рдордп, рдореИрдВ userId рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдпрд╛, рдЬреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд▓реЗрдЦрдХ рдХреА рдЖрдИрдбреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЕрднреА рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдХреЛрдИ рдкрдВрдЬреАрдХрд░рдг / рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдлрд╝реАрд▓реНрдб рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рд╕реЗ рднрд░ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рдХрд╛рдо рдЖрдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореИрдВрдиреЗ userId рдлрд╝реАрд▓реНрдб рдХреЛ рдЫрд┐рдкреЗ рд╣реБрдП рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдлрд╝реЙрд░реНрдо рдореЗрдВ рдПрдХ Csrf рдЯреЛрдХрди (рд╕реБрд░рдХреНрд╖рд╛ рдХреНрд╖реЗрддреНрд░) рдЬреЛрдбрд╝рд╛, рдЬреЛ рдирдХрд▓реА рд╕реЗ рдлрд╝реЙрд░реНрдо рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдЯреЛрдХрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рддреНрд░ рдФрд░ рдирдордХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирддрд╛ рд╣реИ рдФрд░ 300 рд╕реЗрдХрдВрдб (
Zend \ Form \ Element \ Csrf.php ) рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ (рдФрд░ рдЕрдЪреНрдЫрд╛
рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ рдХрдо рд╕реЗ рдХрдо рдЖрдЧрдВрддреБрдХ рдХреЗ рдЖрдИрдкреА рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред
рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХрд╛ рд╕рдВрдкрд╛рджрди
рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореМрдЬреВрджрд╛ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рдЖрдкрдХреЛ editAction () рдПрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬреЛ рдлреЙрд░реНрдо рдмрдирд╛рдПрдЧрд╛, рдЗрд╕реЗ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рд╕реЗ рднрд░реЗрдЧрд╛ рдФрд░ рдпреВрдЬрд╝рд░ рдХреЛ рджреЗрдЧрд╛ред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ addAction (), рдФрд░ рд╡реНрдпреВрдЕрдХреНрд╢рди (), рдбреЗрдЯрд╛
github.com/romka/zend-blog-example/blob/blogpun_form_2/module/MyBlog/syy/MyBlog/Controller/ontroll_ontroller рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИред
.php # L95рдпрд╣рд╛рдБ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:
if ($form->isValid()) { $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $data = $form->getData(); $id = $data['id']; try { $blogpost = $objectManager->find('\MyBlog\Entity\BlogPost', $id); } catch (\Exception $ex) { return $this->redirect()->toRoute('blog', array( 'action' => 'index' )); } $blogpost->exchangeArray($form->getData()); $objectManager->persist($blogpost); $objectManager->flush(); $message = 'Blogpost succesfully saved!'; $this->flashMessenger()->addMessage($message);
рдпрд╣рд╛рдВ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрд╕ рдЖрдИрдбреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ:
$blogpost->exchangeArray($form->getData());
рдФрд░ рдЕрджреНрдпрддрди рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд░рдЦреЗрдВ:
$objectManager->persist($blogpost); $objectManager->flush();
рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╣рдЯрд╛рдирд╛
рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ, рдпрд╣ рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреИрд╕реЗ "рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?" рдФрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "рд╣рд╛рдБ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдВред
рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдХреЛрдб Github рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
github.com/romka/zend-blog-example/blob/blogpost_form_2/module/MyBlog/src/MrcBlog/Controller/BlogController.php#L161 ред
рдЯреИрдЧ рдЯреИрдЧ
blogpost_form_2 (https://github.com/romka/zend-blog-example/tree/blogpost_form_2) рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЗрд╕ рдкрд░ рдореИрдВ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рддреАрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд╡рд┐рдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЛ рддреЗрдЬ рдХрд░реЗрдВрдЧреЗред