【问题标题】:Yii2: standalone action does not work in event handlerYii2:独立动作在事件处理程序中不起作用
【发布时间】:2015-08-17 21:24:28
【问题描述】:

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

有 2 个控制器 - SiteControllerUsersController。我需要从数据库中检索一些数据并将其输出到布局中。特别是,如果 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());
}

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

一切正常。但是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() 方法?

【问题讨论】:

    标签: php yii yii2 yii-actions


    【解决方案1】:

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

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

    通常最好有胖模型、简单的控制器和视图。

    【讨论】:

    • 谢谢,它有效。但是将这段代码放入逻辑中是否正确,即负责身份?只是我对 Yii 中的身份接口还不太了解,所以不明白,这段代码在User 模型中是否语义可用...
    • Here 是一些模型最佳实践指南,非常有用。
    • 只是解释一下它是如何工作的:Yii::$app->userthis class 的一个实例,它使用getIdentity() 方法来访问你在config/web.php 上设置的类
    • 谢谢,我之前读过best practices,我的意思是,我的getStats() 是逻辑,不同于主要的User 逻辑。好的,我会解决它,当我的 Yii2 体验将变得更广泛时。现在 - 接受您的回答,再次感谢)
    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多