【问题标题】:CakePHP: How to access $this->request inside a modelCakePHP:如何在模型中访问 $this->request
【发布时间】:2014-01-15 14:10:41
【问题描述】:

我正在使用 CakePHP v2.4。

在模型的afterSave() 回调中,我想根据请求的条件有条件地做某事。但是$this->request 似乎没有在这里定义:

public function afterSave( $created, $options=array() ) {
    $this->log( $this->request ); //NOTHING HERE
}

我该怎么做?

【问题讨论】:

    标签: php cakephp cakephp-2.0


    【解决方案1】:

    您可以通过全局路由器类访问它。

    public function afterSave( $created, $options=array() ) {
        $this->log( Router::getRequest() );
    }
    

    【讨论】:

    • 你简直把我的袜子吓坏了!
    • 在 Cake 3 中仍然有效;发现这是帮助我将一些事件侦听器从控制器移到更中心位置的答案。由于涉及的抽象级别,提前找到相关的查询字符串信息并将其一直传递并不是一个好的解决方案;控制器无法知道可能会触发哪些事件或事件侦听器可能需要知道什么。
    • 如何获取请求参数表单data部分和文档链接
    【解决方案2】:

    与其在 afterSave() 方法中调用单音 (Router::getRequest()) 并像 Mathew 建议的那样引入紧密耦合,为什么不能将所需的任何参数与您尝试的记录的数据一起传递保存?

    它将出现在 afterSave() 的 $this->data 中。加上这种方式很容易测试。在这个方法中测试 Router::getRequest() 玩得开心。

    如果你需要整个请求,你可以添加一个属性 Model::$request 到 AppModel 和一个方法 setRequest() 那里以及你的控制器 beforeFilter() 你可以做 $this->{$this-> modelClass}->setRequest($this->request);

    【讨论】:

    • +1 好建议。看起来他正在尝试记录一些东西。我建议将该记录代码从模型中移出到 Lib 文件夹,然后在创建记录器对象时传入请求数据,然后将该记录器附加到您的模型。模型不应该关心记录器需要知道当前请求。
    • "在这个方法中测试 Router::getRequest() 很有趣。"我尝试测试它很有趣。使用$this->Model->request = new CakeRequest(); $this->Model->request->data = $this->testData;获取测试中的请求->数据集要容易得多
    猜你喜欢
    • 1970-01-01
    • 2012-05-20
    • 2020-09-14
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多