在子目录CakePHP 3中组织模型

时间:2017-12-08 15:48:31

标签: cakephp model-view-controller cakephp-3.0

我们在项目中使用子目录没有separete视图和控制器,但在模型中我们还没有学习。最近我发现了这个https://github.com/cakephp/cakephp/issues/60451以及我们已经使用的实际路由和插件,我们只是想像这样分离我们的模型:

Model
-Entity
–Financial
—Money.php
-Table
–Financial
—MoneyTable.php

我试过像这样,然后控制器无法找到他的模型。我该如何组织它并使其有效?

我们尝试过的事情: 使用$this->setAlias('TableModel'); 呼叫控制器:

$this->TableModel = $this->loadModel('Subfolder/TableModel'); 

不适用于SQL构建和其他类。

1 个答案:

答案 0 :(得分:2)

CakePHP使用TableRegister加载模型。该类可以配置为使用实现LocatorInterface的类,CakePHP使用TableLocator作为默认值。

您唯一能做的就是在LocatorInterface中配置自己的bootstrap.php个实例。您必须创建MyTableLocator并将其更改为表的className以指向子目录。使用此类名称重写的规则完全取决于您。

<强> bootstrap.php中

TableRegister::setTableLocator(new MyTableLocator());

<强> MyTableLocator.php

class MyTableLocator extends TableLocator {
    protected function _getClassName($alias, array $options = [])
    {
       if($alias === 'Subfolder/TableModel') {
           return TableModel::class;
       }
       return parent::_getClassName($alias, $options);
    }
}

以上不是工作代码。

我只是展示你需要覆盖的功能,以及你需要逻辑来返回不同的类名。

您可以检查$alias是否包含/字符,如果是,通过从$alias中提取子文件夹名称来返回类名。请查看TableLocator,了解它如何使用App::className功能。