在子目录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
函数的