ingenerator/kohana-doctrine2

Doctrine ORM 的有见地包装器

v2.0.0 2022-10-28 14:50 UTC

README

[!!] 此包已针对 0.2 系列进行了重大重写

kohana-doctrine2 提供了一个包装器,具有我们喜欢的 Doctrine2 ORM 的有见地配置。虽然该包不试图使 Doctrine2 的每个部分都可用或可配置,但通常可以扩展或配置以调整行为。

特别是

  • 仅支持 PHP 注释实体映射(使用 SimpleAnnotationReader)
  • 默认情况下,您必须指定一个明确的实体类列表,而不是只指定可能包含实体的路径
  • 默认情况下,我们仅公开两个缓存实例 - 一个用于“编译器内容”如类元数据和解析 DQL->SQL 查询,另一个用于“数据内容”如查询结果。编译器缓存在开发中默认为 ArrayCache,在其他环境中为 ApcuCache。除非您指定其他内容,数据缓存始终为 ArrayCache。

安装

运行 composer require ingenerator/kohana-doctrine2。注意,这不再是 kohana 模块,因此您不需要在引导程序中注册它,只要您注册了 Composer 的自动加载器即可。

配置数据库连接

我们从 Kohana::$config 'database' 组中读取数据库信息,结构与遗留核心 Kohana 数据库模块相同。目前我们仅支持 Doctrine 中的 MySQL 后端和 pdo_mysql 驱动程序。

使用默认的 Kohana 配置读取器,您的应用应提供类似于以下 config/database.php

<?php
// application/config/database.php
return [
    'default' => [
        // 'type' => 'MySQL' (this is the default AND we'll throw an exception if you use anything else)
        'connection' => [
            'hostname' => 'localhost',
            'database' => 'mydatabase',
            'username' => 'me',
            'password' => 'sesame',
        ],
        // 'charset'         => 'utf8' (this is the default if not specified)
        // 'timeout_seconds' => 5 (this is the default if not specified)
    ]
];

有时 - 例如,用于单元测试或运行 Doctrine 构建工具 - 您可能没有可用的数据库服务器。如果配置 'hostname' => NULL,我们将使用 NullPDO 驱动程序,以允许 Doctrine 在数据库连接错误时自行引导。

此连接足以运行诸如 orm:generate-proxiesorm:validate-schema --skip-sync 之类的操作。您应该知道,NullPDO 驱动程序报告的 mysql 版本为 5.7.29 - 在编写本文档时,doctrine/dbal 不会在 mysql 5.7.x 和 8.x 之间改变任何 SQL 或列定义,因此此版本与您的运行时 mysql 版本不同不应有问题。如果您的代码执行任何尝试实际进行 PDO 调用的操作,我们将抛出异常。

配置实体和选项

您必须提供应该定义的实体的明确列表。此列表以及任何其他配置都应放在 config/doctrine.php

<?php
// application/config/doctrine.php
return [
    'entity_classes' => [
        \My\Amazing\Entity::class,
        \My\Other\Entity::class,
        \Third\Party\Entity::class,
    ],
    'orm' => [
        // 'auto_gen_proxies' => FALSE, (defaults to TRUE in development, FALSE otherwise)
        // 'proxy_dir         => APPPATH.'/DoctrineEntityProxy',
        // 'proxy_namespace'  => 'DoctrineEntityProxy',
        'custom_types' => [
            // Any custom column types that should be registered when Doctrine is loaded
            'money' => \My\Money\Type::class,
        ]        
    ]
];

配置您的依赖项容器

我们为 ingenerator/kohana-dependencies DI 容器提供绑定。如果您还使用我们的 kohana-extras 包,则您的依赖项配置通常如下所示

<?php
// application/config/dependencies.php
return [
    '_include' => [
        \Ingenerator\KohanaDoctrine\Dependency\DoctrineFactory::definitions(),
    ],
    // Any of your own definitions and overrides
];

这将公开实体管理器作为 doctrine.entity_manager 和原始 PDO 连接作为 doctrine.pdo_connection,以及各种内部助手 - 请参阅 DoctrineFactory::definitions() 方法以探索定义的服务。

您还可以在创建实体管理器时自动绑定事件订阅者

<?php
// application/config/dependencies.php
return [
    '_include' => [
        \Ingenerator\KohanaDoctrine\Dependency\DoctrineFactory::definitions(),
        \Ingenerator\KohanaDoctrine\Dependency\DoctrineFactory::subscriberDefinitions([
            \My\Subscriber::class => ['arguments' => ['%some.service.it.needs%']],
            \My\Other\Subscriber::class => ['arguments' => ['@some.config@']],
        ]),
    ],
    // Any of your own definitions and overrides
];

有关更多信息,请参阅 DoctrineFactory::subscriberDefinitions。

用法

以通常的 Doctrine 方式使用 PHP 注释定义实体类。它们不需要扩展任何特定的基类。您可以将它们放在任何地方,只要它们可以被自动加载。

所有实体类都必须列在 config/doctrine.php 中的 entity_classes 数组中,否则它们将不会被检测以进行模式验证和数据库差异生成。

使用命令行工具

Doctrine 附带了一些命令行工具。要使用它们,您需要提供一个 cli-config.php 文件。

预期你已经将你的应用程序引导代码从 index.php 以及任何 minion 或任务运行器的入口点分离出来,以便 application/bootstrap.php 执行所有设置,包括路径定义等。

<?php
// cli-config.php
use Doctrine\ORM\Tools\Console\ConsoleRunner;

error_reporting(E_ALL);
ini_set('display_errors', 1);
require(__DIR__.'/application/bootstrap.php');

return ConsoleRunner::createHelperSet(\Dependencies::instance()->get('doctrine.entity_manager'));

许可协议

版权所有 (c) 2013 inGenerator Ltd 保留所有权利。

在满足以下条件的情况下,允许重新分发和使用源代码和二进制代码,无论是否修改:

  • 源代码的重新分发必须保留上述版权声明、本条件列表和以下免责声明。
  • 二进制形式的重新分发必须在与分发一起提供的文档或其他材料中复制上述版权声明、本条件列表和以下免责声明。
  • 未经 inGenerator Ltd 事先书面许可,不得使用 inGenerator Ltd 的名称或其贡献者的名称来认可或推广由此软件衍生出的产品。

本软件由版权所有者和贡献者提供,“现状”并附带任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性的保证。在任何情况下,版权所有者或贡献者不应对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论此类损害是由何种原因引起的,无论是在合同、严格责任还是在侵权(包括疏忽或不计后果)的法律理论中,即使已被告知此类损害的可能性。