рдПрдХ рд╕рд░рд▓ рдмреНрд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Yii 2 рдХрд╛ рдкрд░рд┐рдЪрдп

рд╣реИрд▓реЛ, рдкреНрд░рд┐рдп Habrausers!

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рд╢реАрд░реНрд╖рдХ рд╕реЗ рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдпрд╣ рд▓реЗрдЦ Yii рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ред рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдкрдХреЛ рдЕрджреНрднреБрдд Yii 2 рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

рд╢рд╛рдпрдж рдмреНрд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдЪрд░рдг рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ, рдФрд░ рдореИрдВ рдирдП Yii2 рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред рдмрд╛рдХреА рд╕рднреА, рдЖрдк рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ, рд╢рд╛рдпрдж, рдХреЗрд╡рд▓ рд▓рд┐рдЦрд┐рдд рдкрд╛рда рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдЧрд╛ред

рд╣рд╛рдЗрд▓рд╛рдЗрдЯ


Yii2 рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рдерд╛, рд╕рдм рдХреБрдЫ рдиреЗрдорд╕реНрдкреЗрд╕ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╢рд╛рдпрдж рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореБрдЦреНрдп "рд╣рд╛рдЗрд▓рд╛рдЗрдЯ" рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ: рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рд╕реЗ "C" рдЙрдкрд╕рд░реНрдЧ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдмрдирд╛рдПрдВ


рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдореВрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рдЧреАрдереВрдм рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЬрд╛рдПрдВред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЪреБрдирд╛ред рдпрд╣ рд╣рдореЗрдВ Yii2 рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕реАрдЦрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ, рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рдореБрдЦреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рд╕рдм, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИ, рд╡рд╣ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдордЭрд╛, рдЕрдм рдкреНрд░рддреНрдпрдп "рдореЙрдбреНрдпреВрд▓" рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реА рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдмрд┐рдирд╛ рдкреНрд░рддреНрдпрдп рдХреЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рд╣реЛрдВрдЧреЗред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
Site.php, Users.php, Blogs.php, рдЖрджрд┐ред
рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдЗрд╕ рдкрд░ рдирд┐рд╡рд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕: config / main.php


Yii 1.0 рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ main.php рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдХрдИ рддрддреНрд╡ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрдИ рдирд╛рдорд╛рдВрдХрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдРрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдлреНрд░реЗрдо рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рд╕реВрд╕реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗрдЯ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреНрд▓рдЧ рдЗрди рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдирд╛ "CRUD" рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

CRUD


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

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 public function actionCreate() { $model = new Blog(); if ($model->load($_POST) && $model->save()) { return Yii::$app->response->redirect(array('view', 'id' => $model->id)); } else { echo $this->render('create', array('model' => $model)); } } 

 $model->load($_POST) //    if (isset($_POST['Blog'])) { $model->attributes = $_POST['Blog']; } 

CRUD рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИрдВред

рдЖрджрд░реНрд╢


рдореБрдЦреНрдп рдирд╡рд╛рдЪрд╛рд░ рд╡рд┐рдзрд┐ рд╣реИ "рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ () рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЙрдбрд▓ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 public function scenarios() { return array( 'backend' => array('email', 'role'), 'frontend' => array('email', '!name'), ); } 

рдореЙрдбрд▓ formName () рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрдВрдзрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдЙрд╕ рдореЙрдбрд▓ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдкреНрд░рдкрддреНрд░ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ - рдореЙрдбрд▓ () рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдм рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдЕрдиреНрдп рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ:
  MyModel::getAuthor(); 

ActiveRecord


рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм Yii2 рдореЗрдВ рдПрдХ рдирдпрд╛ рдПрдЖрд░, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рд╕рдиреНрди рдХрд░рддрд╛ рд╣реИред

рдХрдИ рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг:
"рд╕реНрдХреЛрдкреНрд╕ ()" рдХреЛ рдПрдЖрд░ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
 public function active($query) { return $query->andWhere('status = ' . self::STATUS_ACTIVE); } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рд╕рдВрдмрдВрдз ()" рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓ рджрд┐рдП рдЧрдП рдереЗ, рдЬреЛ рдЕрдм рд╣реЗрдЯрд░реЛрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: "hasOne ()", "hasMany ()"ред
 public function getAuthor() { return $this->hasOne('app\modules\users\models\User', array('id' => 'author_id')); //   тАУ     ,     . //          PK  (id)  FK     (author_id),     } 

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЪрдпрди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
 $customers = Customer::find() ->where(array('status' => $active)) ->orderBy('id') ->all(); // return the customer whose PK is 1 $customer = Customer::find(1); $customers = Customer::find(array('status'=>$active)); $customers = Customer::find()->asArray()->all(); $customers = Customer::find()->active()->asArray()->all(); 

рдФрд░ рдЕрдВрдд рдореЗрдВ, AR рдЕрдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ "tableName ()" рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдореЙрдбрд▓ рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдорд╛рди "tbl_MODEL_NAME" рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ tbl_user рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрдЧрд╛ред рдпрджрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдо рдЕрд▓рдЧ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдШрдЯрдирд╛рдУрдВ


рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдИрд╡реЗрдВрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ - рдЬрдм рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдИрд╡реЗрдВрдЯ рдХреЛ рдмрд╛рдж рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдорд╛рдирдХ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рдИ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ "EVENT_AFTER_INSERT"ред

рдШрдЯрдирд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ "рдЯреНрд░рд┐рдЧрд░ ()" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
  app\modules\users\models\User ... public function afterSave($insert) { //   $event = new ModelEvent; $this->trigger(self::EVENT_NEW_USER, $event); parent::afterSave($insert); } ...  app\modules\users\controllers\DefaultController ... public function actionSignup() { $model = new User(); $model->scenario = 'signup'; if ($model->load($_POST)) { if (!$this->module->activeAfterRegistration) //    ,   [[EVENT_NEW_USER]] $model->on($model::EVENT_NEW_USER, array($this->module, 'onNewUser')); if ($model->save()) { Yii::$app->session->setFlash('success'); return Yii::$app->response->refresh(); } } else { echo $this->render('signup', array('model' => $model)); } } ... 

рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:
 function ($event) { ... } //   array($object, 'handleClick') // $object->handleClick() array('Page', 'handleClick') // Page::handleClick() 'handleClick' //   handleClick() 

рд░рд╛рдп


Yii2 рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдЕрднреНрдпрд╛рд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдЬреЛ рд╕реАрдзреЗ рд╕реВрдЪрдирд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рджреГрд╢реНрдп рдореЗрдВ рдЪрд░ "$ рдпрд╣" рдЕрдм рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирдП рд╡рд░реНрдЧ "yii \ base \ View" рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдирд┐рдпрдВрддреНрд░рдХ рдпрд╛ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рджреГрд╢реНрдп рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЖрдкрдХреЛ рд╡рд┐рдзрд┐: "рд╕рдВрджрд░реНрдн" рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 //  app\modules\blogs\views\default\index // $this->context    app\modules\blogs\controllers\DefaultController //    ,       echo $this->context->module->recordsPerPage; //  10 // app\modules\comments\widgets\comments\views\index // $this->context    app\modules\comments\widgets\comments\Comments if ($this->context->model['id'] == 10 ) {...} 

рд╡рд┐рдЬреЗрдЯ


рд╡рд┐рдЬреЗрдЯ рдирдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдереЗ, рд╕рд╛рде рд╣реА рдЕрдм рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ "рдЗрдХреЛ" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 // Note that you have to "echo" the result to display it echo \yii\widgets\Menu::widget(array('items' => $items)); // Passing an array to initialize the object properties $form = \yii\widgets\ActiveForm::begin(array( 'options' => array('class' => 'form-horizontal'), 'fieldConfig' => array('inputOptions' => array('class' => 'input-xlarge')), )); ... form inputs here ... \yii\widgets\ActiveForm::end(); 

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдлрд┐рд▓реНрдЯрд░


рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдХ рдлрд┐рд▓реНрдЯрд░ "рд╡реНрдпрд╡рд╣рд╛рд░" рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
 public function behaviors() { return array( 'access' => array( 'class' => \yii\web\AccessControl::className(), 'rules' => array( // allow authenticated users array( 'allow' => true, 'actions' => array('login', 'signup', 'activation'), 'roles' => array('?') ), array( 'allow' => true, 'actions' => array('logout'), 'roles' => array('@') ), array( 'allow' => true, 'actions' => array('index', 'view'), 'roles' => array('guest') ), array( 'allow' => true, 'actions' => array('edit', 'delete'), 'roles' => array('@') ), // deny all -   ,      array( 'allow' => false ) ) ) ); } 

рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ - рдХреЗрд╡рд▓ 2 рднреВрдорд┐рдХрд╛рдПрдБ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд░рд╣реАрдВ:

рд╕реНрдереИрддрд┐рдХ рд╕рд╣рд╛рдпрдХреЛрдВ


Yii2 рдиреЗ рдХрдИ рдирдП рдорджрджрдЧрд╛рд░ рдЬреЛрдбрд╝реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕реА SecurityHelper рдХреА рддрд░рд╣, рдЬреЛ рдкрд╛рд╕рд╡рд░реНрдб рдФрд░ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб, ArrayHelper, Html рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕рдиреНрди рдХрд░рддрд╛ рд╣реИред

ActiveForm


ActiveField рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░рдг, рдкреНрд░рдкрддреНрд░ рдЕрдм рдФрд░ рднреА рддреЗрдЬрд╝реА рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рд╢реИрд▓реА рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИред
 <?php $form = ActiveForm::begin(array('options' => array('class' => 'form-horizontal'))); echo $form->field($model, 'username')->textInput($model->isNewRecord ? array() : array('readonly' => true)); echo $form->field($model, 'email')->textInput(); if (!$model->isNewRecord) { if (Yii::$app->user->checkAccess('editProfile')) { echo $form->field($model, 'status')->dropDownList(array( User::STATUS_ACTIVE => 'Active', User::STATUS_INACTIVE => 'Inactive', User::STATUS_DELETED => 'Deleted' )); echo $form->field($model, 'role')->dropDownList(array( User::ROLE_USER => 'User', User::ROLE_ADMIN => 'Admin' )); } echo $form->field($model, 'oldpassword')->passwordInput(); } echo $form->field($model, 'password')->passwordInput(); echo $form->field($model, 'repassword')->passwordInput(); ?> <div class="form-actions"> <?php echo Html::submitButton($model->isNewRecord ? 'Register' : 'Update', array('class' => 'btn btn-primary')); ?> </div> <?php ActiveForm::end(); ?> 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдкрд╣рдЪрд╛рди


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд░реЛрдмреЛрдЯ рдЕрдм рдХреНрд▓рд╛рд╕ "yii \ web \ User" рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ "yii \ web \ Identity" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИред
рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╡рдЬрд╣ рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА "рдкрд╣рдЪрд╛рди" рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 echo Yii::$app->user->identity->username; 

URL рдкреНрд░рдмрдВрдзрди


рдпрд╣рд╛рдВ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 ... array( 'dashboard' => 'site/index', 'PUT post/<id:\d+>' => 'post/update', 'POST,PUT post/index' => 'post/create', 'POST <controller:\w+>s' => '<controller>/create', '<controller:\w+>s' => '<controller>/index', 'PUT <controller:\w+>/<id:\d+>' => '<controller>/update', 'DELETE <controller:\w+>/<id:\d+>' => '<controller>/delete', '<controller:\w+>/<id:\d+>' => '<controller>/view', ); ... 

RBAC


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

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ "\ yii \ rbac \ PhpManager" рд╕реЗ рд╡рд╛рд░рд┐рд╕ рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ "PhpManager.pp" рдирд╛рдо рдХреЗ рддрд╣рдд "рдШрдЯрдХреЛрдВ" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ "рдЖрд░рдмреАрдПрд╕реА" рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
рдЗрд╕рдореЗрдВ рдХреЛрдб рд╕рд░рд▓ рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рд╡рд░реНрдгрд┐рдд рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рднреВрдорд┐рдХрд╛ рдореЗрдВ рдмрд╛рдВрдзрддреЗ рд╣реИрдВред
 <?php namespace app\modules\rbac\components; use Yii; class PhpManager extends \yii\rbac\PhpManager { public function init() { if ($this->authFile === NULL) $this->authFile = Yii::getAlias('@app/modules/rbac/components/rbac') . '.php'; parent::init(); if (!Yii::$app->user->isGuest) $this->assign(Yii::$app->user->identity->id, Yii::$app->user->identity->role); } } 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рд╣рдо "rbac.php" рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред (рдХреЛрдб рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: @app/modules/rbac/components/rbac )

рдареАрдХ рд╣реИ, рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдмрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ "difManager" рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 ... 'authManager' => array( 'class' => 'app\modules\rbac\components\PhpManager', 'defaultRoles' => array('guest'), ), ... 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрд┐рд╕ рдЬрдЧрд╣ рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╣рдо рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 if (Yii::$app->user->checkAccess('editOwnBlog', array('blog' => $model)) || Yii::$app->user->checkAccess('editBlog')) { ... } 

рдпрд╣ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рдореИрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдИрдВред

рдлрд┐рд▓рд╣рд╛рд▓, рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд╛рдИ 2 рдореЗрдВ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдЕрд░реНрдерд╛рддреН, рдореЙрдбрд▓ рдХреЛ рдорд╛рдиреНрдп рдХрд░рддреЗ рд╕рдордп рд╕рд╣реА рдЙрддреНрддрд░ рдХреИрд╕реЗ рдмрдирд╛рдПрдВред 1.0 рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 echo CActiveForm::validate($model); 

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рд╣реИ, рд▓рд┐рдЦреЛ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдВрдЧреЗред

рдкрд░рд┐рдгрд╛рдо


рдЕрдзреВрд░реЗ рд▓реБрдХ рдХреЗ рдмрд╛рд╡рдЬреВрдж, Yii 2 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рдорд╛рд░реЗ рдЖрдЧреЗ рд╣реИред

Yii 2 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдЖрдпрд╛ред рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЗрдЪреНрдЫрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣реИред

рд▓реЗрдЦ рдмрдбрд╝рд╛ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдореИрдВ рдЕрднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреИрд╕реЗред

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рд╕реМрднрд╛рдЧреНрдп рд╣реИ

рдЬреАрдердм рдкрд░ рдбреЗрдореЛ рдмреНрд▓реЙрдЧред рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢ рдореМрдЬреВрдж рд╣реИрдВред
рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдмреНрд▓реЙрдЧ рдЙрджрд╛рд╣рд░рдгред

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


All Articles