Symfony2 рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдЧрд╛рдЗрдб

рдпрд╣ рдЖрд▓реЗрдЦ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд░рд▓ рдмреНрд▓реЙрдЧ рд╕рд╛рдЗрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рднреА рд╕рдВрднрд╡ рд╕рд┐рдореНрдлрдиреА рдШрдЯрдХреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдирд┐рдпрдВрддреНрд░рдХ, рд╕рд┐рджреНрдзрд╛рдВрдд рдкреНрд░рддрд┐рдХреГрддрд┐рдпрд╛рдВ, рд░реВрдкред

рд▓реЗрдЦ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрдЯ рдкрд░ рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЛ рддрдХ рдХрдо рдХрд░реЗрдВ:

рдЖрд╡реЗрджрди рдХреА рдЕрдВрддрд┐рдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


рдЪрд░рдг 1. рдПрдХ рдордирдорд╛рдиреА рд╕реЗрд╡рд╛ рдмрдирд╛рдирд╛


рд╕рд┐рдореНрдлрдиреА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ DI рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣рдм рдкрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛, рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рднреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рддреБрд░рдВрдд рдЕрдкрдиреА рд╕реЗрд╡рд╛рдПрдВ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рддреАрди рддрд░реАрдХреЗ рд╣реИрдВ: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ (YAML, XML, PHP) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдВрдбрд▓ рдХреЛрдб рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ( JMSDiExtraBundle рдмрдВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреЛ рдХрд┐ рд╕рд┐рдореНрдлрдиреА рдкрд░ рдорд╛рдирдХ рд╣реИ)ред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред рд╣рдо рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдЗрдП рдПрдХ рдРрд╕реЗ рд╡рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдореИрдиреЗрдЬрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирдИ рдкреЛрд╕реНрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрдВ:
/src/AppBundle/Manager/PostManager.php
<?php namespace AppBundle\Manager; use JMS\DiExtraBundle\Annotation as DI; use AppBundle\Entity\Post; use AppBundle\Entity\User; /** * @DI\Service("app.manager.post", public=false) */ class PostManager { /** * @DI\Inject("doctrine.orm.entity_manager") * @var \Doctrine\ORM\EntityManager */ public $em; public function addPost(Post $post, User $user) { $post->setAuthor($user); $this->em->persist($post); $user->setLastPost($post); $user->increasePostsCount(); $this->em->flush(); } } 


@DI \ _ рд╕реЗрд╡рд╛ - рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИред рдПрдиреЛрдЯреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрд╡рд╛ рдХрд╛ рдирд╛рдо (app.manager.post) рдФрд░ рдЙрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред
public = false - рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рдХреЛ рд╕реАрдзреЗ DIC рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ($ рдХрдВрдЯреЗрдирд░-> get ('app.manager.post') рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА)ред рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ (рдЖрдЧреЗ, рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛)ред
@DI \ Inject - рдЙрди рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд, рдЬрд┐рд╕ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ рд╕рд╛рде рд╣реА рд╕рдВрднрд╡ рд╣реИред рдирд┐рдЬреА / рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдЪрд░ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @DI \ InjectParams рдпрд╛ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ app.manager.post рд╕реЗрд╡рд╛ рдмрдирд╛рдИ рд╣реИ, рдЬреЛ doctrine.orm.entity_manager рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ :

рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдкреНрд░рджрд░реНрд╢рди JMSDebuggingBundle рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЪрд░рдг 2. рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рд┐рдореНрдлрдиреА рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗрд╡рд╛ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдПрдХ рдиреЛрдЯ рд╣реИред рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП PostManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ PostController рдмрдирд╛рдПрдВ:
/src/AppBundle/Controller/PostController.php
 <?php namespace AppBundle\Controller; use JMS\DiExtraBundle\Annotation as DI; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use JMS\SecurityExtraBundle\Annotation\Secure; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use AppBundle\Entity\Post; use AppBundle\Form\PostType; /** * @DI\Service("app.controller.post", scope="request") * @Route(service="app.controller.post") */ class PostController extends Controller { /** * @DI\Inject("service_container") */ public $container; /** * @DI\Inject("app.manager.post") * @var \AppBundle\Manager\PostManager */ public $postManager; /** * @Route("/add", name="post_add") * @Template * @Secure(roles="ROLE_USER") */ public function addAction() { $post = new Post(); $form = $this->createForm(new PostType(), $post); if ($this->getRequest()->getMethod() == 'POST') { $form->bind($this->getRequest()); if ($form->isValid()) { $this->postManager->addPost($post, $this->getUser()); return $this->redirect($this->generateUrl('post_list')); } } return array( 'form' => $form->createView() ); } } 


рдЧреБрдВрдЬрд╛рдЗрд╢ = "рдЕрдиреБрд░реЛрдз" - рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ
@Rute (рд╕реЗрд╡рд╛ = "app.controller.post") - рд░реВрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдЧреНрд░реЗрд╖рдг рдирд┐рдпрдореЛрдВ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди 'AppBundle: Post: add' рд╕реЗ 'app.controller.post:addAction' рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред
@DI \ Inject ("service_container") рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЗрд░реЗрдВрдЯ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреНрд▓рд╛рд╕ Symfony \ рдмрдВрдбрд▓ \ FrameworkBundle \ рдирд┐рдпрдВрддреНрд░рдХ \ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреАрдЖрдИрд╕реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ service_container рдФрд░ app.manager.post рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрд╡рд╛ app.controller.post рдмрдирд╛рдпрд╛:

Service_container рддрдХ рд╕реЗрд╡рд╛ рдкрд╣реБрдВрдЪ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╣реИ ($ рдЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ-> рдХрдВрдЯреЗрдирд░-> рдорд┐рд▓рддрд╛ рд╣реИ ('...'))ред рдЗрд╕рд╕реЗ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ = рдЧрд▓рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ:


рд╕реНрдЯреЗрдк 3. рдПрдХ рдлреЙрд░реНрдо рдмрдирд╛рдПрдВ


рдпрд╣ рдХрджрдо рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд▓реНрдХрд┐ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЬреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдВрдЪрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдмрдирд╛рдП рдЧрдП рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рд╣рдордиреЗ рдкреЛрд╕реНрдЯ рдЯрд╛рдЗрдк рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
/src/AppBundle/Form/PostType.php
 <?php namespace AppBundle\Form; use JMS\DiExtraBundle\Annotation as DI; /** * @DI\Service("app.form.post", public=false) */ class PostType extends AbstractType { /* ... */ } 


рд╣рдо рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
/src/AppBundle/Controller/PostController.php
 /* ... */ class PostController extends Controller { /** * @DI\Inject("app.form.post") * @var \AppBundle\Form\PostType */ public $postType; public function addAction() { $post = new Post(); $form = $this->createForm($this->postType, $post); /* ... */ } } 


рдЕрдм рд╣рдо рдлреЙрд░реНрдо рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


рдЪрд░рдг 4. рдПрдХ рднрдВрдбрд╛рд░ рдмрдирд╛рдирд╛


рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛: рдХрд╛рд░рдЦрд╛рдирд╛ рдирд┐рд░реНрдорд╛рдг


рдбреЙрдХреНрдЯреНрд░рд┐рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд┐рдореНрдлрдиреА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбреЙрдХреНрдЯреНрд░рд┐рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднреА рднреА рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдордп рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдбреЙрдХреНрдЯреНрд░рд┐рди рд╕рдВрд╕реНрдерд╛ рдХреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
/src/AppBundle/Entity/Post.php
 <?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table() * @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository") */ class Post { /* ... */ } 


рдкрджреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ PostRepository рдмрдирд╛рдПрдБ:
/src/AppBundle/Repository/PostRepository.php
 <?php namespace AppBundle\Repository; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Tools\Pagination\Paginator; class PostRepository extends EntityRepository { public function getListPaginator($first, $max) { $qb = $this->createQueryBuilder('p') ->orderBy('p.id', 'DESC') ->setFirstResult($first) ->setMaxResults($max); return new Paginator($qb->getQuery()); } } 


рдПрдкреНрд▓рд┐рдХреЗрд╢рди . repository.post рд╕реЗрд╡рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
/src/AppBundle/Resources/config/services.yml
 services: app.repository.post: class: AppBundle\Repository\PostRepository factory_service: doctrine.orm.entity_manager factory_method: getRepository public: false arguments: [AppBundle\Entity\Post] 


рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ рд╕реВрдЪреА рдкреГрд╖реНрда рдЬреЛрдбрд╝реЗрдВ:
/src/AppBundle/Controller/PostController.php
 /* ... */ class PostController extends Controller { /** * @DI\Inject("app.repository.post") * @var \AppBundle\Repository\PostRepository */ public $postRepository; protected $itemsPerPage = 10; /** * @Route("/list/{page}", requirements={"page"="\d+"}, defaults={"page"=1}, name="post_list") * @Template */ public function listAction($page) { $posts = $this->postRepository->getListPaginator( $first = ($page-1)*$this->itemsPerPage, $max = $this->itemsPerPage ); return array( 'posts' => $posts, 'page' => $page, 'pagesCount' => ceil(count($posts)/$this->itemsPerPage), ); } /* ... */ } 


рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛: рд░реИрдкрд░ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдмрдирд╛рдирд╛


рдпрд╣ рд╡рд┐рдзрд┐ рдПрдбреЗрдкреНрдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдорд╛рдирдХ рдбреЙрдХреНрдЯреНрд░рд┐рди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣рдорд╛рд░реА рдЕрдкрдиреА рд╕реЗрд╡рд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдм рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдбреЙрдХреНрдЯреНрд░рд┐рди рд╕рдВрд╕реНрдерд╛ рдХреА рдлрд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрдВрдбрд┐рдХреЗрд╢рди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ:
src / AppBundle / Entity / Post.php
 <?php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Table() * @ORM\Entity() */ class Post { /* ... */ } 


рд╣рдореЗрдВ рдореВрд▓ рд╡рд░реНрдЧ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ doctrine.orm.entity_manager рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :
/src/AppBundle/Repository/Repository.php
 <?php namespace AppBundle\Repository; use JMS\DiExtraBundle\Annotation as DI; /** * @DI\Service("app.repository", abstract=true) */ class Repository { /** * @DI\Inject("doctrine.orm.entity_manager") * @var \Doctrine\ORM\EntityManager */ public $em; protected $repositoryName; /** @return \Doctrine\ORM\EntityRepository */ protected function getDoctrineRepository() { return $this->em->getRepository($this->repositoryName); } public function find($id) { return $this->getDoctrineRepository()->find($id); } public function findOneBy(array $criteria) { return $this->getDoctrineRepository()->findOneBy($criteria); } public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) { return $this->getDoctrineRepository()->findBy($criteria, $orderBy, $limit, $offset); } public function findAll() { return $this->getDoctrineRepository()->findAll(); } /** @return \Doctrine\ORM\QueryBuilder */ public function createQueryBuilder($alias) { return $this->getDoctrineRepository()->createQueryBuilder($alias); } } 


рд╕реЗрд╡рд╛ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдм рд░реИрдкрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд░реНрдЧ рдореЗрдВ рд╣реА рд╣реЛрдЧреА:
/src/AppBundle/Repository/PostRepository.php
 <?php namespace AppBundle\Repository; use JMS\DiExtraBundle\Annotation as DI; use Doctrine\ORM\Tools\Pagination\Paginator; /** * @DI\Service("app.repository.post", parent="app.repository", public=false) */ class PostRepository extends Repository { protected $repositoryName = 'AppBundle:Post'; public function getListPaginator($first, $max) { $qb = $this->createQueryBuilder('p') ->orderBy('p.id', 'DESC') ->setFirstResult($first) ->setMaxResults($max); return new Paginator($qb->getQuery()); } } 


рдиреЛрдЯ: рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ = "app.repository" рдкреИрд░рд╛рдореАрдЯрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред JMSDiExtraBundle рдореВрд▓ рд╢реНрд░реЗрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ рдФрд░ рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛:
/src/AppBundle/Controller/PostController.php
 /* ... */ class PostController extends Controller { /** * @DI\Inject("app.repository.post") * @var \AppBundle\Repository\PostRepository */ public $postRepository; protected $itemsPerPage = 10; /** * @Route("/list/{page}", requirements={"page"="\d+"}, defaults={"page"=1}, name="post_list") * @Template */ public function listAction($page) { $posts = $this->postRepository->getListPaginator( $first = ($page-1)*$this->itemsPerPage, $max = $this->itemsPerPage ); return array( 'posts' => $posts, 'page' => $page, 'pagesCount' => ceil(count($posts)/$this->itemsPerPage), ); } /* ... */ } 


рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЖрд╡реЗрджрди рдХрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдЧреНрд░рд╛рдл рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд▓реЗрдЧрд╛:

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЪрд░рдг 5. рдЕрдиреБрдХреВрд▓рди


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ, рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЗрд╕рдХреЗ рдЪрд░ рд╣реИрдВ рдФрд░ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реИрдВред рдмрджрд▓реЗ рдореЗрдВ, рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдмрдирд╛рддреЗ рд╕рдордп, рдЙрдирдХреА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдкреНрд░рдпреБрдХреНрддрддрд╛ рдХреЗ рд╕рднреА рддрддреНрд╡ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред App.controller.post рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ addAction рдлрд╝рдВрдХреНрд╢рди app.manager.post рдФрд░ app.form.post рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ listAction app.repository.post рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА рдЪрд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рдЪрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реЛрдВрдЧреЗ: addAction рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ app.repository.post рд╣реИ, listAction, app.manager.post рдФрд░ app.form.post рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдпрд╣ рд╡рд░реНрдЧ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рдЗрд╕рдореЗрдВ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рд╣рд┐рд╕реНрд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХрдо рд╣реИ ред рдПрдХ рд╡рд┐рдзрд┐ рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╡рд┐рдзрд┐ рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдЬреБрдбрд╝рддреА рд╣реИред рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдзрд┐рдХрддрдо рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╣реЛрддреА рд╣реИред рдЕрдзрд┐рдХрддрдо рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ app.controller.post рдХреЛ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:


рдирд┐рд╖реНрдХрд░реНрд╖


рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╢реБрд░реВрдЖрдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдХреЛ рдмрдврд╝рд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗрд╡рд▓ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╣реА рдЙрдЪрд┐рдд рд╣реИред рдЫреЛрдЯреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдЬреИрд╕реЗ рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╕рд╛рдЗрдЯ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд┐рдореНрдлрдиреА (рд╣рд▓реНрдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд╛рд░реНрдп рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдпрд╣рд╛рдБ рдбрд╛рдЙрдирд▓реЛрдб / рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
github.com/cerritus/demoblog

Source: https://habr.com/ru/post/In165237/


All Articles