bravo3 / orm-bundle
Bravo3 ORM 的 Symfony 3 扩展包
Requires
- php: >=5.5.0
- bravo3/orm: ^0.5.7
Requires (Dev)
- phpunit/phpunit: >=5.0
- predis/predis: ^1.0
- symfony/symfony: ^3.0
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覆盖现有实体,但不会删除主数据库中不存在于导入源中的内容。
注意:导出文件被视为数据库,如果它已经包含数据,则这些数据将不会被清除。