在 Yii2 中运行行为代码之前获取控制器操作

2024-03-19

我正在尝试在 a 中执行一些代码Yii2控制器,因为我需要模型中的一些代码才能在behaviors部分,以便我可以将模型作为参数传递并避免运行重复的查询;但是我还需要能够找出什么action正在被召唤,但我运气不太好。

我尝试过使用beforeAction但似乎这已经运行了AFTER the behaviours代码运行,所以这对我没有帮助。

然后我尝试使用init,但似乎action无法通过以下方式获得$this->action->id在那时候。

一些示例代码:

class MyController extends Controller { 

    public $defaultAction = 'view';

    public function init() {

        // $this->action not available in here

    }

    public function beforeAction() {

        // This is of no use as this runs *after* the 'behaviors' method

    }

    public function behaviors() {
        return [
            'access' => [
                'class' => NewAccessControl::className(),
                'only' => ['view','example1','example2'],
                'rules' => [
                    [
                        'allow' => false,
                        'authManager' => [
                            'model' => $this->model,
                            'other_param' => $foo,
                            'other_param' => $bar,
                        ],
                        'actions' => ['view'],
                    ],
                    // everything else is denied
                ],
            ],
        ];
    }

    public function viewAction() {

        // This is how it is currently instantiated, but we want to instantiate *before* the behavior code is run so we don't need to instantiate it twice
        // but to be able to do that we need to know the action so we can pass in the correct scenario

        $model = new exampleModel(['scenario' => 'view']);

    }

}

authManager只是对一个的引用member variable的扩展内AccessRule class.

无论如何我可以做到这一点吗?


好吧,如果我没猜错的话,你正在寻找这样的东西:

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);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Yii2 中运行行为代码之前获取控制器操作 的相关文章

  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • PHP 会话不适用于游戏

    我正在尝试模仿一款名为 SKUNK 用骰子玩 的游戏来完成一项作业 我无法让会话正常工作 这是我第一次使用 PHP 我还被告知无需会议即可完成 这是我的代码
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • 如何在原则 2 迁移中删除外键

    我想在原则 2 迁移中删除外键 但没有 dropForeignKeyConstraint 有谁知道怎么丢掉吗 public function down Schema schema table schema gt getTable table
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • PHP HEREDoc (EOF) 语法在 Sublime Text 3 上突出显示与正斜杠的差异

    我不熟悉 Sublime Text 3 如何使用语法突出显示 例如 如果它纯粹依赖于主题 或者它内置于主题运行的标准中 但就我而言 使用 PHP 的 HERE 文档和转发存在一些语法突出显示差异斜线 一旦出现正斜杠 ST3 就会认为以下所有
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • 实现一个类似于 Qt 的高性能互斥体

    我有一个多线程科学应用程序 其中多个计算线程 每个核心一个 必须将其结果存储在公共缓冲区中 这就需要互斥机制 工作线程只花费一小部分时间写入缓冲区 因此互斥锁在大多数时间都处于解锁状态 并且锁定很有可能立即成功 而无需等待另一个线程解锁 目
  • SqLite 多核处理

    如何配置 SqLite 3 使用 1 个以上的 CPU 核心来处理单个查询 从3 8 7版本开始 SQLite可以使用多线程对大数据集进行并行排序
  • file_put_contents(C:\xampp\htdocs\instant\storage\framework/sessions/FF): 无法打开流: 没有这样的文件或目录

    我尝试在 Amazon elasticBeanstalk 上上传此实例 但似乎不起作用 我尝试使用 ssh 访问文件但无济于事 i did php artisan config cache and composer dump autoloa
  • 如何动态禁用按钮

    我想动态地使按钮变灰 怎么做 in xaml
  • DTMobileIS 的含义是什么?

    当我使用Instruments工具来监视我的内存使用情况 我发现一个名为DTMobileIS使用了大约 40 的实际内存 然后我的应用程序没有足够的内存 所以它崩溃了 我对此很好奇DTMobileIS意味着 有人知道吗 Edit 这好像是D
  • JavaFX 模块化应用程序,java.lang.module.FindException:未找到模块 javafx.controls(Java 11、Intellij)

    我的模块化 JavaFX 应用程序有问题 我创建了一个 JavaFX 项目并添加了 JavaFX 库 并且 JavaFX 模块得到了识别 但是 我不断收到这些错误消息 Error occurred during initialization
  • UIMA Ruta 使用由某些文本分隔的功能创建注释

    我有一些带有注释的文本 如下所示 wewf werwfwef wewfwefwwew wefewefwff AnnotationA asdfawece aefae eafewfaefa aefafe ceaewfae adfcaecae a
  • Google Chrome 开发工具无法在 Elements Tag 中显示正文内容

    大家都有这样的情况吗 Chrome开发工具Elements标签下 body标签的内容无法显示 唯一的方法是关闭开发工具并重新打开 这是一个 Chrome 错误 在 Canary 中仍然发生 crbug com 829884 https bu
  • ggplot geom_bar 的比例[重复]

    这个问题在这里已经有答案了 使用 ggplot 最简单的方法是什么 与此处相同 我需要调用 prop table 还是有更简单的方法 可重现的示例 x lt c good good bad bad bad bad perfect perfe
  • 无法定位到动态链接库

    我在读取 C 中的文本文件时遇到问题 所以基本上我想使用此代码读取 cmd 上的文本文件 但是会弹出错误 include
  • 如何从内容页使用母版页中的方法

    我正在使用 C 编写 ASP NET 4 应用程序 我有一个母版页 其中有以下方法 public void DisplayMessage string input Label myMessageDisplayer Label FindCon
  • 更改 x 轴上的刻度

    我正在尝试找出 d3 js 定义轴时 如何在 x 轴上获得自定义标签 例如 我得到的默认标签是 20 30 40 50 60 70 80 然而 我想要这样的东西 20 26 32 38 44 50 56 我目前正在学习它并根据官方提供的示例
  • 用线性渐变制作CSS3三角形

    我需要创建一侧带有三角形的按钮 像这样http css tricks com triangle breadcrumbs 具有线性垂直渐变和边框 我想使用纯CSS3 如果我需要45度的 三角形 就可以了 我就这样写 button after
  • 使用循环在rmarkdown中生成一段文本

    我需要生成一份由多个部分组成的报告 所有部分看起来都很相似 只有一些数据差异 部分的数量也取决于数据 我最终想要拥有的是这样的 r section names c A B C section data c 13 14 16 some loo
  • 使用C#登录https站点

    我正在尝试编写一个小程序 用于登录 Verizon 网站 然后检查该月还剩多少分钟 我需要帮助了解如何使用 C 登录该网站 我知道我需要使用 webrequest 来发布登录信息 但我不知道如何去做 带有登录表单的网站是https logi
  • Django 使用整数参数(主键)从模板构建 URL

    我在模板中有这个链接 a href Item 1 a 以及 urls py 中的这个 url url r item P
  • textinputlayout 密码切换图标被阻止

    我不知道如何用文字解释 但让附图来说话吧 基本上 setError 图标挡住了密码切换图标 最初 我认为这是一个简单的布局问题 我尝试了颜色和背景等 但是 经过多次尝试和错误 我似乎找不到问题的解决方案 我将在这里发布我的 XML 供您参考
  • jquery:window.location.reload() 不允许工作 $.post()

    请看看这个脚本 change click function var val new title val if val alert return false else post change title php id id lang lang
  • 如何通过ajax将mysql结果作为json传递

    我不知道如何通过 ajax JSON 将 mysql 查询的结果传递到 html 页面 ajax2 php statement pdo gt prepare SELECT FROM posts WHERE subid IN key2 AND
  • 在 Yii2 中运行行为代码之前获取控制器操作

    我正在尝试在 a 中执行一些代码Yii2控制器 因为我需要模型中的一些代码才能在behaviors部分 以便我可以将模型作为参数传递并避免运行重复的查询 但是我还需要能够找出什么action正在被召唤 但我运气不太好 我尝试过使用befor