DIY рдорд┐рдиреА рдврд╛рдВрдЪрд╛

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╕рд┐рд▓реЗрдХреНрд╕ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рдХреНрдпрд╛ рд╣реИ? рдореИрдВрдиреЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред

рдРрд╕реЗ рдорд┐рдиреА-рдлреНрд░реЗрдо рдЖрдорддреМрд░ рдкрд░ mod_rewrite рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:
Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  1. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  2. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  3. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  4. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  5. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  6. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >
  7. Copy Source | Copy HTML < IfModule mod_rewrite . c > RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L] </ IfModule >

рд╡реЗ рдХрд┐рд╕реА рднреА рдЕрдиреБрд░реЛрдз рдХреЛ index.php рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╣рдо рдкрддреЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ:
Copy Source | Copy HTML
  1. рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз ( $ рдкрде , $ рдХреЙрд▓рдмреИрдХ )
  2. {
  3. рдЕрдЧрд░ ( $ рдкрде == $ _SERVER [ 'REQUEST_URI' ]) рдХреЙрд▓ call_user_func ( $ рдХреЙрд▓рдмреИрдХ );
  4. }

рдЬрдм рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕ рдкрддреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╛рд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдХрд╣рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ - рдПрдХ рдкрддреЗ рд╕реЗ рдЪрд░ рдирд┐рдХрд╛рд▓рдирд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, example.com/something рдФрд░ example.com/something рдкрддреЛрдВ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдкрддреЗ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдХреЗ рдФрд░ array_filter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Copy Source | Copy HTML
  1. рд╕рдорд╛рд░реЛрд╣ array_filter_callback_no_empty_str ( $ рдореВрд▓реНрдп )
  2. {
  3. $ рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдБ ! = '' ;
  4. }
  5. рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз ( $ рдкрде , $ рдХреЙрд▓рдмреИрдХ )
  6. {
  7. // рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
  8. $ args = array ();
  9. // рдЙрд╕ рдкрддреЗ рдХреЛ рддреЛрдбрд╝реЗрдВ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ (URI) рднрд╛рдЧреЛрдВ рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдерд╛
  10. $ uri = рд╡рд┐рд╕реНрдлреЛрдЯ ( '/' , $ _SERVER [ 'REQUEST_URI' ]);
  11. // рдХреНрд╡реЗрд░реА рдкрде рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ
  12. $ рдкрде = рд╡рд┐рд╕реНрдлреЛрдЯ ( '/' , $ рдкрде );
  13. // рджреЛрдиреЛрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЦрд╛рд▓реА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
  14. $ uri = array_values тАЛтАЛ(array_filter ( $ uri , array_filter_callback_no_empty_str));
  15. $ рдкрде = array_values тАЛтАЛ(array_filter ( $ рдкрде , array_filter_callback_no_empty_str));
  16. // рдпрджрд┐ рдпреВрдЖрд░рдЖрдИ рдФрд░ рдкрде рдореЗрдВ рднрд╛рдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ, рддреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  17. рдЕрдЧрд░ (рдЧрдгрдирд╛ ( $ uri )! = рдЧрд┐рдирддреА ( $ рдкрде ))
  18. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  19. // рд╣рдо рдЕрдиреБрд░реЛрдз рдкрде рдХреЗ рд╕рднреА рднрд╛рдЧреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ
  20. рдХреЗ рд▓рд┐рдП ( $ i = 0 ; $ i <рдЧрд┐рдирддреА ( $ рдкрде ); $ i ++)
  21. {
  22. // рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкрде рдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рдЪрд░ рд╣реИ
  23. // рдЪрд░ рдкрде рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реИрдВ, рдЬреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ
  24. рдЕрдЧрд░ (preg_match ( '| ^ \ {(ред *) \} $ |' , $ рдкрд╛рде [ $ i ], $ рдорд╛рдЪрд┐рд╕ )
  25. {
  26. // рдпрджрд┐ рд╣реИ, рддреЛ рдЗрд╕ рдЪрд░ рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
  27. $ args [ $ рдореИрдЪ [ 1 ]] = $ uri [ $ i ];
  28. }
  29. рдЕрдиреНрдпрдерд╛
  30. {
  31. // рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде URI рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ
  32. // рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  33. рдЕрдЧрд░ ( $ uri [ $ i ]! = $ path [ $ i ])
  34. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  35. }
  36. }
  37. // рд╕рднреА рдЬрд╛рдВрдЪреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рдХреЙрд▓рдмреИрдХ рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз рдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рджреЗ рд░рд╣реЗ рд╣реИрдВ
  38. рд╡рд╛рдкрд╕реА call_user_func_array ( $ рдХреЙрд▓рдмреИрдХ , $ args );
  39. }

рдЕрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
Copy Source | Copy HTML
  1. рд╕рдорд╛рд░реЛрд╣ рдирдорд╕реНрдХрд╛рд░ ( $ рдХреМрди )
  2. {
  3. рдкреНрд░рд┐рдВрдЯ "рд╣реИрд▓реЛ, $ рдХреМрди" ;
  4. }
  5. рдЕрдиреБрд░реЛрдз ( '/ рд╣реИрд▓реЛ / {рдХреМрди}' , рд╣реИрд▓реЛ);

рдЕрдм, Silex рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпреЗ рджрд╛рд╡реЗ (рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрде рдЪрд░ рдХреА рдЬрд╛рдБрдЪ), рдХреЙрд▓ рд╡рд┐рдзрд┐ (GET, POST, PUT, рдЖрджрд┐) рдФрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдореЙрдбрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓реЗ рджреЛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд╕ рдХреБрдЫ рдЬреЛрдбрд╝реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:
Copy Source | Copy HTML
  1. рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз ( $ рдкрджреНрдзрддрд┐ , $ рдкрде , $ рдХреЙрд▓рдмреИрдХ , $ рдореБрдЦрд░ = рд╕рд░рдгреА ())
  2. {
  3. // рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
  4. // рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЧрдИ рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  5. if ( $ рдкрджреНрдзрддрд┐ ! = '' && strtolower ( $ _SERVER [ 'REQUEST_METHOD' ])! = $ рдкрджреНрдзрддрд┐ )
  6. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  7. <...>
  8. // рдЕрдм рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рдкрде рдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рднрд╛рдЧ рдПрдХ рдЪрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВ
  9. рдЕрдЧрд░ (preg_match ( '| ^ \ {(ред *) \} $ |' , $ рдкрд╛рде [$ i], $ рдорд╛рдЪрд┐рд╕ )
  10. {
  11. // рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ,
  12. // рдФрд░ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ, рддреЛ рд╣рдо рдпреВрдЖрд░рдЖрдИ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рднрд╛рдЧ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ
  13. рдЕрдЧрд░ ( isset ( $ asserts [ $ match [ 1 ]])) || preg_match ( $ asserts [ $ match [ 1 ]], $ uri [$ i]))
  14. {
  15. // рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ, рддреЛ рдЗрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрд╕рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
  16. $ args [ $ рдореИрдЪ [ 1 ]] = $ uri [$ i];
  17. }
  18. рдЕрдиреНрдпрдерд╛
  19. {
  20. // рдпрджрд┐ рдорд╛рди рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ
  21. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  22. }
  23. }
  24. <...>
  25. }

рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреВрд╕рд░рд╛ рднреА рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ $ рд╡рд┐рдзрд┐, $ рдкрде, $ рдХреЙрд▓рдмреИрдХ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдореБрдЦрд░ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░рди () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдЙрдкрд░реЛрдХреНрдд рдЪрд░ рдХреЗ рд▓рд┐рдП $ -> рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП:
Copy Source | Copy HTML
  1. рдХрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдз
  2. {
  3. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ $ рд╡рд┐рдзрд┐ ; // рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ (GET, POST, PUT, рдЖрджрд┐)
  4. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ $ рдкрде ; // рдЕрдиреБрд░реЛрдз рдкрде
  5. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ $ рдХреЙрд▓рдмреИрдХ ; // рдХреЙрд▓рдмреИрдХ
  6. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ $ asserts = array (); // рдкрде рдЪрд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
  7. // рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
  8. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдп __construct ( $ рдкрджреНрдзрддрд┐ , $ рдкрде , $ рдХреЙрд▓рдмреИрдХ )
  9. {
  10. $ рдпрд╣ -> рд╡рд┐рдзрд┐ = рд╕реНрдЯреНрд░реЗрдЯреЛрд▓реЙрд╡рд░ ( $ рд╡рд┐рдзрд┐ );
  11. $ рдпрд╣ -> рдкрде = $ рдкрде ;
  12. $ рдпрд╣ -> рдХреЙрд▓рдмреИрдХ = $ рдХреЙрд▓рдмреИрдХ ;
  13. }
  14. // рдирд╛рдо рдХреЗ рдкрде рдЪрд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП regex рдЬреЛрдбрд╝реЗрдВ
  15. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рдореБрдЦрд░ ( $ рдирд╛рдо , $ re )
  16. {
  17. $ рдпрд╣ -> рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ [ $ рдирд╛рдо ] = $ рдлрд┐рд░ рд╕реЗ ;
  18. // рдХрдХреНрд╖рд╛ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдг рд▓реМрдЯрд╛рдПрдВ
  19. // рдпрд╣ рд╕рдорд╛рди рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ: $ reg-> рдореБрдЦрд░ ('рдЖрдИрдбреА', '| ^ \ d + $ |') -> рд░рди ();
  20. рдпрд╣ $ рд╡рд╛рдкрд╕ рдХрд░реЛ ;
  21. }
  22. // рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдорд╛рд░реЛрд╣
  23. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рдЪрд▓рд╛рдирд╛ ()
  24. {
  25. <...>
  26. }
  27. }

рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рд▓рдЧрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд╣реИ - рдЕрдм рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЛрдб рдХреА рджреЛ рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
Copy Source | Copy HTML
  1. $ req = рдирдпрд╛ рдЕрдиреБрд░реЛрдз ( '/ user / {id}' , UserProfile);
  2. $ req -> assert ( '| ^ \ d + $ |' ) -> run ();

рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, PHP рд╣рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдЧрд╛ рдФрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдЧрд╛:
Copy Source | Copy HTML
  1. рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз ( $ рдкрджреНрдзрддрд┐ , $ рдкрде , $ рдХреЙрд▓рдмреИрдХ )
  2. {
  3. рдирдпрд╛ рдЕрдиреБрд░реЛрдз рд╡рд╛рдкрд╕ рдХрд░реЗрдВ ( $ рдкрджреНрдзрддрд┐ , $ рдкрде , $ рдХреЙрд▓рдмреИрдХ );
  4. }

рдЕрдм рдЖрдк рд╕рдм рдХреБрдЫ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
Copy Source | Copy HTML
  1. рдирд┐рд╡реЗрджрди ( '/ user / {id}' , UserProfile) -> рдЕрднрд┐рдХрдерди ( '| ^ \ d + $ |' ) -> run ();

рджреВрд╕рд░рд╛ рдЕрдкреНрд░рд┐рдп рдХреНрд╖рдг рдХрд┐рд╕реА рдПрдХ рдХреЗрдВрджреНрд░ рдХреА рдХрдореА рд╣реИ рдЬрд╣рд╛рдВ рдЕрдиреБрд░реЛрдз рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рд╣рдореЗрдВ рд╣рд░ рд╕рдордп рд░рди () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдХреЗрдВрджреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рднреА рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдирдП рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдЙрд╕рдХреА рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рд╕рд╛рде рд╣реА, рджреЛ рдХреЗрдВрджреНрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦ рджреЗрдВрдЧреЗ!
Copy Source | Copy HTML
  1. рдХрдХреНрд╖рд╛ рдЖрд╡реЗрджрди
  2. {
  3. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ $ рдЕрдиреБрд░реЛрдз = рд╕рд░рдгреА ();
  4. /// ---
  5. // рд╕рд┐рдВрдЧреНрд▓рдЯрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ
  6. рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕реНрдерд┐рд░ $ рдЙрджрд╛рд╣рд░рдг ;
  7. рдирд┐рдЬреА рд╕рдорд╛рд░реЛрд╣ __construct ()
  8. {
  9. }
  10. рдирд┐рдЬреА рд╕рдорд╛рд░реЛрд╣ __clone ()
  11. {
  12. }
  13. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рди getInstance ()
  14. {
  15. рдЕрдЧрд░ (is_object (рд╕реНрд╡рдпрдВ :: $ рдЙрджрд╛рд╣рд░рдг ))
  16. {
  17. рдЖрддреНрдо :: $ рдЙрджрд╛рд╣рд░рдг = рдирдпрд╛ рдЖрддреНрдо;
  18. }
  19. рд╡рд╛рдкрд╕реА рд╕реНрд╡ :: $ рдЙрджрд╛рд╣рд░рдг ;
  20. }
  21. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рди init ()
  22. {
  23. рдЖрддреНрдо :: getInstance ();
  24. }
  25. /// ---
  26. // рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП
  27. рдирд┐рдЬреА рд╕рдорд╛рд░реЛрд╣ i_run ()
  28. {
  29. foreach ( рдпрд╣ $ -> рдЕрдиреБрд░реЛрдз рдФрд░ $ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ )
  30. {
  31. $ рдХрд┐рдпрд╛ = $ рдЕрдиреБрд░реЛрдз -> рдЪрд▓рд╛рдиреЗ ( $ params );
  32. рдЕрдЧрд░ ( $ рдХрд┐рдпрд╛ рдЧрдпрд╛ ) рд╕рд╣реА рд▓реМрдЯрд╛ ;
  33. }
  34. рдЭреВрдареЗ рд▓реМрдЯрдирд╛ ;
  35. }
  36. // рдмрд╛рд╣рд░реА рд╕реНрдерд┐рд░ рдЖрд╡рд░рдг рдХрд╛рд░реНрдп i_run рдкрд░
  37. // рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди :: рд░рди () рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИ :: getInstance () -> рд░рди ()
  38. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╕рдорд╛рд░реЛрд╣ рд░рди ()
  39. {
  40. рд╡рд╛рдкрд╕реА рдЖрд╡реЗрджрди :: getInstance () -> i_run ();
  41. }
  42. }

рдЕрдиреБрд░реЛрдз рд╡рд░реНрдЧ рдХреЛ рднреА рдереЛрдбрд╝рд╛ рдмрджрд▓реЗрдВ:
Copy Source | Copy HTML
  1. рдХрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдз
  2. {
  3. <...>
  4. // рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
  5. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдп __construct ( $ рдкрджреНрдзрддрд┐ , $ рдкрде , $ рдХреЙрд▓рдмреИрдХ )
  6. {
  7. $ рдпрд╣ -> рд╡рд┐рдзрд┐ = рд╕реНрдЯреНрд░реЗрдЯреЛрд▓реЙрд╡рд░ ( $ рд╡рд┐рдзрд┐ );
  8. $ рдпрд╣ -> рдкрде = $ рдкрде ;
  9. $ рдпрд╣ -> рдХреЙрд▓рдмреИрдХ = $ рдХреЙрд▓рдмреИрдХ ;
  10. // рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдореЗрдВ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдЬреЛрдбрд╝реЗрдВ
  11. рдЖрд╡реЗрджрди :: getInstance () -> рдЕрдиреБрд░реЛрдз [] = $ рдпрд╣ ;
  12. }
  13. <...>
  14. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдорд╛рд░реЛрд╣ рдЪрд▓рд╛рдирд╛ ()
  15. {
  16. <...>
  17. // рд╕рднреА рдЬрд╛рдВрдЪреЛрдВ рдХреЗ рдмрд╛рдж, рд╣рдо рдХреЙрд▓рдмреИрдХ рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз рдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рджреЗ рд░рд╣реЗ рд╣реИрдВ
  18. $ рдкрд░рд┐рдгрд╛рдо = call_user_func_array ( $ рдпрд╣ -> рдХреЙрд▓рдмреИрдХ, $ рдпрд╣ -> рдЖрд░реНрдЧреНрд╕);
  19. // рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдиреЗ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реМрдЯрд╛рдпрд╛, рддреЛ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВ
  20. рдЕрдЧрд░ (is_bool ( $ рдкрд░рд┐рдгрд╛рдо ))
  21. $ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдУ ;
  22. // рдЕрдиреНрдпрдерд╛, рд╕рд╣реА рд▓реМрдЯреЗрдВ
  23. рдЕрдиреНрдпрдерд╛
  24. рд╕рдЪ рд▓реМрдЯрдирд╛ ;
  25. }
  26. }

рдПрдХ рдкрде рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рд╕рдм рдХреБрдЫ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдФрд░ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ:
Copy Source | Copy HTML
  1. рдирдпрд╛ рдЖрд╡реЗрджрди ();
  2. рдирд┐рд╡реЗрджрди ( '/ user / {id}' , UserProfile) -> рдЕрднрд┐рдХрдерди ( '| ^ \ d + $ |' ) -> run ();
  3. рдЖрд╡реЗрджрди :: рд░рди ();

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЖрдЧреЗ рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред PHP рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рджреЛ рдмреЗрд╣рддрд░реАрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ: auto_prepend_file рдФрд░ auto_append_file, рдЬреЛ рдЖрдкрдХреЛ рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдХреЛ рдкреНрд░реА-рд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рд╣рдо рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдкрд░, рд╣рдо рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдкрд░, рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди :: рд░рди () рдХрд╣рддреЗ рд╣реИрдВред рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реА рдмрд╛рд░ рдЪрд▓ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдБрдЪ рдХрд░ рдХрд┐ рдХреНрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд▓рд╛рд╕ рдпрд╛ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рдореМрдЬреВрдж рд╣реИ:
Copy Source | Copy HTML
  1. рдпрджрд┐ (class_exists ( 'Application' ))
  2. {
  3. // рдпрджрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рдЕрднреА рддрдХ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реА рдмрд╛рд░ рдЪрд▓рддреА рд╣реИ
  4. рдХрдХреНрд╖рд╛ рдЕрдиреБрд░реЛрдз
  5. {
  6. <...>
  7. }
  8. рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз ( $ рдкрджреНрдзрддрд┐ , $ рдкрде , $ рдХреЙрд▓рдмреИрдХ )
  9. {
  10. <...>
  11. }
  12. рдХрдХреНрд╖рд╛ рдЖрд╡реЗрджрди
  13. {
  14. <...>
  15. }
  16. // рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд╡реЗрджрди,
  17. рдЖрд╡реЗрджрди :: init ();
  18. }
  19. рдЕрдиреНрдпрдерд╛
  20. {
  21. // рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реА рд╣реИ
  22. рдЖрд╡реЗрджрди :: рд░рди ();
  23. }

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рджреЛ "рдЕрддрд┐рд░рд┐рдХреНрдд" рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рд╛ред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ Silex рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб (рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд) рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг http://fw.nizarium.com/ рдкрд░ рд╣реИ , рдЬреЛ рдПрдХ рд╣реА рдорд┐рдиреА-рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдХреБрдЫ рдЧрдВрднреАрд░ рди рд╕рдордЭреЗрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред


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


All Articles