在子目录CakePHP 3中组织模型

在子目录CakePHP 3中组织模型,cakephp,model-view-controller,cakephp-3.0,Cakephp,Model View Controller,Cakephp 3.0,我们在项目中使用子目录,没有单独的视图和控制器,但是在我们还没有学习的模型中。最近我发现了这一点,实际上我们已经在使用路由和插件,我们只想像这样分离我们的模型: Model -Entity –Financial —Money.php -Table –Financial —MoneyTable.php 我试过这样放,但控制器找不到他的模型。我如何组织它并使它工作 我们尝试过的事情: 使用$this->setAlias('TableModel') 呼叫控制器: $this->TableMod

我们在项目中使用子目录,没有单独的视图和控制器,但是在我们还没有学习的模型中。最近我发现了这一点,实际上我们已经在使用路由和插件,我们只想像这样分离我们的模型:

Model
-Entity
–Financial
—Money.php
-Table
–Financial
—MoneyTable.php
我试过这样放,但控制器找不到他的模型。我如何组织它并使它工作

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

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

不适用于SQL build和其他类。

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

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

bootstrap.php

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

TableRegister::setTableLocator(new MyTableLocator());
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
函数的