рд╕рд┐рдореНрдлрдиреА 2.4 рдореЗрдВ рдирдпрд╛: рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирд▓рдВрдЧреЗрдЬ рдХрдВрдкреЛрдиреЗрдВрдЯ

рд╕рд┐рдореНрдлрдиреА 2.4 рдПрдХ рдирдП рдШрдЯрдХ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ - рдПрдХреНрд╕рдкреНрд░реЗрд╢рдирд▓рдВрдЧреЗрдЬ ред рдШрдЯрдХ "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ" рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЬрди рд╣реИред
рдпрд╣ рднрд╛рд╖рд╛ рдЯреНрд╡рд┐рдЧ рдХрд╛ рдЫреАрди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдЯрд╣рдиреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рдЪрд▓рди рджреЛ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

PHP рдХреЛрдб рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рдордп рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ . рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдВрднрд╡ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдорддрд▓рдм рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: foo.bar - рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рд░рдгреА рдХреЛ foo.getBar() рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП foo['bar'] ред
рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИ:
 use Symfony\Component\ExpressionLanguage\ExpressionLanguage; $language = new ExpressionLanguage(); echo $language->evaluate('1 + 1'); // echo 2 echo $language->compile('1 + 2'); // echo "(1 + 2)" 

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рднрд╛рд╖рд╛ рдЯрд╣рдиреА рдХреЗ рд╕рдорд╛рди рд╕рднреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ: рдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрдЯрд░, рддрд╛рд░, рд╕рдВрдЦреНрдпрд╛, рд╕рд░рдгрд┐рдпрд╛рдБ, рд╣реИрд╢, рдмреВрд▓рд┐рдпрди рдЪрд░ ... рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмрд╣реБрдд рд╕реАрдорд┐рдд PHP рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╛рд╣рд░реА рдкреНрд░рднрд╛рд╡ рдЕрд╕рдВрднрд╡ рд╣реИрдВ, рд╕рдВрдХрд▓рди рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред
 $language->evaluate('a.b', array('a' => new stdClass())); $language->compile('a.b', array('a')); 

рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рдЯреНрд╡рд┐рдЧ рдореЗрдВ рдЕрдкрдиреЗ рд╕рдордХрдХреНрд╖реЛрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ register() рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП register() рд╡рд┐рдзрд┐ рджреЗрдЦреЗрдВ)
рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рд╣рдордиреЗ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдореЗрдВ рдШрдЯрдХ рдХреЛ рдПрдореНрдмреЗрдбреЗрдб рдХрд┐рдпрд╛ рд╣реИред


рд╕реЗрд╡рд╛ рдХрдВрдЯреЗрдирд░


рдЖрдк рдХрд╣реАрдВ рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
 $c->register('foo', 'Foo')->addArgument(new Expression('bar.getvalue()')); 

рдХрдВрдЯреЗрдирд░ рдореЗрдВ, рднрд╛рд╡ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреВрд░рдХ рд╣реИрдВ: service() рд╕реЗрд╡рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ parameter рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
 service("bar").getValue(parameter("value")) 

XML рдореЗрдВ:
 <service id="foo" class="Foo"> <argument type="expression">service('bar').getvalue(parameter('value'))</argument> </service> 

PHP рдбрдореНрдкрд░ рдХреЗ рднрд╛рд╡ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИред рдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд PHP рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИ:
 $this->get("bar")->getvalue($this->getParameter("value")) 


рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдирд┐рдпрдо


рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рдирдпрд╛ allow_if рдирд┐рд░реНрджреЗрд╢ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкрд╣реБрдБрдЪ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди allow_if рд╣реИ:
 access_control: - { path: ^/_internal/secure, allow_if: "'127.0.0.1' == request.getClientIp() or has_role('ROLE_ADMIN')" } 

рдпрд╣ рдирд┐рдпрдо /_internal/secure рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рдкреНрд░рд╢рд╛рд╕рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП /_internal/secure рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
request , token рдФрд░ user рд╡реЗ рдЪрд░ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪ рд╣реИ, is_anonymous() , is_authenticated() , is_fully_authenticated() , is_rememberme() , and has_role() рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ рдЬреЛ рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдо рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдлрд╝реИрд╢рди


рдЖрдк expression рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 {% if is_granted(expression('has_role("FOO")')) %} ... {% endif %} 


рдпрджрд┐ рдЖрдк SensioFrameworkExtraBundle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ @ Security рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ
 /** * @Route("/post/{id}") * @Security("has_role('ROLE_ADMIN')") */ public function showAction(Post $post) { } 

рдиреЛрдЯ : @ Security рдПрдиреЛрдЯреЗрд╢рди рдЙрд╕ рдмрдВрдбрд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 3 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рд┐рдореНрдлрдиреА 2.4 рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рдХреИрд╢рд┐рдВрдЧ


SensioFrameworkExtraBundle рдХреЗ рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ , @ рдХреИрд╢ рдПрдиреЛрдЯреЗрд╢рди рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдЬреЛ HTTP рдХреИрд╢рд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп:
 /** * @Route("/post/{id}") * @Cache(smaxage="15") */ public function showAction(Request $request, Post $post) { $response = new Response(); $response->setLastModified($post->getUpdated()); if ($response->isNotModified($request)) { return $response; } // ... } 

рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ ETag рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):
 /** * @Route("/post/{id}") * @Cache(smaxage="15", lastModified="post.getUpdatedAt()") */ public function showAction(Post $post) { // ... } 

рд░реВрдЯрд┐рдВрдЧ (рд░реВрдЯрд┐рдВрдЧ)


рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рд╕рд┐рдореНрдлрдиреА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЪрд░ (рдЬреИрд╕реЗ рдХрд┐ info , method , sheme ) рджреНрд╡рд╛рд░рд╛ рдПрдХ рдорд╛рд░реНрдЧ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХреЛ рдЕрдиреБрд░реЛрдз ( Request рд╡рд╕реНрддреБ) рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рдЗрди рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк condition рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ request рдФрд░ рд░реВрдЯрд┐рдВрдЧ context рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
 hello: path: /hello/{name} condition: "context.getMethod() in ['GET', 'HEAD'] and request.headers.get('User-Agent') =~ '/firefox/i'" 

рдФрд░ рдлрд┐рд░, PHP рд░реВрдЯрд┐рдВрдЧ рдирд┐рдпрдо рдбрдореНрдкрд░ (URL рдорд┐рд▓рд╛рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдИ рдЙрдкрд░рд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ PHP рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВ:
 // hello if (0 === strpos($pathinfo, '/hello') && preg_match('#^/hello/(?P<name>[^/]++)$#s', $pathinfo, $matches) && (in_array($context->getMethod(), array(0 => "GET", 1 => "HEAD")) && preg_match("/firefox/i", $request->headers->get("User-Agent"))) ) { return $this->mergeDefaults(array_replace($matches, array('_route' => 'hello')), array ()); } 

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ URL рдмрдирд╛рддреЗ рд╕рдордп рдЗрди рд╢рд░реНрддреЛрдВ рдХрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдорд╛рдиреНрдпрдХрд░рдг


рдирдИ Expression рд╕реНрдерд┐рддрд┐ рдЖрдкрдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:
 use Symfony\Component\Validator\Constraints as Assert; /** * @Assert\Expression("this.getFoo() == 'fo'", message="Not good!") */ class Obj { public function getFoo() { return 'foo'; } } 

рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, this рд╡рд░реНрддрдорд╛рди рд╕рддреНрдпрд╛рдкрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдмрд┐рдЬрдиреЗрд╕ рд░реВрд▓ рдЗрдВрдЬрди


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднрд╛рд╖рд╛ рд╡реНрдпрд╡рд╕рд╛рдп рдирд┐рдпрдо рдЗрдВрдЬрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рдХреЗ рд╡реЗрдмрдорд╛рд╕реНрдЯрд░ (рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ) рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рд╕рд╛рдЗрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛:
 # Get the special price if user.getGroup() in ['good_customers', 'collaborator'] # Promote article to the homepage when article.commentCount > 100 and article.category not in ["misc"] # Send an alert when product.stock < 15 


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

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

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


All Articles