在cakephp 3(3.3.5,即)中,我想用自定义函数(业务逻辑)扩展我的实体类。例如:
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Something extends Entity {
public function isFoo() {
return true;
}
}
相应的表对象如下所示:
namespace App\Model\Table;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Cake\ORM\TableRegistry;
use App\Model\Entity\Something; // produces an `unused import' warning
class SomethingsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
...
}
...
}
在控制器中,我使用此代码从数据库中检索实体并调用自定义函数:
class SomeOtherController extends AppController {
...
$this->loadModel('Somethings');
$thing = $this->SomethingsTable->get($id);
if ($thing->isFoo()) { ... }
...
}
然而,这失败了致命错误:
Error: Call to undefined method Cake\ORM\Entity::isFoo()
注意,我做的时候
<?= var_dump($thing,true); ?>
在相应的视图中,$ thing显示为Cake\ORM\Entity
类型。
如何更改表的get()函数以返回具有正确类型“Something”的实体?
答案 0 :(得分:4)
应该是:
$thing = $this->Somethings->get($id);
// not
$thing = $this->SomethingsTable->get($id);
这就是为什么不使用Something
实体,而是使用默认的Entity
类。
CakePHP autotables,因为它找不到SomethingsTable 表使用的默认表类。因此,也加载了默认实体类。 如果你的测试方法包含对db的查询,那么就会抛出一个错误,说somethings_table不存在。
答案 1 :(得分:1)
问题可能在这里:
class SomeOtherController extends AppController {
$this->loadModel('Somethings');
$thing = $this->SomethingsTable->get($id); // <-- Here
if ($thing->isFoo()) { ... }
}
Controller::loadModel
未设置$this->SomethingsTable
(可能已设置在您的代码中的其他位置...),但$this->Somethings
,所以这应该是:
$this->loadModel('Somethings');
$thing = $this->Somethings->get($id);
if ($thing->isFoo()) { }
此代码有效,use App\Model\Entity\Something
中不需要SomethingsTable.php
。
尝试调试此类内容时,请使用debug()
代替var_dump
:
Configure::write('debug', true); // If you are not already in debug mode
$this->loadModel('Somethings');
debug($this->Somethings);
输出:
object(App\Model\Table\SomethingsTable) {
'registryAlias' => 'Somethings',
'table' => 'somethings',
'alias' => 'Somethings',
'entityClass' => 'App\Model\Entity\Something', // Good!
'associations' => [],
'behaviors' => [],
'defaultConnection' => 'default',
'connectionName' => 'default'
}
答案 2 :(得分:0)
这是一篇旧文章,但是我今天遇到了这个问题,对我来说解决方案略有不同。我以正确的方式加载了模型,但是我的类名没有遵循命名约定。
我的表格:JobProfitsTable.php
我的实体:JobProfit s .php(复数)
CakePhp自动寻找名为JobProfit.php的类(单数),并且似乎回退到Cake \ ORM \ Entity
所以我有2个选择:
$this->setEntityClass('JobProfits')
更新我的Table类