CakePHP 3.0 ORM - 调试工作,翻转直播,抛出错误

Posted

技术标签:

【中文标题】CakePHP 3.0 ORM - 调试工作,翻转直播,抛出错误【英文标题】:CakePHP 3.0 ORM - debug works, flip to live, throws errors 【发布时间】:2014-10-24 17:06:37 【问题描述】:

我可以在这里使用健全性检查...

我的 Cake3.0 CustomersTable 对象中有一个自定义属性

//客户表

public $paginatorDefaults = [
    'conditions' => [...],
    'contain' => [...]
    ... etc
];

我从全局 API ajax/json 控制器中使用它来读取我可以为每个模型设置的分页

//ApiController -

//Load the components
public $components = [
    'RequestHandler', 
    'Paginator'
];


//Initialize the dynamic table object
public function initialize() 
  parent::initialize();
  //Set tableName
  $this->_tableName = $this->findTable(Inflector::camelize($this->request->model));
  //Instantiate table
  $this->_table = $this->loadModel($this->_tableName);


public function index() 
  $pagination = $this->_pagination(); //Loads the 
  $entities = $this->Paginator->paginate($this->_table->find(), $this->_table->paginatorDefaults);
  $this->set([
    'data' => $entities,
    'request' => $this->request,
    '_serialize' => ['data','request'],
  ]);

在客户端,我通过基于 Angular 的 Ajax 请求调用它,该请求已配置为发送 X-Requested-With 标头以触发 Cake 的 isAjax() 处理,并且我将请求发送到扩展的 .json请求 JSON 数据作为响应的 Cake 路径。

因此,当 Config/app.php debug = true 时,一切正常,tickety-boo - 它正确返回实体数据。但是,如果我将调试切换为 false,我现在会在错误日志中看到 ORM 错误。

错误:[RuntimeException] 表“Cake\ORM\Table”未与“paginatorDefaults”关联

2014-10-24 16:49:44 Error: [RuntimeException] Table "Cake\ORM\Table" is not associated with "paginatorDefaults"
Request URL: /Tremendus/Momento/api/customers.json?sort=Customers.name&direction=asc&limit=10&page=1
Stack Trace:
0 /<masked path>/plugins/Api/src/Controller/ApiController.php(92): Cake\ORM\Table->__get('paginatorDefaul...')
1 /<masked path>/plugins/Api/src/Controller/ApiController.php(78): Api\Controller\ApiController->_pagination()
2 [internal function]: Api\Controller\ApiController->index()
3 /<masked path>/vendor/cakephp/cakephp/src/Controller/Controller.php(411): call_user_func_array(Array, Array)
4 /<masked path>/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(111): Cake\Controller\Controller->invokeAction()
5 /<masked path>/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(85): Cake\Routing\Dispatcher->_invoke(Object(Api\Controller\ApiController))
6 /<masked path>/webroot/index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
7 main

所以,我没有发现为什么我不能在 Table 对象上设置任意属性 - 实际上它在调试中工作正常 - 但为什么当我关闭它时不能呢?

(PS:我已经清除了所有的 app/tmp 缓存文件。)

【问题讨论】:

【参考方案1】:

3.0 中的分页器与 2.0 中的不同。第二个参数并不意味着将选项传递给查询。你有两个选择

$this->paginate = $this->_table->paginatorDefaults

这会将分页器的选项设置为与您为表格存储的选项相同。您也可以使用 find() 为您保留这些默认值:

$this->paginate($this->_table->find('all', $this->_table->paginatorDefaults));

【讨论】:

您好 Jose,感谢您回复我们,我确定您很忙,感谢您抽出宝贵时间。然而这并没有解决问题。实时和调试模式之间仍然存在一些问题。最后,我重构了表类的默认值以使用自定义查找方法 (method = findStandard())。控制器更新为使用 $this->paginate['finder' => 'standard'] 和 $this->paginate($this->_table) - 一切正常,只有在调试打开时才能找到,但只有一个更改 - 调试= off - cake 抛出错误 - “Unknown finder method “standard”” - 但它在 debug = on ... 时有效? 这听起来像是在 debug = false 某种缓存使您的应用程序加载另一个表文件或无法正确找到您的表文件。当 debug = false 时对表对象执行 var_dump() 并验证它是您所期望的 不……没有那么简单。缓存关闭并转储,每次请求都会清除 tmp 文件。结果还是一样。我现在正在挖掘核心库文件。我感觉它是 requestHandler 中的东西,因为它仅在我请求加载 requestHandler 组件的 .json 扩展名时才会这样做。它可能与路由相关......(但即便如此,为什么它会在调试打开而不是调试关闭的情况下工作)我会继续研究它。 何塞,RequestHandler 是否应该从方法或参数中去除 .json 扩展名? (无论 URL 中的最后一个元素是什么)目前,它在调试时按预期执行此操作。但是当调试关闭时它不会这样做。我错过了什么还是预期的行为?我的配置有误吗? 是的,我们最近才发现 .json 错误。修复工作:)

以上是关于CakePHP 3.0 ORM - 调试工作,翻转直播,抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Cake 3.0 中保存 belongsToMany 数据?

cakephp 3.0 - 保存独特的关联

在 CakePHP 3.0 的 add 方法中将附加数据保存到连接表

如何在 cakephp 中使用事务?

CakePHP 3.0 保存我的关联数据

在 CakePHP 3 中为文章添加评论