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

  1. Описать класс поведения
  2. Подключить поведение к компоненту

Создаем папку 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']);
    }

}