Yii2: автономное действие не работает в обработчике событий

Я новичок в Yii, поэтому не знаю, как решить мою проблему самым правильным способом.

Есть 2 контроллера — SiteController а также UsersController, Мне нужно извлечь некоторые данные из БД и вывести их в макете. В частности, если user1 и user2 добавили user3 как друга, user3 увидит его на панели главного меню:
введите описание изображения здесь
Пользователь должен видеть его независимо от контроллера, действие которого выполняется (на рисунке выше пользователь видит /site/profile страница, но много других страниц (в частности, invitations) сделать users контроллер).

Я написал те же действия в 2 контроллерах:

public function getStats () { //it duplicates in UsersController and SiteController
$recieved_invitations = Invitations::find()->where(['recipient_id'=>\Yii::$app->user->id])->all();
...
return [$recieved_invitations_count, $received_docs_count];
}

Я решил, что, если счет должен быть на каждой странице, мне нужно запустить его независимо от контроллеров. Итак, я написал в wep.php:

'on beforeAction' => function ($event) {
\Yii::$app->session->set('stats', $event->sender->controller->getStats());
}

А затем в меню в макете я получаю VAR сессии.

Все отлично работает Но getStats() дубликаты действий в контроллерах. я хочу сделать это автономно.

//action code (in '@app/components' folder) (just from documentation):
namespace app\components;
use yii\base\Action;
class HelloWorldAction extends Action {
public function run() {
return "Hello World";
}
}

//in 'actions()' in controllers:
parent::actions();
return [
'hv' => [
'class' => 'app\components\HelloWorldAction',
]
];

//in 'web.php':
'on beforeAction' => function ($event) {
\Yii::$app->session->set('stats', $event->sender->controller->hv());
}

Но исключение бросает: Calling unknown method: app\controllers\UsersController::hv(), Также: если я отключу urlManager в конфиг. подать и закомментировать beforeAction обработчик, действие доступно через этот URL:

http://localhost:8001/index.php?r=users%2Fhv

Почему автономное действие терпит неудачу, если оно срабатывает на beforeAction событие? И, если это нормальное поведение, что я могу сделать, чтобы избежать дублирования getStats() метод?

1

Решение

На самом деле я бы попытался переместить метод getStats в вашу модель User, чтобы вы могли просто получить к нему доступ из любого места в вашем приложении, вызвав его так:

Yii::$app->user->identity->stats;
// OR
Yii::$app->user->identity->getStats();

Обычно лучше иметь толстые модели, простые контроллеры и представления.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]