如何在cakephp v3中使用自定义函数(业务逻辑)扩展实体类

时间:2016-10-11 07:42:23

标签: cakephp cakephp-3.0

在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”的实体?

3 个答案:

答案 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个选择:

  1. 将我的实体重命名为JobProfit.php
  2. 使用$this->setEntityClass('JobProfits')更新我的Table类