рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЫрдареЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдЪрдЯреАрдЯреАрдкреА рдХрд░реНрдиреЗрд▓ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдврд╛рдВрдЪрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╕рдордЧреНрд░ рд╣реИ, рдХреБрдЫ рд╣рдж рддрдХ рдпрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рд╕реНрдерд┐рд░ рд╢реНрд░реЗрдгреА рд╡рд┐рдзрд┐рдпреЛрдВ рд╕рд╣рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдЪрд▓рд┐рдП рдЕрдкрдиреЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:
class LeapYearController { public function indexAction($request) { if (is_leap_year($request->attributes->get('year'))) { return new Response('Yep, this is a leap year!'); } return new Response('Nope, this is not a leap year.'); } }
рддрджрдиреБрд╕рд╛рд░ рд░реВрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:
$routes->add('leap_year', new Routing\Route('/is_leap_year/{year}', array( 'year' => null, '_controller' => array(new LeapYearController(), 'indexAction'), )));
рдпрд╣ рдЪрд░рдг рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИ рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд╡реИрд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред рд╕рдЪ рд╣реИ, рдЖрдк рддреБрд░рдВрдд рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
LeapYearController рдХреНрд▓рд╛рд╕ рд╣рдореЗрд╢рд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдиреБрд░реЛрдзрд┐рдд URL
leap_year рд░реВрдЯ рд╕реЗ рдореЗрд▓ рди рдЦрд╛рддрд╛ рд╣реЛред рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рд╣реИ: рдЕрдм рд╕рднреА рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рдЗрд╕реА рдорд╛рд░реНрдЧ рдХреЗ "рдорд╛рдВрдЧ рдкрд░" рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ,
HttpKernel рдШрдЯрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
{ "require": { "symfony/class-loader": "2.1.*", "symfony/http-foundation": "2.1.*", "symfony/routing": "2.1.*", "symfony/http-kernel": "2.1.*" } }
рдПрдЪрдЯреАрдЯреАрдкреА рдХрд░реНрдиреЗрд▓ рдШрдЯрдХ рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рд╣рдореЗрдВ рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдХрдм рдФрд░ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рддрд░реНрдХ рд╣реИрдВред рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
namespace Symfony\Component\HttpKernel\Controller; interface ControllerResolverInterface { function getController(Request $request); function getArguments(Request $request, $controller); }
GetController () рд╡рд┐рдзрд┐ рдЙрд╕реА рдХрдиреНрд╡реЗрдВрд╢рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЕрдкрдирд╛рдпрд╛ рдерд╛: _controller рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред PHP рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддрд░рд╣,
getController () рдПрдХ рдХреНрд▓рд╛рд╕ рдирд╛рдо рдкреНрд▓рд╕ рджреЛ рдХреЙрд▓реЛрди рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдирд╛рдо рд╕реЗ рдорд┐рд▓рдХрд░ рддрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ - "рд╡рд░реНрдЧ :: рд╡рд┐рдзрд┐":
$routes->add('leap_year', new Routing\Route('/is_leap_year/{year}', array( 'year' => null, '_controller' => 'LeapYearController::indexAction', )));
рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
HttpKernel рд╕реЗ
рдХрдВрдЯреНрд░реЛрд▓рд░ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб
рдмрджрд▓реЗрдВ :
use Symfony\Component\HttpKernel; $resolver = new HttpKernel\Controller\ControllerResolver(); $controller = $resolver->getController($request); $arguments = $resolver->getArguments($request, $controller); $response = call_user_func_array($controller, $arguments);
рдПрдХ рд╕реБрдЦрдж рддрд┐рдкрд╣рд┐рдпрд╛: рдирд┐рдпрдВрддреНрд░рдХ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдЖрдкрдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдпрджрд┐ рдЖрдк _controller рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рджреЗрдЧрд╛ред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рддрд░реНрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
getArguments () рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ PHP
рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рджрд▓реАрд▓реЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред
IndexAction () рдкрджреНрдзрддрд┐ рдХрд╛ рддрд░реНрдХ
рдЕрдиреБрд░реЛрдз рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рд╣реИред
GetArguments () рд╡рд┐рдзрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХ рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддреА рд╣реИ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public function indexAction(Request $request) // won't work public function indexAction($request)
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк
getArguments () рдХреЗ рд▓рд┐рдП
рдЕрдиреБрд░реЛрдз рд╡рд░реНрдЧ рдХреА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рддрд░реНрдХ рдХреЛ рд╕рдВрдЧрдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рдорд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
public function indexAction($year)
рдЖрдк
рдЕрдиреБрд░реЛрдз рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрджреЗрд╢ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ)
public function indexAction(Request $request, $year) public function indexAction($year, Request $request)
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
public function indexAction($year = 2012)
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдмрд╕
$ рд╡рд░реНрд╖ рджреЗрдВ:
class LeapYearController { public function indexAction($year) { if (is_leap_year($year)) { return new Response('Yep, this is a leap year!'); } return new Response('Nope, this is not a leap year.'); } }
рдирд┐рдпрдВрддреНрд░рдХ рд░рд┐рд╡рд╛рд▓реНрд╡рд░ рдирд┐рдпрдВрддреНрд░рдХ рдХреЙрд▓ рдФрд░ рдЙрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИред рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрджреЗрд╢ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реБрдП: рд╡рд░реНрдЧ рдирд┐рдпрдВрддреНрд░рдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд┐рдзрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рддрд░реНрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, ...
рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╣рдорд╛рд░реЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
<?php
рдмрд╕ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪреЗрдВ: рд╣рдорд╛рд░рд╛ рдврд╛рдВрдЪрд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рд▓рдЪреАрд▓рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рднреА
рдХреЛрдб рдХреА 40 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ ред