【问题标题】:Organize Models in subdirectories CakePHP 3在子目录中组织模型 CakePHP 3
【发布时间】:2017-12-08 15:48:30
【问题描述】:
我们在项目中使用子目录,没有单独的视图和控制器,但在我们尚未学习的模型中。最近我发现了这个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 构建和其他类。
【问题讨论】:
标签:
cakephp
model-view-controller
cakephp-3.0
【解决方案1】:
CakePHP 使用TableRegister 来加载模型。该类可以配置为使用实现LocatorInterface 的类,CakePHP 使用TableLocator 作为默认值。
您唯一能做的就是在您的bootstrap.php 中配置您自己的LocatorInterface 实例。您必须创建 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 函数的。