加载烘焙插件模型失败,并显示“找不到别名 Data.History 的表类”

Posted

技术标签:

【中文标题】加载烘焙插件模型失败,并显示“找不到别名 Data.History 的表类”【英文标题】:Loading a baked Plugin Model fails with "Table class for alias Data.History could not be found" 【发布时间】:2021-06-17 06:51:02 【问题描述】:

我将模型烘焙到插件中,但无法加载。

我做了什么:

    烘焙模型

    bin/cake bake model History --connection data --plugin Data --no-rules --no-validation --table elements_history
    

检测到关联的瞬间。

History 的烘焙表类...

创建文件 /var/www/app/plugins/Data/src/Model/Table/HistoryTable.php 写了/var/www/app/plugins/Data/src/Model/Table/HistoryTable.php

为 History 烘焙实体类...

创建文件 /var/www/app/plugins/Data/src/Model/Entity/History.php 写了/var/www/app/plugins/Data/src/Model/Entity/History.php

为历史烘焙测试夹具...

创建文件 /var/www/app/plugins/Data/tests/Fixture/HistoryFixture.php 写了/var/www/app/plugins/Data/tests/Fixture/HistoryFixture.php Bake 正在检测可能的固定装置...

为 Data\Model\Table\HistoryTable 烘焙测试用例 ...

创建文件 /var/www/app/plugins/Data/tests/TestCase/Model/Table/HistoryTableTest.php 写了/var/www/app/plugins/Data/tests/TestCase/Model/Table/HistoryTableTest.php 完成

    通过$this->addPlugin('Data');加载了新创建的插件

    验证插件是通过bin/cake plugin loaded加载的

    确认plugins/Data/src/Model/Table/HistoryTable.php存在

    root@debian:/var/www/app# cat plugins/Data/src/Model/Table/HistoryTable.php
    <?php
    declare(strict_types=1);
    
    namespace Data\Model\Table;
    
    use Cake\ORM\Query;
    use Cake\ORM\RulesChecker;
    use Cake\ORM\Table;
    use Cake\Validation\Validator;
    
    /**
     * History Model
     *
     * @method \Data\Model\Entity\History newEmptyEntity()
     * @method \Data\Model\Entity\History newEntity(array $data, array $options = [])
     * @method \Data\Model\Entity\History[] newEntities(array $data, array $options = [])
     * @method \Data\Model\Entity\History get($primaryKey, $options = [])
     * @method \Data\Model\Entity\History findOrCreate($search, ?callable $callback = null, $options = [])
     * @method \Data\Model\Entity\History patchEntity(\Cake\Datasource\EntityInterface $entity, array $data, array $options = [])
     * @method \Data\Model\Entity\History[] patchEntities(iterable $entities, array $data, array $options = [])
     * @method \Data\Model\Entity\History|false save(\Cake\Datasource\EntityInterface $entity, $options = [])
     * @method \Data\Model\Entity\History saveOrFail(\Cake\Datasource\EntityInterface $entity, $options = [])
     * @method \Data\Model\Entity\History[]|\Cake\Datasource\ResultSetInterface|false saveMany(iterable $entities, $options = [])
     * @method \Data\Model\Entity\History[]|\Cake\Datasource\ResultSetInterface saveManyOrFail(iterable $entities, $options = [])
     * @method \Data\Model\Entity\History[]|\Cake\Datasource\ResultSetInterface|false deleteMany(iterable $entities, $options = [])
     * @method \Data\Model\Entity\History[]|\Cake\Datasource\ResultSetInterface deleteManyOrFail(iterable $entities, $options = [])
     *
     * @mixin \Cake\ORM\Behavior\TimestampBehavior
     */
    class HistoryTable extends Table
    
        /**
         * Initialize method
         *
         * @param array $config The configuration for the Table.
         * @return void
         */
        public function initialize(array $config): void
        
            parent::initialize($config);
    
            $this->setTable('elements_history');
            $this->setDisplayField('id');
            $this->setPrimaryKey('id');
    
            $this->addBehavior('Timestamp');
    
        
    
        /**
         * Returns the database connection name to use by default.
         *
         * @return string
         */
        public static function defaultConnectionName(): string
        
            return 'data';
        
    
    

    Added the plugin model 到任意控制器方法:

    $this-&gt;loadModel('Data.History');, 或TableRegistry::getTableLocator()-&gt;get('Data.History');

    得到错误:

找不到别名 Data.History 的表类。 Cake\ORM\Exception\MissingTableClassException CORE/src/ORM/Locator/TableLocator.php:245

我尝试了什么:

我查看了CORE/src/ORM/Locator/TableLocator.php,我可以记录_getClassNamereceivesData.History,但返回null。我还记录了循环通过的$this-&gt;locations,插件路径不存在:

Array
(
    [0] => Model/Table
)

debug 添加到CORE/src/Core/App.php right before 它运行\Model\Table\HistoryTable_classExistsInBase 的测试。

debug([
    '$plugin' => $plugin,
    '$name' => $name,
    '$base' => $base,
    '$fullname' => $fullname,
    '_classExistsInBase' => static::_classExistsInBase($fullname, $base),
]);
CORE/src/Core/App.php (line 70)
[
'$plugin' => 'Data',
'$name' => 'History',
'$base' => 'Data',
'$fullname' => '\Model\Table\HistoryTable',
'_classExistsInBase' => false,
]

您知道是什么问题以及如何解决吗?我正在使用 CakePHP 4.2.4 和 Bake 2。

【问题讨论】:

遇到此类问题请不要乱用名字,不管你多么确定自己没有弄错,还是有可能的,这里的人只会浪费他们的时间。 您是否为该插件使用了默认连接以外的连接? @ndm 好的,没问题,我已经用从控制台复制的真实数据编辑了问题 @Salines 是的,它使用不同的数据源,我已经粘贴了HistoryTable 源,它有一个defaultConnectionName 方法 插件的命名空间是否正确映射到您的composer.json,并且自动加载器会相应地转储? 【参考方案1】:

如果是手动创建的插件,您需要确保相应地更新 composer.json 的自动加载器配置并转储自动加载器,否则无法找到您的插件类。

对于您本地的 Data 插件,看起来像这样:


    // ...
    "autoload": 
        "psr-4": 
            // ...
            "Data\\": "plugins/Data/src/"
        
    ,
    "autoload-dev": 
        "psr-4": 
            // ...
            "Data\\Test\\": "plugins/Data/tests/"
        
    

然后你转储自动加载器:

composer dumpautoload

如果您使用 bake 创建插件,它会询问您是否应该修改您的 composer.json,如果您允许,它会相应地更新它并转储自动加载器。

另见

Cookbook > Plugins > Manually Autoloading Plugin Classes Cookbook > Plugins > Creating Your Own Plugins > Creating a Plugin Using Bake

【讨论】:

以上是关于加载烘焙插件模型失败,并显示“找不到别名 Data.History 的表类”的主要内容,如果未能解决你的问题,请参考以下文章

使用关联和烘焙蛋糕时如何显示除 id 以外的其他字段

3dmax 2014加载panda3d插件失败

纹理烘焙

sonar自定义规则开发完并加载之后,为啥sonar只显示,扫描的时候扫描不出来

统一烘焙光照贴图时出现奇怪的伪影

unity下载模型到本地并加载