【问题标题】:cakephp 2 $this->Model not setcakephp 2 $this->模型未设置
【发布时间】:2013-09-04 14:03:11
【问题描述】:

我正在开发 Cake 2.4,如果我在控制器中调试 $this,则 $this->Model 未设置但应该设置。

控制器:CustomersController(.php)

型号:CustomerModel(.php)

由于命名约定是正确的,我不知道问题出在哪里。

相关代码:

Customer.php:

<?php

class Customer extends Shop {
   public $validate = array(/* ... */);
   protected $_schema = array(/* ... */);

   public function beforeSave($options = array()) {
      parent::beforeSave($options);
   }
}


CustomersController.php:

<?php
App::uses('ShopsController', 'Controller');
class CustomersController extends ShopsController {

  public function beforeFilter() {
    $this->Auth->allow('login');
    parent::beforeFilter();
  }
}

【问题讨论】:

  • 只需粘贴您为上述文件声明类名的方式
  • 如果模型名称遵循约定(控制器名称的单数),则不需要$uses。
  • 您的 beforeFilter() 方法有缺陷:您没有调用父级,因此该控制器中不会出现任何其他设置,很可能是 Auth。

标签: php cakephp cakephp-model cakephp-2.4


【解决方案1】:

您的模型文件名错误。它应该是没有“型号”后缀的“客户”。只有这样,它才会自动加载并在您的控制器中作为 $this->Customer 可用。

编辑:出于某种原因(为什么?),您扩展的不是 AppModel 而是 ShopModel,因此请在您的 Customer 模型中尝试此操作:

public $name = 'Customer';
public $useTable = 'customers';

当您继承控制器或模型时,CakePHP 不会正确合并/更新所有属性。

【讨论】:

  • 嗯..你确定吗? AppModel 在类名中具有模型后缀
  • 定义无效。如果您是程序员,您应该知道“不工作”是一个不充分的问题报告。是的,我确定。因为默认模型是根据控制器名称加载的,如果没有加载,则 Inflector 会对其进行单一化处理。还有为什么要扩展 ShopModel 和 ShopController 而不是 AppController 和 AppModel?
  • 不工作意味着它不能解决所描述的问题,但对我搜索 $this->Customer 没有其他影响
  • 再次:你得到的确切错误信息是什么?我不在乎你的解释是什么,我想知道 php 抛出的错误/通知。你现在明白了吗?并显示整个相关代码,而不仅仅是您现在拥有的部分。
  • 没有错误消息 - 如果是这样我会写它.. 哇.. 只是阅读并得到没有 $this->Customer,所以模型没有加载到 $this..没有错误消息,但我想你可以想象我可能需要能够调用模型回调,而我目前没有。
【解决方案2】:

模型文件名应该是Customer.php,不要将model附加到您的模型名称中,在您的Customer.php中这样做

<?php

class Customer extends ShopModel {
   // ...
}

【讨论】:

  • 没有修复它.. no $this->Customer
  • 扩展 Shop 或扩展 ShopModel??
  • 应该是shopmodel,控制器名用复数形式,我觉得这里应该是shop controller而不是shopcontroller
  • 您是否遵守约定?检查here
  • 是的,复数控制器名称,单数模型名称;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多