使用独立的 CakePHP ORM 时,在哪里定义 table/entity 类?

Where to define table/entity classes when using the standalone CakePHP ORM?

我正在使用 cakephp 的独立子项目 'cakephp-ORM' CakePHP-orm.

我无法在文件系统的文档中找到定义 table 和实体的位置。

解释了如何创建 tables,但没有说明将它们保存到哪里。然后会在自动加载时调用 table 还是您必须自己要求/包含它们? Documentation chapter

提前致谢!

根据 https://book.cakephp.org/3.0/en/orm.html 你所要做的就是从 Cake\ORM\Table 扩展你的 Table 并且只要 table 是自动加载的(即来自作曲家包)或手动加载(即通过包含)它应该被 TableRegistry.

认可

即这个简单的示例 php 文件使用 cake-orm 作为唯一的作曲家依赖项(我的示例手动加载自定义模型):

<?php

include('vendor/autoload.php');

include 'App/Models/Table/ExamplesTable.php';

use Cake\Datasource\ConnectionManager;
use Cake\ORM\TableRegistry;

ConnectionManager::setConfig('default', [
    'className' => 'Cake\Database\Connection',
    'driver' => 'Cake\Database\Driver\Mysql',
    'database' => 'cakephpormtest',
    'username' => 'root',
    'password' => '',
    'cacheMetadata' => false,
    'quoteIdentifiers' => false,
]);

// Now $examples is an array of Cake\ORM\Entity instances.
$examples = TableRegistry::getTableLocator()->get('Examples')->query()->toArray();
var_dump($examples);

我不希望独立库告诉您应该将文件存储在哪里,所以我认为最好的答案是:将 table 模型放在您想要的位置。如何构建项目并加载 类 取决于您。这样做时,我仍然会参考全球编程最佳实践,但仅此而已:)

您可能想创建一个问题 over at GitHub,因为独立使用的文档肯定可以改进。

约定类似于 CakePHP 应用程序的约定

当独立使用时,ORM 将默认在 Model\TableModel\Entity 命名空间中查找 table 和实体 class,并且 table classes 应该使用 Table 后缀。所以使用 $locator->get('Articles') 将查找 \Model\Table\ArticlesTable,如果 table class 存在,相应的实体 class 将被查找为 \Model\Entity\Article .

这些约定与在 CakePHP 应用程序中使用 ORM 时存在的约定几乎相同,除了在 CakePHP 应用程序中通常有一个通过 App.namespace 配置选项配置的基本命名空间。您也可以将它与独立的 ORM 一起使用,即如果您这样做:

\Cake\Core\Configure::write('App.namespace', 'MyApp');

在查找 classes 时,它将被拾取并添加到前面,在上面的示例中,这将是 \MyApp\Model\Table\ArticlesTable\MyApp\Model\Entity\Article。当这样的 classes 不存在时,ORM 将使用所谓的 generic/auto-tables,即 \Cake\ORM\Table\Cake\ORM\Entity 的实例,而不是其具体的子 classes .

自动加载由您决定

将文件放置在文件系统中的什么位置完全取决于您,您只需要确保它们可以通过这些名称自动加载。例如,如果你像这样使用 PSR-4 自动加载:

"autoload": {
    "psr-4": {
        "MyApp\": "src/"
    }
}

那么相应的文件将是 src/Model/Table/ArticlesTable.phpsrc/Model/Entity/Article.php,并且您将如上所示配置基本命名空间。

您可以使用完全限定名称而不是依赖命名约定

也可以对 table 和实体使用 FQN,例如:

$table = $locator->get('Articles', [
    'className' => \Custom\Fully\Qualified\Name\To\ArticlesTable::class
]);

实体和关联的自定义 FQN 可以在各自的 table class:

中设置
namespace Custom\Fully\Qualified\Name\To;

use Cake\ORM\Table;

class ArticlesTable extends Table
{
    public function initialize(array $config)
    {
        $this->setEntityClass(\Custom\Fully\Qualified\Name\To\Article::class);

        $this->hasMany('Comments', [
            'className' => \Custom\Fully\Qualified\Name\To\CommentsTable::class
        ]);
    }
}

所以$table将是\Custom\Fully\Qualified\Name\To\ArticlesTable的实例,查询记录将是return\Custom\Fully\Qualified\Name\To\Article个实例,包含Comments将使用\Custom\Fully\Qualified\Name\To\CommentsTable.

另见

考虑到这一点,您应该能够参考 CakePHP ORM 文档以进一步使用。