Yiinitializr рдЬреИрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрдиреНрдирдд рдЯреЗрдореНрдкрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдПрдкреАрдЖрдИ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЯрд┐рдкреНрдкрдгреА рдпрд╛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рд╕рд╣реА рдПрдкреАрдЖрдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдирд╣реАрдВ
рдЫреВрдПрдВрдЧреЗ , рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛
рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐
2amigos рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдХрд╛ рд▓рд╛рдн рдХреИрд╕реЗ рдЙрдард╛рдпрд╛
рдЬрд╛рдП , рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╣рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдЬрд▓реНрджреА
(рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж - рдмрд┐рд▓реНрдХреБрд▓ рдЬрд▓реНрджреА) рдпреВрдЖрдИ рдкрд░ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рддреИрдирд╛рдд рдХрд┐рдпрд╛ред
Yiinitializr рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛
рдПрдкреАрдЖрдИ - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд╛рд╣рд░реА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ, рддреЛ рд╣рдо рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ Yii рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред Yiinitializr рд╢рд╛рдпрдж рдЖрдкрдХреЛ рд╕реВрдЯ рдХрд░реЗрдЧрд╛, рдЬреЛ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкреНрд░рд▓реЗрдЦрди рдХреА рдХрдореА рдПрдХ рдЧрдВрднреАрд░ рдмрд╛рдзрд╛ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЕрджреНрднреБрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдПрдкреАрдЖрдИ рдХрд╛ рдХрд╛рдо рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдбреЗрд╡рд▓рдкрд░ рдкрд╣рд▓реЗ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рдЪреБрдХреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛?
рд╣рдорд╛рд░рд╛ рд╕рд┐рд╕реНрдЯрдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА (рдПрдХ рдмрд╛рд╣рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛), рдПрдХ рдирд┐рдЬреА рдХреБрдВрдЬреА, рдФрд░ рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпреЗ рдХреБрдВрдЬреА рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдореБрджреНрджреЗ рдФрд░ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рдкрдВрдЬреАрдХрд░рдг рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд░реАрд╕реНрдЯ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ HTTP рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ HTTP рд╣реЗрдбрд░, рд╕рд╛рде рд╣реА JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдЗрд╕рдХреА рд╕рдорд╛рдкреНрддрд┐ рддрд┐рдерд┐, рд╕рд╛рде рд╣реА рд╡рд┐рднрд┐рдиреНрди рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдпрд╣ рд╕рд╣реА рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред
рдЙрдиреНрдирдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдВрддрд░
рдЕрдЧрд░ рдкрд╣рд▓реЗ рд╣рдо рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рдЕрдм рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдПрдбрд╡рд╛рдВрд╕реНрдб рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рджреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдПрдкреАрдЖрдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЕрдирдкреИрдХ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рдЕрднреА рд╣реИ
./api
рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП
./api
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рдПрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:
./api/extensions/filters/EApiAccessControlFilter.php
- рдПрдкреАрдЖрдИ рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдореЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд░реНрдЧред
./api/extensions/components/EApiAccessRule.php
- рд╡рд╣ рд╡рд░реНрдЧ рдЬреЛ API рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред
./api/extensions/components/EApiActiveRecord.php
- рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдЖрд░-рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧред
./api/extensions/components/EApiController.php
- рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рд╡рд░реНрдЧред
./api/extensions/components/EApiError.php
- рдПрдкреАрдЖрдИ рддреНрд░реБрдЯрд┐ рд╡рд░реНрдЧ рдЬреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓реЙрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред
./api/extensions/components/EApiErrorHandler.php
- рдПрдкреАрдЖрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧред рдпрджрд┐ рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
./api/models/ApiUser.php
рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред
./common/lib/YiiRestTools/
-
./common/lib/YiiRestTools/
рдПрдкреАрдЖрдИ рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдХрдХреНрд╖рд╛рдПрдВред
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рд╕реАрдзреЗ рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧреАред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдмрдЧ рдареАрдХ рдХрд░рддрд╛ рд╣реИ
Yiinitializr рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреЗрд░реЗрдЯреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рдФрд░ 80% рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рдХреАрдбрд╝реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ 80% рд╕рдордп рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕реЗ рдкрд░рд┐рд╖реНрдХреГрдд рдбреЗрд╡рд▓рдкрд░реНрд╕
(рдпрд╛рдиреА рд╣рдо) рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рдбрд╛рд▓ рджрд┐рдпрд╛ред
рдЪреВрдВрдХрд┐ рд╣рдордиреЗ Yiinitializr рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ рдФрд░ API рд░реВрдЯрд┐рдВрдЧ (
./api/config/api.php
) рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
'rules' => array(
рд╣рдореЗрдВ рдХреБрдЫ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЯрд┐рдкреНрдкрдгреА рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ REST рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред REST рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЕрдиреБрд░реЛрдз рдПрдХ рд╣реА URL рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдХреНрд░рд┐рдпрд╛рдПрдБ HTTP рддрд░реАрдХреЛрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдиреА рдЬрд╛рддреА рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдкрддрд╛ | HTTP рд╡рд┐рдзрд┐ | рдХрдбрд╝реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА |
---|
api.yiinitializr.dev/test/ | рдкреНрд░рд╛рдкреНрдд | TestController \ actionIndex () |
api.yiinitializr.dev/test/1/ | рдкреНрд░рд╛рдкреНрдд | TestController \ ActionView (1) |
api.yiinitializr.dev/test/ | рдкреЛрд╕реНрдЯ | TestController \ ActionCreate () |
api.yiinitializr.dev/test/1/ | PUT | TestController \ ActionUpdate (1) |
api.yiinitializr.dev/test/1/ | рд╣рдЯрд╛рдПрдБ | TestController \ actionDelete (1) |
рд╣рдо рдирд┐рдпрдореЛрдВ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд░реВрдк рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВ:
'rules' => array(
рд╣рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдПрдХ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд┐рд▓реНрдХреБрд▓ рд╕рд░рд▓ рд╣реИ - рдкреЛрд░реНрдЯреЗрдмрд▓
use YiiRestTools\Helpers\RequestData; use Yiinitializr\Helpers\ArrayX;
EApiAccessControlFilter.php
рд╕реЗ
EApiAccessRule.php
,
EApiAccessRule.php
рдпреЗ рдХрдХреНрд╖рд╛рдПрдВ рджреВрд╕рд░реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рде рддрд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб (
./api/extensions/components/EApiAccessRule.php
) рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
public function isRequestAllowed($user, $controller, $action, $ip, $verb) { if ($this->isActionMatched($action) && $this->isUserMatched(Yii::app()->user) && $this->isRoleMatched(Yii::app()->user) && $this->isSignatureMatched($user) && $this->isIpMatched($ip) && $this->isVerbMatched($verb) && $this->isControllerMatched($controller) ) { return $this->allow ? 1 : -1; } else { return 0; } }
isRequestAllowed
рдЕрдиреБрд░реЛрдз рдирд┐рдпрдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ,
isRequestAllowed
рд╡рд┐рдзрд┐ рдЬрд╛рдБрдЪ рдХрд░рддреА рд╣реИред рдпрджрд┐ рдмреНрд▓реЙрдХ рдореЗрдВ рдЪреЗрдХ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рд╣реА рд╣реИ, рддреЛ рдпрд╣ рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, 1 рдпрд╛ -1 рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдирд┐рдпрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ - рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдирд┐рдпрдо рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдзрд┐ 0. рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИред рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдХреНрдпрд╛ рд╣реИрдВ:
public function filters() { return array( array( 'EApiAccessControlFilter -error', 'rules' => array( array('allow', 'users' => array('@')), ) ) ); }
рдПрдХ рдмрд╛рдд рднреНрд░рдорд┐рдд рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рддреН рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рддреНрдпрд╛рдкрди
$this->isSignatureMatched($user)
рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ
$this->isSignatureMatched($user)
ред рдЧрд▓рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
(рдпрд╛ рд╣реИрдХрд░) рдХреЛ рдЕрдВрджрд░ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рд╕рд╣реА рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ, рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЖрдиреЗ рджреЗрдВ рдпрд╛ рди рджреЗрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public function isRequestAllowed($user, $controller, $action, $ip, $verb) { if ($this->isActionMatched($action) && $this->isUserMatched(Yii::app()->user) && $this->isRoleMatched(Yii::app()->user) && $this->isIpMatched($ip) && $this->isVerbMatched($verb) && $this->isControllerMatched($controller) ) { return ($this->allow && $this->isSignatureMatched($user)) ? 1 : -1; } else { return 0; } }
рдЦрд╛рдорд┐рдпрд╛рдВ рдЦрддреНрдо рд╣реЛрддреА рджрд┐рдЦ рд░рд╣реА рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рдХреА рдХрдореА рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддреА рд╣реИред рдПрдХ рдХрджрдо-рджрд░-рдЪрд░рдг рдбрд┐рдмрдЧрд░ рдХреА рдорджрдж рд╕реЗ, рдореИрдВрдиреЗ рдПрдкреАрдЖрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдФрд░ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореВрд▓
рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рдмреБрдирд┐рдпрд╛рджреА рд░реВрдкрд░реЗрдЦрд╛рдПрдБ рдмрдирд╛рдПрдВред рддреЛ рдЪрд▓реЛ рдЙрд╕ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ HTTP рд╣реЗрдбрд░ рдХрд╛ рдирд╛рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА (
./api/config/api.php
)
./api/config/api.php
:
'params' => array( 'api.key.name' => 'APIKEY', )
рд╕рд╣реА рд╕рдордп рдХреНрд╖реЗрддреНрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ (рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) (
common/config/main.php
):
'params' => array( ... 'php.timezone' => 'Europe/Moscow', ),
рд╣рдо рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣
рдкрд╣рд▓реЗ рд╕реЗ
рд╣реА рд╕рдВрднрд╡ рд╣реИ ред
рдЕрдм, рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдмрдирд╛рдПрдБ:
> yiic migrate create create_api_user_table
рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдореЗрдВ
up()
рдФрд░
down()
рддрд░реАрдХреЗ рд▓рд╛рддреЗ рд╣реИрдВ:
public function up() { $this->createTable('{{api_user}}', array( 'id' => 'pk', 'username' => 'varchar(32) NOT NULL', 'api_key' => 'varchar(32) NOT NULL', 'api_secret' => 'varchar(32) NOT NULL', )); $this->insert('{{api_user}}', array( 'username' => 'test_user', 'api_key' => 'e4afe26b5b57083f74b2d01c7066379c',
рд╣рдо
ApiUser
рдореЙрдбрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ API рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╡рд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рднреА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
class ApiUser extends EApiActiveRecord { ... public function tableName() { return '{{api_user}}'; } ... }
рд╣рдо рдЕрдкрдирд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рдПрдХрдорд╛рддреНрд░
рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрдЧреАред рдЪрд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдирд╛
рдЕрдВрддрд┐рдо рдХрджрдо Yiinitializr рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЧреНрд░рд╛рд╣рдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдирд╛ рд╣реИред рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди HTTP рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП,
cURL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреАред рдЖрдЧреЗ рдХреА рд╣рд▓рдЪрд▓ рдХреЗ рдмрд┐рдирд╛, рд╕рднреА рдХреЛрдб рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рд░рдЦреЗ рдЧрдП рд╣реИрдВред рдЦреЛрд▓реЛ, рджреЗрдЦреЛ, рдХреЙрдкреА рдХрд░реЛред
SimpleClient рдЧреНрд░рд╛рд╣рдХ рд╡рд░реНрдЧрд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
prepareData($secretKey)
рд╡рд┐рдзрд┐
RequestData
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ
prepareData($secretKey)
рд╡рд░реНрдЧ рдХреА
prepareData($secretKey)
рд╡рд┐рдзрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
class SimpleClient { private $baseUrl; private $apiPublic; private $apiSecret; private $expiration; public function __construct($url, $publicKey, $secretKey, $expiration = '+1 hour') { $this->baseUrl = $url; $this->apiPublic = $publicKey; $this->apiSecret = $secretKey; $this->expiration = $expiration; } public function makeRequest($verb, $controller, $params = array()) { $ch = curl_init(); $signature = $this->generateSignature(); $url = $this->makeUrl($controller); if (!empty($params) && isset($params['id'])) { $url .= $params['id']; } curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_CUSTOMREQUEST => $verb, CURLOPT_HTTPHEADER => array('APIKEY: ' . $this->apiPublic), CURLOPT_POSTFIELDS => json_encode(array( 'signature' => $signature, 'expiration' => $this->relativeTimeToAbsolute($this->expiration), )), )); $result = curl_exec($ch); curl_close($ch); return $result; } private function generateSignature() { $ttdInt = strtotime($this->expiration); $raw = json_encode(array('expiration' => gmdate('Ymd\TH:i:s\Z', $ttdInt))); $jsonPolicy64 = base64_encode($raw); $signature = base64_encode(hash_hmac( 'sha1', $jsonPolicy64, $this->apiSecret, true )); return $signature; } private function makeUrl($controller) { return 'http://' . rtrim($this->baseUrl, '/') . '/' . $controller . '/'; } private function relativeTimeToAbsolute ($relativeTime) { return date('M d Y, H:i:s', strtotime($relativeTime)); } }
SimpleClient рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ $api = new SimpleClient('api.yiinitializr.dev', 'e4afe26b5b57083f74b2d01c7066379c', '156a17333e77a3c504018cae5ada8c3b'); $api->makeRequest('GET', 'test'); $api->makeRequest('GET', 'test', array('id' => 1)); $api->makeRequest('POST', 'test'); $api->makeRequest('PUT', 'test', array('id' => 1)); $api->makeRequest('DELETE', 'test', array('id' => 1));
рдкрд░реАрдХреНрд╖рдг рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг class TestController extends EApiController { public function actionIndex() {
рдЕрдкрд╛рдЪреЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВPUT рдФрд░ DELETE рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП Apache рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ
./api/www/.htaccess
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
<Limit GET POST PUT DELETE> order deny,allow allow from all </Limit>
рдирд┐рд░реНрдгрдп рдпрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХрд╣рдирд╛
рдЗрддрдиреЗ
рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, рд╣рдордиреЗ
рдЕрдкрдиреА рдХрд╛рд░ рд╕реНрдЯрд╛рд░реНрдЯ рдХреАред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдПрдХ рджрд┐рди
(рдФрд░ рджреЛ рднреА рдирд╣реАрдВ) рд╕реЗ рдЕрдзрд┐рдХ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧрд╣рди рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓рд╛ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдВрдХ рдореЗрдВ рд╕реЗ, рдореИрдВ рдЖрдкрдХреЛ
Yiinitializr рдХреЛ рдЧреНрд░реЗрдЯ рдЧрд╛рдЗрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреЗ рд╕рдХрддрд╛
рд╣реВрдВ (рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ?) рдФрд░ рд▓реЗрдЦ
Yii (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ) рдХреЗ рд▓рд┐рдП REST API рдХреИрд╕реЗ рдмрдирд╛рдПрдВ ред
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдореИрдВ рд╡рд╛рдИрд╡рд╛рдИ рдкрд░ рдПрдкреАрдЖрдИ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рд╕реБрдзрд╛рд░ рд╕реБрдЭрд╛рддрд╛ рд╣реВрдВред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред