问题描述
我将模型烘焙到插件中,但无法加载。
我做了什么:
-
烘焙模型
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
完成
-
通过
加载了新创建的插件$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 $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->loadModel('Data.History');
, - 或
TableRegistry::getTableLocator()->get('Data.History');
- 要么
-
得到错误:
无法找到别名 Data.History 的表类。 Cake\ORM\Exception\MissingTableClassException CORE/src/ORM/Locator/TableLocator.PHP:245
我尝试了什么:
-
我查看了
CORE/src/ORM/Locator/TableLocator.PHP
,我可以记录_getClassName
receivesData.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
,如果您允许,它会相应地更新它并转储自动加载器。
另见