我们在项目中使用子目录没有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构建和其他类。
答案 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
功能。