Я новичок в 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()
метод?
На самом деле я бы попытался переместить метод getStats в вашу модель User, чтобы вы могли просто получить к нему доступ из любого места в вашем приложении, вызвав его так:
Yii::$app->user->identity->stats;
// OR
Yii::$app->user->identity->getStats();
Обычно лучше иметь толстые модели, простые контроллеры и представления.
Других решений пока нет …