Sylius中如何根据用户数据选择用户角色?

In Sylius, how to choose the user role depending on user data?

在 Sylius(Symfony3 捆绑包)中,我自定义了注册表单以添加一些字段,特别是 'type of account'(专业或私人)。根据类型,某些功能将不会启用。为了做到这一点,我正在考虑给用户不同的角色。

由于身份验证是由 Sylius 完成的,我想知道如何覆盖默认行为以根据类型数据设置角色?

感谢您的帮助!

Sylius 没有 built-in 角色或 rbac 系统 - 整个安全配置是使用标准 Symfony 安全系统完成的。因此,如果您需要根据用户角色区分功能,只需基于 User 模型的 $roles 参数,并使用自定义防火墙覆盖 Sylius 安全配置,如 Symfony tutorial 中所述。希望对您有所帮助 ;)

我做了什么:

在 Sylius 中,注册后会触发一个事件 sylius.customer.post_register。我创建了一个侦听器(在 services.yml 中定义):

app.registration_listener:
        class: AppBundle\EventListener\RegistrationListener
        tags:
            - { name: kernel.event_listener, event: sylius.customer.post_register, method: setUserRole }
        arguments:
            - "@sylius.manager.shop_user"

ShopUserManager 作为参数传递给 setUserRole 方法。

public function __construct(ObjectManager $userManager) {
        $this->userManager = $userManager;
    }

在侦听器中,我将 $user 对象作为事件的 'subject' 获取:

public function setUserRole(GenericEvent $event)
    {
        $customer = $event->getSubject();
        $user = $customer->getUser();
        ....
        $this->userManager->persist($user);
        $this->userManager->flush();
    }

然后我可以修改 $user(添加我的角色)并使用 ShopUserManager 保存它。