我正在使用cakephp的独立子项目“ cakephp-ORM” CakePHP-orm。
我在文档中找不到文件系统上定义表和实体的位置。
说明了如何创建表,但没有说明将表保存到何处。然后会在自动加载时调用该表,还是必须自己要求/包括它们? Documentation chapter
谢谢!
答案 0 :(得分:3)
您可能想创建一个问题over at GitHub,因为肯定可以改进独立使用的文档。
当独立使用时,ORM默认情况下将在Model\Table
和Model\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.php
和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文档以进一步使用。
答案 1 :(得分:1)
根据
https://book.cakephp.org/3.0/en/orm.html
您要做的就是从Cake\ORM\Table
扩展表,并且只要表是自动加载的(即来自composer软件包)或手动加载的(即通过include),它就应该被{{1}识别}。
即使用TableRegistry
作为唯一的作曲者依赖项的简单示例php文件(我的示例手动加载了自定义模型):
cake-orm
我不希望独立库告诉您应该在哪里存储文件,所以我认为最好的答案是:将表模型放在所需的位置。如何构造项目和加载类取决于您自己。在执行此操作时,我仍然会参考编程中的全局最佳实践,仅此而已:)