linio/doctrine-service-provider

适用于Pimple 3的Doctrine DBAL和ORM服务提供者。

0.3.0 2021-01-21 20:03 UTC

README

Latest Stable Version License Build Status Scrutinizer Code Quality

此服务提供者是使用Doctrine在Pimple中的完整解决方案。您可以使用完整的ORM或仅使用DBAL。该项目最初是从dflydev/doctrine-orm-service-provider分支出来的,该分支本身又大量基于核心Doctrine Service Provider@docteurkleindocteurklein/silex-doctrine-service-providers项目上的工作。

也从Doctrine BundleDoctrine Bridge中获取了一些灵感。

变更日志

  • 05-03-2019
    • 更新PHP >=7.1
    • 更新Doctrine缓存类型
  • 20-01-2015
    • 实现了二级缓存
    • 与Doctrine 2.5兼容

安装

推荐通过composer安装。

$ composer require linio/doctrine-service-provider

测试

要运行测试套件,您需要通过composer安装依赖项,然后运行PHPUnit。

$ composer install
$ composer test

使用方法

开始时,您只需注册OrmServiceProvider。此服务提供者期望注册两个服务,dbsdbs.event_manager。您可以自己注册这些服务,或者使用包含的DbalServiceProvider

在这些示例中,将提供一个绑定到默认数据库连接的实体管理器。它将通过orm.em访问。

<?php

use Linio\Doctrine\Provider\OrmServiceProvider;
use Linio\Doctrine\Provider\DbalServiceProvider;
use Pimple\Container;

$container = new Container();

$container->register(new DbalServiceProvider, [
    'db.options' => [
        'driver' => 'pdo_sqlite',
        'path' => '/path/to/sqlite.db',
    ],
]);

$container->register(new OrmServiceProvider, [
    'orm.proxies_dir' => '/path/to/proxies',
    'orm.em.options' => [
        'mappings' => [
            // Using actual filesystem paths
            [
                'type' => 'annotation',
                'namespace' => 'Foo\Entities',
                'path' => __DIR__.'/src/Foo/Entities',
            ],
            [
                'type' => 'xml',
                'namespace' => 'Bat\Entities',
                'path' => __DIR__.'/src/Bat/Resources/mappings',
            ],
        ],
        'resolve_target_entities' => [
            'Rocket\Auth\Model\User' => 'MyProject\Model\Customer',
            'Rocket\Auth\Model\Session' => 'MyProject\Model\Session',
            'Rocket\Auth\Model\OAuthCredentials' => 'MyProject\Model\OAuthCredentials',
            'Rocket\Auth\Model\SessionContext' => 'MyProject\Model\SessionContext',
        ],
    ],
]);

配置

参数

  • orm.em.options:实体管理器选项数组。

    以下选项可用

    • connection(默认:default):定义要使用的数据库连接的字符串。当使用dbs命名数据库时使用。

    • resolve_target_entities:从抽象类或接口到具体实体的解析数组。

      示例配置

        <?php
        $app['orm.ems.default'] = 'sqlite';
        $app['orm.ems.options'] = array(
            'resolve_target_entities' => array(
                'Rocket\Auth\Model\User' => 'MyProject\Model\Customer',
                'Rocket\Auth\Model\Session' => 'MyProject\Model\Session',
                'Rocket\Auth\Model\OAuthCredentials' => 'MyProject\Model\OAuthCredentials',
                'Rocket\Auth\Model\SessionContext' => 'MyProject\Model\SessionContext',
            ),
        );
      
    • mappings:映射定义数组。

      每个映射定义应该是一个包含以下选项的数组

      • type:映射驱动程序类型,可以是annotationxmlymlsimple_xmlsimple_ymlphp之一。

      • namespace:实体所在的命名空间。

      新增:在v1.1中添加了simple_xmlsimple_yml驱动程序类型,它们提供了对Doctrine的简化XML驱动程序简化YAML驱动程序的支持。

      此外,每个映射定义还应包含以下选项之一

      • path:映射文件所在的路径。这应该是一个实际的文件系统路径。对于php驱动程序,它可以是一个路径数组

      • resources_namespace:映射文件所在的路径。例如:Path\To\Foo\Resources\mappings

      每个映射定义都可以有以下可选选项

      • 别名(默认:null):为实体命名空间设置别名。

      每个 注解 映射还可以指定以下选项

      • use_simple_annotation_reader(默认:true):如果设置为 true,则只有简单的注解(如 @Entity)将起作用。如果设置为 false,则更高级的注解和通过 use 的别名将起作用。(示例:use Doctrine\ORM\Mapping AS ORM@ORM\Entity)请注意,如果设置为 false,则可能需要正确配置 AnnotationRegistry 以加载您的注解类。请参阅此常见问题解答:[为什么我的注解类没有被找到?](#user-content-why-arent-my-annotations-classes-being-found "为什么我的注解类没有被找到?")
    • query_cache(默认:由 orm.default_cache 指定的设置):描述查询缓存实现的字符串或数组。

    • metadata_cache(默认:由 orm.default_cache 指定的设置):描述元数据缓存实现的字符串或数组。

    • result_cache(默认:由 orm.default_cache 指定的设置):描述结果缓存实现的字符串或数组。

    • hydration_cache(默认:由 orm.default_cache 指定的设置):描述实体化缓存实现的字符串或数组。

    • types 一个包含自定义类型的数组,格式为 'typeName' => 'Namespace\To\Type\Class'

  • orm.ems.options:按每个实体管理器的名称索引的实体管理器配置集数组。每个值应类似于 orm.em.options

    示例配置

      <?php
      $app['orm.ems.default'] = 'sqlite';
      $app['orm.ems.options'] = array(
          'mysql' => array(
              'connection' => 'mysql',
              'mappings' => array(),
          ),
          'sqlite' => array(
              'connection' => 'sqlite',
              'mappings' => array(),
          ),
      );
    

    示例用法

     <?php
     $emMysql = $app['orm.ems']['mysql'];
     $emSqlite = $app['orm.ems']['sqlite'];
    
  • orm.ems.default(默认:处理的第一個实体管理器):定义默认实体管理器名称的字符串。

  • orm.proxies_dir:定义 Doctrine 生成的代理位置的路徑。

  • orm.proxies_namespace(默认:DoctrineProxy):定义 Doctrine 生成的代理应位于其中的命名空间。

  • orm.auto_generate_proxies:定义是否应自动生成代理。

  • orm.class_metadata_factory_name:类元数据工厂的类名。类实现 Doctrine\Common\Persistence\Mapping\ClassMetadataFactory

  • orm.default_repository_class:默认存储库的类名。类实现 Doctrine\Common\Persistence\ObjectRepository

  • orm.repository_factory:存储库工厂,实例 Doctrine\ORM\Repository\RepositoryFactory

  • orm.entity_listener_resolver:实体监听器解析器,实例 Doctrine\ORM\Mapping\EntityListenerResolver

  • orm.default_cache:描述默认缓存实现的字符串或数组。

  • orm.add_mapping_driver:函数提供向实体管理器添加映射驱动的功能。

    这些参数可用

    • $mappingDriver:要添加的映射驱动,实例 Doctrine\Common\Persistence\Mapping\Driver\MappingDriver

    • $namespace:由 $mappingDriver 映射的命名空间,字符串。

    • $name:要添加映射的实体管理器的名称,字符串,默认 null

  • orm.em_name_from_param:函数提供从参数检索实体管理器名称的功能。

    这有助于在可选的情况下允许用户指定为第三方服务提供程序配置哪个实体管理器,但如果未明确指定,则回退到默认实体管理器。

    例如

      <?php
      $emName = $app['orm.em_name_from_param']('3rdparty.provider.em');
      $em = $app['orm.ems'][$emName];
    

    此代码可以安全地用于第三方服务提供程序内部,无论用户是否已定义 3rdparty.provider.em

  • orm.strategy:

    • naming:命名策略,实例 Doctrine\ORM\Mapping\NamingStrategy

    • quote:引号策略,实例 Doctrine\ORM\Mapping\QuoteStrategy

  • orm.custom.functions:

    • stringnumericdatetime:自定义 DQL 函数,按 DQL 函数名称索引的类名数组。类是 Doctrine\ORM\Query\AST\Functions\FunctionNode 的子类。

    • hydration_modes:实体化器类名,按实体化模式名称索引。类是 Doctrine\ORM\Internal\Hydration\AbstractHydrator 的子类。