Не происходит редирект на все action через Behavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
ngc_5128
Сообщения: 5
Зарегистрирован: 2018.08.16, 17:36

Не происходит редирект на все action через Behavior

Сообщение ngc_5128 »

Здравствуйте! Возникла небольшая проблема. Я хотел переместить метод(редирект) в поведение, чтобы не вызывать его каждый раз для action.
Код поведения (AccessBehavior.php):

Код: Выделить всё

namespace frontend\modules\user\controllers\behaviors;

use Yii;
use yii\base\Behavior;
use yii\web\Controller;

class AccessBehavior extends Behavior
{
	public function events()
	{
		return [
			Controller::EVENT_BEFORE_ACTION => 'checkAccess',
		];
	}

	public function checkAccess()
	{
		if (Yii::$app->user->isGuest) {
			return Yii::$app->controller->goHome();
		}
	}
}
Но он неправильно работает, и Yii выдает ошибку. Дело в том, что по логике метод checkAccess (который срабатывает перед каждым action'ом) должен перенаправить пользователя, который не авторизовался, на главную страницу, и не выполнять сам action, но он выполняет... Например: Action'ы, которые взаимодействуют с пользователем, выдают ошибку, потому что пользователя нет, другие же нет, и поведение срабатывает. Не могу понять в чем дело.

Подключение в контроллере:

Код: Выделить всё

use frontend\modules\user\controllers\behaviors\AccessBehavior;
...
public function behaviors()
	{
		return [
			AccessBehavior::className()
		];
	}
...
Может я что-то не знаю или сделал ошибку, в любом случае, благодарю за помощь.
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: Не происходит редирект на все action через Behavior

Сообщение uEhlO4a »

уже есть готовое решение https://www.yiiframework.com/doc/guide/ ... horization

использовать как
[
'class' => AccessControl::className(),
...
'denyCallback' => function ($rule, $action) {
if(1) {
return $action->controller->redirect('some-action'); <-- вариант №1
} else {
throw new \yii\web\ForbiddenHttpException('You are not allowed to access this page'); <--- вариант №2
}
}
]

в конфигурации
'components' => [
'user' => [
'loginUrl' => ['site/home'],
],
],
ngc_5128
Сообщения: 5
Зарегистрирован: 2018.08.16, 17:36

Re: Не происходит редирект на все action через Behavior

Сообщение ngc_5128 »

Благодарю, работает. Но все же интересно почему не работает мой вариант? Ведь срабатывает EVENT_BEFORE_ACTION, должен произойти редирект и action не должен выполняться, но он выполняется и только потом происходит редирект(если нет ошибок).
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Не происходит редирект на все action через Behavior

Сообщение masson »

Например: Action'ы, которые взаимодействуют с пользователем, выдают ошибку, потому что пользователя нет
А что за ошибка-то?
ngc_5128
Сообщения: 5
Зарегистрирован: 2018.08.16, 17:36

Re: Не происходит редирект на все action через Behavior

Сообщение ngc_5128 »

masson писал(а): 2018.08.21, 19:16 А что за ошибка-то?
Например есть запрос - Yii::$app->user->identity->getId();
Т.к. пользователя нет, Yii выдает ошибку, потому что я обращаюсь к тому, чего нет.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Не происходит редирект на все action через Behavior

Сообщение masson »

Понятно. А текст ошибки есть?
uEhlO4a
Сообщения: 70
Зарегистрирован: 2017.08.12, 19:19

Re: Не происходит редирект на все action через Behavior

Сообщение uEhlO4a »

https://github.com/yiisoft/yii2/blob/ma ... er.php#L35
https://github.com/yiisoft/yii2/blob/ma ... r.php#L274

когда приходит событие, то приходит как

Код: Выделить всё

	public function checkAccess($event)  <---- ТУТ
	{
		if (Yii::$app->user->isGuest) {
                       $event->isValid = false;   <------ ЭТО
			return Yii::$app->controller->goHome();
		}
	}
и return тут ни о чем

п.с.
Я так никогда не делал, и не скажу сработает ли Yii::$app->controller->goHome() при добавлении $event->isValid = false
Закрыто