使用独立的 CakePHP ORM 时在哪里定义表/实体类?

mar*_*ius 3 orm cakephp autoload cakephp-3.0 cakephp-3.x

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

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

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

提前致谢!

ndm*_*ndm 5

你可能想在 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');
Run Code Online (Sandbox Code Playgroud)

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

自动加载由您决定

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

"autoload": {
    "psr-4": {
        "MyApp\\": "src/"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

实体和关联的自定义 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
        ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此$table将是 的实例\Custom\Fully\Qualified\Name\To\ArticlesTable,查询记录将返回\Custom\Fully\Qualified\Name\To\Article实例,而包含Comments将使用\Custom\Fully\Qualified\Name\To\CommentsTable.

也可以看看

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