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

问题描述

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

我做了什么:

  1. 烘焙模型

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

检测到关联的片刻。

历史烘焙课...

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

为历史烘焙实体类...

创建文件/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 完成

  1. 通过 $this->addplugin('Data');

    加载了新创建的插件
  2. 已验证插件已通过 bin/cake plugin loaded

    加载
  3. 已确认 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 $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';
        }
    }
    
  4. Added the plugin model 到任意控制器方法

    • 要么$this->loadModel('Data.History');
    • TableRegistry::getTableLocator()->get('Data.History');
  5. 得到错误

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

我尝试了什么:

  • 我查看了 CORE/src/ORM/Locator/TableLocator.PHP,我可以记录 _getClassName receives Data.History,但返回 null。我还记录了它循环通过的 $this->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。

解决方法

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

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

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

然后你转储自动加载器:

composer dumpautoload

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

另见

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...