【问题标题】: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 函数的。

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      相关资源
      最近更新 更多