Php 5.4 рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдХреБрдЫ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред Doctrine2 рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рд▓рдХреНрд╖рдг
Php рдореЗрдВ рд▓рдХреНрд╖рдг рдЧреБрдг рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реНрддрд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЙрдХреНрдЯреНрд░рд┐рди рдХреЗ рд▓рд┐рдП рдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВред
рд▓рдХреНрд╖рдг рдХреНрд╖реИрддрд┐рдЬ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░
рдЕрдХреНрд╕рд░ рд╣рдореЗрдВ
create_at рдФрд░
update_at рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛
рд╣реЛрддреА рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдЦреБрдж рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ: "рдореИрдВ рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реВрдВ?"
рд╕рдордпрдмрджреНрдз рд╡реНрдпрд╡рд╣рд╛рд░
рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреЗрдмрд▓ рдПрдХ рд╕рд░рд▓ рд▓рдХреНрд╖рдг рд╣реИ рдЬрд┐рд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
<?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; class Category { use ORMBehaviors\Timestampable\Timestampable; protected $id; }
рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдВредрдпрд╣ рдХреЛрдб
рдбреЗрдЯрдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рджреЛ рдЧреБрдг рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдФрд░
createAt рдФрд░
рдЕрджреНрдпрддрд┐рдд рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐рдпрд╛рдБ:
<?php $category = new Category; $entityManager->persist($category); $category->getCreatedAt(); $category->getUpdatedAt();
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
getUpdatedAt рдЕрдкрдиреЗ рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ рдХреА рддрд╛рд░реАрдЦ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рд╕реНрдерд╛рдкрдирд╛
рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреЗрдмрд▓ рдФрд░ рдЕрдиреНрдп рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ
рдиреЙрдЯрд▓реИрдмреНрд╕ / рдбреЙрдХреНрдЯреНрд░рд┐рдирдмреЗрд╡рд┐рдПрд░реЛ рдХреЗ рдЧреАрдереВрдм рднрдВрдбрд╛рд░ рдореЗрдВ рдПрдХ рд╕рд╛рде рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк рд╕рдВрдЧреАрддрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ
рдХрдВрдкреЛрдЬрд░.рдЬреЛрди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
{ "require": { "knplabs/doctrine-behaviors": "dev-master", } }
рдлрд┐рд░ рд╕рдВрдЧреАрддрдХрд╛рд░ рдЪрд▓рд╛рдПрдВ:
curl -s http://getcomposer.org/installer | php php composer.phar install
рд╢реНрд░реЛрддрд╛
рдпрд╣ рд╕рдм рдЙрди рд╕рд┐рджреНрдзрд╛рдВрдд рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ рдЬреЛ
рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХреЛ
рдЬрд╛рд░реА рд░рдЦрдиреЗ рдпрд╛
рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк Symfony2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛! рд╕реЗрд╡рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХрд░реЗрдВред
рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╡реНрдпрд╡рд╣рд╛рд░
рдмрд╣реБрдд рдмрд╛рд░, рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдЧреБрдг рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рдордиреЗ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред
рдРрд╕реА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ 2 рдЪрд░рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред
1.
рдЯреНрд░рд╛рдВрд╕рд▓реЗрдЯреЗрдмрд▓ рдЯреНрд░реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
<?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; class Category { use ORMBehaviors\Translatable\Translatable; protected $id; }
2. рдПрдХ рд╢реНрд░реЗрдгреА
рдЕрдиреБрд╡рд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдЬреЛ
рдЕрдиреБрд╡рд╛рдж рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:
<?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; class CategoryTranslation { use ORMBehaviors\Translatable\Translation; protected $name; }
рд╡рд╣ рд╕рдм рд╣реИ!
TranslatableListener рдЕрдкрдиреЗ рдЖрдк рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрдЧреАред рдЖрдк рдирд┐рдпрдорд┐рдд
OneToMany рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рд╕рд╛рде рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
<?php $category = new Category; $category->translate('ru')->setName(''); $category->translate('en')->setName('Shoes'); $em->persist($category); $category->translate('en')->getName();
рдкреЗрдбрд╝
рдкреЗрдбрд╝ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рднреМрддрд┐рдХ рдкрде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рднреА рдиреЛрдбреНрд╕ рдореЗрдВ рд░реВрдЯ рд╕реЗ рдЕрдкрдирд╛ рдкреВрд░реНрдг рдкрде рд╕рдорд╛рд╣рд┐рдд рд╣реИ:
| id | name | path | +-----+------------+------------+ | 1 | fr | /1 | | 2 | villes | /1/2 | | 4 | subNantes | /1/2/3/4 | | 7 | en | /7 | | 8 | villes | /7/8 | | 9 | Nantes | /7/8/9 | | 10 | subNantes | /7/8/9/10 | | 11 | Lorient | /7/8/11 | | 12 | Rouen | /7/8/12 | | 6 | Rouen | /1/2/6 | | 3 | Nantes | /1/2/3 | | 5 | Lorient | /1/2/5 |
рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдЯреНрд░реА \ Node рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
<?php use Doctrine\ORM\Mapping as ORM; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; class Category { use ORMBehaviors\Tree\Node; protected $id; }
рдЗрд╕реА
EntityRepository рдореЗрдВ
рдЯреНрд░реА / рдЯреНрд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
<?php use Doctrine\ORM\EntityRepository; use Knp\DoctrineBehaviors\ORM as ORMBehaviors; class CategoryRepository extends EntityRepository { use ORMBehaviors\Tree\Tree; }
рдЕрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╛рд▓ рд╡рд╕реНрддреБрдУрдВ, рдорд╛рддрд╛-рдкрд┐рддрд╛, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
$root = $em->getRepository('Category')->getTree(); $root->getParentNode(); $root->getChildren(); $root[0][1];
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рд╡рд░реНрдгрд┐рдд рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк
рдЬреАрдЖрдИрдПрдбреАрдПрдордИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреАрдердм рдкрд░ рдЙрдирдХреА рдкреВрд░реА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдиреЛрдЯред рдпрд╣ рд▓реЗрдЦ рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдХ рд▓реЗрдЦ рдХрд╛ рдПрдХ рд░реВрд╕реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ: рд╕рд┐рджреНрдзрд╛рдВрдд ORM рд╡реНрдпрд╡рд╣рд╛рд░, рдпрд╛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ ред рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓реЗрдЦрдХ: рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рди рдХреБрдбреНрд░реАрдпрд╛рд╢реЛрд╡ (@everzet), рдлреНрд▓реЛрд░рд┐рдпрди рдХреНрд▓реЗрди, рд▓реЗрд╕рдЬрд╝реЗрдХ рдкреНрд░рдмрд╛рдХреАред рдЕрдиреБрд╡рд╛рдж: рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдЯреЛрд░реЗрдВрдХреЛ (@torchello)ред