关于FOSUserBundle的用户管理服务

原文地址http://symfony.com/doc/current/bundles/FOSUserBundle/user_manager.html

所有用户操作都实现了FOS\UserBundle\Model\UserManagerInterface接口, 从而实现了与存储方式的分离. 使用这个接口可以确保你能够随意的改变存储方式. FOSUserBundle提供的默认控制器使用的是配置中的用户管理, 而不是直接调用的数据存储层.

如果将db_driver配置为orm, 这个服务则为FOS\UserBundle\Doctrine\UserManager的实例.

如果将db_driver配置为mongodb, 这个服务则为FOS\UserBundle\Doctrine\UserManager的实例.

如果将db_driver配置为couchdb, 这个服务则为FOS\UserBundle\Doctrine\UserManager的实例.

如果将db_driver配置为propel, 这个服务则为FOS\UserBundle\Propel\UserManager的实例.

调用用户管理服务

用户管理是作为fos_user.user_manager服务在容器中使用的.

1
$userManager = $container->get('fos_user.user_manager');

创建一个新用户

可以使用用户管理来创建一个用户类的实例.

1
$user = $userManager->createUser();

$user则为用户类的一个实例.

如果你的构造函数中强制了一些参数, 这个方法会变得不可用.

检索用户

用户管理服务有一些基于唯一字段(用户名, 电子邮件, 已验证的token)的查询方法和一个提取已有用户的方法.

  • findUserByUsername($username)
  • findUserByEmail($email)
  • findUserByUsernameOrEmail($value)
  • findUserByConfirmationToken($token)
  • findUserBy(array('id'=>$id))
  • findUsers()

你可以使用用户服务中的updateUser方法来保存用户对象. 这个方法会更新编码后的密码以及一些常用字段, 然后保存.

更新用户对象

1
2
3
4
5
$user = $userManager->createUser();
$user->setUsername('John');
$user->setEmail('john.doe@example.com');

$userManager->updateUser($user);

FOSUserBundle在程序中自带一个Doctrine监听器来处理密码以及常用字段的更新. 假如你始终使用用户管理服务来保存用户, 你也许会想禁用这个监听器来提高应用的性能.

# app/config/config.yml
fos_user:
    # ...
   use_listener: false

Propel实现中没有添加此监听器, 所以你需要调用用户管理服务中的方法来保存用户信息.

对于Doctrine实现, 当在请求updateUser方法时, 默认的行为会去刷新工作单元. 你可以添加一个false参数来禁止刷新. 这相当于请求updateCanonicalFieldsupdatePassword方法.

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MainController extends Controller
{
public function updateAction($id)
{
$user = // get a user from the datastore

$user->setEmail($newEmail);

$this->get('fos_user.user_manager')->updateUser($user, false);

// make more modifications to the database

$this->getDoctrine()->getManager()->flush();
}
}

重写用户管理服务

你可以配置一个实现了FOS\UserBundle\Model\UserManagerInterface接口的服务来替代默认的用户管理服务. 默认实现的id为fos_user.user_manager.default.

1
2
3
4
fos_user:
# ...
service:
user_manager: custom_user_manager_id

自定义的实现可以继承FOS\UserBundle\Model\UserManager从而复用现成逻辑.

整合SecurityBundle

FOSUserBundle在UserManagerInterface顶部提供了一些Symfony\Component\Security\Core\UserProviderInterface的实现.

虽然框架內建的用户管理服务也实现了Symfony\Component\Security\Core\User\UserProviderInterface, 使用这个实现作为用户生成器已经过时了并且将在将来的版本中移除.
请使用FOS\UserBundle\Security\UserProvider来替换它.