bravo3/orm-bundle

Bravo3 ORM 的 Symfony 3 扩展包

0.5.3 2015-12-07 00:19 UTC

README

此扩展包将为 Symfony 3 应用程序添加以下支持

  • ORM 实体管理器服务
  • 使用实体管理器的用户提供者
  • 帮助用户认证(登录、注销等)的服务
  • 使用实体管理器存储会话的会话处理器

入门

配置

首先在您的 AppKernel.php 中注册此扩展包

new Bravo3\OrmBundle\OrmBundle(),

然后在您的 config.yml 文件中添加一些配置

# Bravo3 ORM Configuration
orm:
    params:
        host: %db_host%
        port: %db_port%
        database: %db_database%
    user_class: AppBundle\Entity\User
    auth_firewall: main
    user_roles: [ ROLE_USER, ROLE_ADMIN, ROLE_SUPERADMIN ]

同时,在您的 parameters.yml.dist 文件中添加一些默认参数

parameters:
    db_host: localhost
    db_port: 6379
    db_database: 0

现在您可以使用服务 'orm.em' 通过实体管理器,但您需要配置更多以进行会话和用户管理。

会话

要启用 ORM 会话处理器,只需在您的 config.yml 中设置服务器

framework:
    session:
        handler_id: orm.session_handler
        gc_probability: 0

由于实体管理器通过实体的 TTL 过期会话,因此您不需要运行垃圾回收器来清理旧会话。

默认情况下,会话在 3600 秒(1 小时)后过期 - 要更改会话 TTL,请向 ORM 配置添加会话参数

orm:
    session:
        ttl: 60 # 1 minute

如果您有理由这样做,您还可以更改实体管理器使用的实体类

orm:
    session:
        ttl: 3600
        entity: SomeNamespace\Session

您的实体类必须实现 Bravo3\OrmBundle\Entity\SessionInterface 接口。

用户认证

为了使用户认证正常工作,您需要在 security.yml 文件中设置 orm.user_provider 并设置您的编码器。以下是一个示例 security.yml 文件

security:
    encoders:
        Bravo3\OrmBundle\Entity\User: sha512

    providers:
        main:
            id: orm.user_provider

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            anonymous: ~
            pattern:   ^/
            form_login:
                login_path: /login

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        - { path: ^/account, roles: ROLE_USER, requires_channel: https }

请记住,您的安全令牌设置在当前的防火墙中,因此设置一个具有访问控制参数的全局匿名防火墙可能更容易。

尽管 security.yml 文件可能指定 Bravo3\OrmBundle\Entity\User 类作为编码器,但您不需要使用此类作为您的用户类。您的用户类应该扩展 OrmBundle 用户类。您可以在 ORM 配置中更改用户类

orm:
    user_class: SomeNamespace\User

用户认证

默认情况下,如果您使用 Symfony 的防火墙拦截表单登录,安全令牌将包含用户实体并将其序列化在用户会话中。但是,大多数 ORM 不返回实际的用户实体,而是返回该实体的代理。这意味着您的会话中的序列化对象现在是一个代理。

这会产生一些开销,现在您在会话中有大量的序列化信息,但您还需要反序列化一个代理。代理类不遵守 PSR 标准,实际上,文件系统上可能甚至没有代理的副本。要反序列化实体,您需要启动另一个自动加载器来加载代理缓存或重新生成代理。这是 Doctrine 扩展包处理序列化用户实体的方式。

ORM 扩展包不包括启动的自动加载器。相反,它提供了一个安全管理者服务,该服务将为您创建安全令牌并登录/注销用户。当它创建令牌时,它只存储用户名,而不是完整的用户实体。这使得您的会话变得不那么复杂,并且不需要第二个自动加载器。

要测试凭据、获取令牌、用户对象或登录/注销用户,请使用 orm.security_manager 服务。

用户命令

包含创建和删除用户、更改其密码和角色的控制台命令。这些命令在 'user:' 命名空间中注册。

app/console user:create

命令提供的用户角色列表可以在 orm.user_roles 配置中配置

orm:
    user_roles: [ ROLE_USER, ROLE_AWESOME ]

服务标签

您可以通过为服务添加 orm.event_subscriber 标签来将订阅者添加到EntityManager的事件分发器。

导出器

所有导出器都需要一个YAML文件,该文件列出了您的实体位置,这是一个简单的列表,格式如下:

- { path: src/Bravo3/OrmBundle/Entity, namespace: Bravo3\OrmBundle\Entity }
- { path: src/MyStuff/MyBundle/Entity, namespace: MyStuff\MyBundle\Entity }

这是导出命令需要包含的所有文件内容,以便定位所有您的实体。

映射导出

您可以使用映射导出器将默认实体映射导出为其他格式,如YAML。

bin/console orm:map:export --list=entities.yml --format=yaml

entities.yml 需要按照上述格式是一个实体列表。默认情况下,这将创建一个新映射文件 app/config/entity_map.yml - 此路径定义在您的服务配置中。

注意:运行此命令将覆盖现有的映射文件。

数据库导出

您可以从任何驱动器导入和导出数据库。这是通过ORM的 Porter 服务完成的,但是捆绑包包括用于快速将实体列表导出到文件系统驱动的命令。

bin/console orm:export -l entities.yml -o ~/backup.ormdb

这将把您的配置数据库导出到一个单一的tar文件中,该文件可以用来再次导入。

bin/console orm:import -l entities.yml -i ~/backup.ormdb

将恢复备份到主数据库。这将用相同的ID覆盖现有实体,但不会删除主数据库中不存在于导入源中的内容。

注意:导出文件被视为数据库,如果它已经包含数据,则这些数据将不会被清除。