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

时间:2018-08-22 11:55:30

标签: cakephp orm cakephp-3.0 autoload cakephp-3.x

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

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

说明了如何创建表,但没有说明将表保存到何处。然后会在自动加载时调用该表,还是必须自己要求/包括它们? Documentation chapter

谢谢!

2 个答案:

答案 0 :(得分:3)

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

约定类似于CakePHP应用的约定

当独立使用时,ORM默认情况下将在Model\TableModel\Entity名称空间中查找表和实体类,并且表类将使用后缀Table。因此,使用$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\ArticlesTable\MyApp\Model\Entity\Article。当此类不存在时,ORM将使用所谓的通用/自动表,即\Cake\ORM\Table\Cake\ORM\Entity的实例,而不是其具体子类。

自动加载由您决定

将文件放置在文件系统中的位置完全由您决定,您只需要确保可以通过这些名称自动加载即可。例如,如果您使用PSR-4自动加载,如下所示:

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

然后相应的文件分别为src/Model/Table/ArticlesTable.phpsrc/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文档以进一步使用。

答案 1 :(得分:1)

根据 https://book.cakephp.org/3.0/en/orm.html 您要做的就是从Cake\ORM\Table扩展表,并且只要表是自动加载的(即来自composer软件包)或手动加载的(即通过include),它就应该被{{1}识别}。

即使用TableRegistry作为唯一的作曲者依赖项的简单示例php文件(我的示例手动加载了自定义模型):

cake-orm

我不希望独立库告诉您应该在哪里存储文件,所以我认为最好的答案是:将表模型放在所需的位置。如何构造项目和加载类取决于您自己。在执行此操作时,我仍然会参考编程中的全局最佳实践,仅此而已:)