Yii2:独立操作在事件处理程序中不起作用

时间:2015-08-17 21:24:28

标签: php yii yii2 yii-actions

我是Yii的初学者,所以不知道如何以最正确的方式解决我的问题。

有2个控制器 - SiteControllerUsersController。我需要从DB中检索一些数据并将其输出到布局中。特别是,如果user1和user2将user3添加为朋友,user3将在主菜单面板上看到它: enter image description here 无论控制器是否正在运行,用户都必须看到它(在用户看到/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());
}

然后在布局菜单中检索会话变量。

一切正常。但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 个答案:

答案 0 :(得分:1)

我实际上会尝试将getStats方法移动到您的User模型,这样您只需通过调用它就可以从应用程序的任何位置访问它:

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

拥有胖模型,简单的控制器和视图通常会更好。