使用独立的 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\Table
和 Model\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.php
和 src/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 文档以进一步使用。
我正在使用 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\Table
和 Model\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.php
和 src/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 文档以进一步使用。