首页 > 解决方案 > 使用独立 CakePHP ORM 时在哪里定义表/实体类?

问题描述

我正在使用 cakephp CakePHP-orm的独立子项目“cakephp-ORM” 。

我在文档中找不到在文件系统上定义表和实体的位置。

它解释了如何创建表,但没有将它们保存到哪里。然后会在自动加载时调用该表,还是您必须自己要求/包含它们?文档章节

提前致谢!

标签: cakephpormcakephp-3.0autoloadcakephp-3.x

解决方案


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

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

单独使用时,ORM 默认会在Model\TableandModel\Entity命名空间中查找表和实体类,并且表类应该使用Table后缀。所以 using$locator->get('Articles')会查找\Model\Table\ArticlesTable,如果存在这样的表类,则会查找相应的实体类为\Model\Entity\Article

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

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

鉴于上面的示例,它将在查找类时被拾取并添加到前面,这将是\MyApp\Model\Table\ArticlesTableand \MyApp\Model\Entity\Article。当此类类不存在时,ORM 将使用所谓的泛型/自动表,即实例\Cake\ORM\Table\Cake\ORM\Entity不是其具体子类。

自动加载由您决定

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

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

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

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

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

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

实体和关联的自定义 FQN 可以在相应的表类中设置:

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,查询记录将返回\Custom\Fully\Qualified\Name\To\Article实例,包含Comments将使用\Custom\Fully\Qualified\Name\To\CommentsTable.

也可以看看

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


推荐阅读