Behaviors - uniqcle/Yii2 GitHub Wiki
Not optimal
namespace frontend\controllers\lib;
use Yii;
use frontend\models\lib\Author;
class AuthorController extends \yii\web\Controller
{
public function actionIndex()
{
//1. СПОСОБ
//Проверка доступа к экшену
if( Yii::$app->user->isGuest ){
return $this->redirect(['user/login']);
}
...
}
public function actionCreate()
{
//2. СПОСОБ
$this->checkAccess();
...
}
...
//Метод проверки доступа
public function checkAccess(){
if( Yii::$app->user->isGuest ){
return $this->redirect(['user/login']);
}
}
}
Optimal
- Описать класс поведения
- Подключить поведение к компоненту
Создаем папку behaviors
в папке frontend/controllers
. Эти поведения будут относиться к контроллерам.
frontend\controllers\behaviors\AccessBehavior
namespace frontend\controllers\behaviors;
use Yii;
use yii\base\Behavior;
use yii\web\Controller;
use frontend\models\User;
//Все классы поведения должны быть расширены от базового класса
//Описываем класс поведения
class AccessBehavior extends Behavior
{
//Определяем события в поведении
public function events(){
return [
// Навешиваем обработчики на событие, как в методе init()
// Вернет массив, в кот. события, а также их обработчики
Controller::EVENT_BEFORE_ACTION => 'checkAccess',
User::USER_REGISTERED => 'registerUser' // А саму константу с названием события в модели
// а вызов $user->trigger(USER::USER_REGISTERED); в контроллере
];
}
//Метод проверки доступа
public function checkAccess(){
if( Yii::$app->user->isGuest ){
return Yii::$app->controller->redirect(['user/login']);
}
}
public function registerUser(){
echo 'Отправка писем';
}
}
В контроллере frontend\controllers\AuthorController.php
<?php
namespace frontend\controllers\lib;
use Yii;
use frontend\models\lib\Author;
use frontend\controllers\behaviors\AccessBehavior;
class AuthorController extends \yii\web\Controller
{
//ПОДКЛЮЧАЕМ ПОВЕДЕНИЕ
public function behaviors(){
return [
AccessBehavior::className()
];
}
//ПРОСМОТР
public function actionIndex()
{
// Доступные методы из поведения
//$this->checkAccess();
$authors = Author::find()->all();
return $this->render('index', [
'authors' => $authors
]);
}
//СОЗДАНИЕ НОВОГО АВТОРА
public function actionCreate()
{
// Доступные методы из поведения
//$this->checkAccess();
$author = new Author();
$formData = Yii::$app->request->post();
if( $author->load($formData) && $author->save() ){
Yii::$app->session->setFlash('success', 'Новый автор добавлен');
return $this->refresh();
}
return $this->render('create', [
'author' => $author
]);
}
//РЕДАКТИРОВАНИЕ
public function actionUpdate($id)
{
// Доступные методы из поведения
//$this->checkAccess();
$author = Author::findOne($id);
$formData = Yii::$app->request->post();
if( $author->load($formData) && $author->save() ){
Yii::$app->session->setFlash('success', 'Данные автора обновлены');
return $this->redirect(['lib/author/index']);
}
return $this->render('update', [
'author' => $author
]);
}
//УДАЛЕНИЕ
public function actionDelete($id)
{
$author = Author::findOne($id);
$author->delete();
Yii::$app->session->setFlash('danger', 'Данная запись удалена!');
return $this->redirect(['lib/author/index']);
}
}