【问题标题】:CakePHP 2.1 enters infinite loop when saving a recordCakePHP 2.1 保存记录时进入无限循环
【发布时间】:2012-03-25 06:03:00
【问题描述】:

这个问题可能听起来很奇怪,确实如此。问题是:我有一个模型FollowingStationLine,以及它对应的表following_station_lines。在模型中,我试图用$this->save(array('field' => 'value)); 保存记录。当我点击相应的页面时,该方法似乎在无限循环中调用(我在保存语句之前和之后放置了一些debug()s),并且仅在达到内存限制时才结束。我什至尝试了 2GB 内存,但仍然是同样的问题。

当从另一个控制器调用方法时也会发生这种情况,而不是FollowingStationLinesController。除了这个之外,所有其他模型/表格都按预期工作。我真的无法想象有什么问题。以下是控制器的代码,分别是模型:

控制器:

    App::uses('AppController', 'Controller');

    class FollowingStationLinesController extends AppController {

    public function admin_set() {
        $this->FollowingStationLine->set(array(1));
    }

}

型号:

App::uses('AppModel', 'Model');

class FollowingStationLine extends AppModel {
    public function set($lineIds = array()){
        if(!is_array($lineIds)){
            return false;   
        }
        $save = array();
        $save[] = array('station_id' => 45);
        debug($save[0]);
        $this->save($save[0]);
    }
  }

任何帮助将不胜感激!

【问题讨论】:

    标签: cakephp save cakephp-2.1


    【解决方案1】:

    CakePHP 的 AppModel 类有一个名为“set”的函数,该函数由模型的“save”函数调用。通过覆盖 'set',您会导致这两种方法之间出现循环。

    将您的函数重命名为其他名称,您应该没问题。

    您可以查看 AppModel 源以获取更多信息:https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Model.php


    更新:

    @mark 做了一个很好的评论,如果你的 PHP 配置包含错误报告模式 E_STRICT,你会收到一个错误的覆盖签名不匹配的错误。

    更多信息来设置你的配置:http://php.net/manual/en/migrating5.errorrep.php

    【讨论】:

    • 哦,我的...非常令人沮丧,被困了几天...谢谢您的宝贵提示。没有意识到我正在覆盖 Cake 的方法。
    • @linkyndy 如有疑问,请前往源头! :)
    • 知道,但错过了覆盖方法的可能性。经验教训:)
    • 提示:在 E_STRICT 模式下开发会在此处引发错误(因为您在此处使用一组不同的参数覆盖方法)
    猜你喜欢
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多