好吧,如果我没猜错的话,你正在寻找这样的东西:
public function behaviors()
{
$model = MyModel::find()->someQuery();
$action = Yii::$app->controller->action->id;
return [
'someBehavior' => [
'class' => 'behavior/namespace/class',
'callback' => function() use ($model, $action) {
//some logic here
}
]
];
}
Because behaviors()
只是一种方法,您可以声明任何变量并在其中添加您想要的任何逻辑,您必须遵循的唯一一个约定 - 返回类型必须是array.
如果您使用自定义行为,则可以使用events()
方法,您可以将行为的方法绑定到某些事件。例如。
class MyBehavior extends Behavior
{
public function events()
{
return [
\yii\web\User::EVENT_AFTER_LOGIN => 'myAfterLoginEvent',
];
}
public function myAfterLoginEvent($event)
{
//dealing with event
}
}
在这个例子中myAfterLoginEvent
将在用户成功登录应用程序后执行。$event
变量将由框架传递,并且根据事件类型,它将包含不同的数据。读关于事件对象 http://www.yiiframework.com/doc-2.0/yii-base-event.html
UPDATE:
正如我现在所看到的,我的答案对于事件和行为更加笼统。现在,当您添加代码时,我可以建议您覆盖行为的 beforeAction($action)
方法如下代码:
public function beforeAction($action)
{
$actionID = $action->id;
/* @var $rule AccessRule */
foreach ($this->rules as &$rule) {
$model = &$rule->authManager['model'];
//now set model scenario maybe like this
$model->scenario = $actionID;
}
//now call parent implementation
parent::beforeAction($action);
}
还看一下访问控制 实施beforeAction https://github.com/yiisoft/yii2/blob/master/framework/filters/AccessControl.php#L112方法,它为每个规则调用allows
方法,将当前操作作为参数传递给它。所以如果你有延伸的课程访问规则,您可以覆盖允许($action, $user, $request)方法或matchCustom($action)
方法设置适当的模型场景。希望这会有所帮助。
另一种选择:
覆盖控制器的runAction($id, $params = [])
方法。这里$id是actionID- 正是您所需要的。检查id,设置合适的模型场景并调用parent::runAction($id, $params);