2017-01-17 10 views
0

Sylius(Symfony3バンドル)では、いくつかのフィールド、特に「アカウントのタイプ」(プロまたはプライベート)を追加するために登録フォームをカスタマイズしました。このタイプに応じて、いくつかの機能は有効になりません。そのために、ユーザーに異なる役割を与えることを考えていました。Syliusでは、ユーザーデータに応じてユーザーの役割を選択する方法は?

認証がSyliusによって行われたため、タイプデータに基づいてロールを設定するデフォルトの動作をオーバーライドする方法は不思議でしたか?

ありがとうございました!

答えて

0

をSyliusでは、登録後に解雇イベントsylius.customer.post_registerがあります。 ShopUserManagerがsetUserRoleメソッドに引数として渡され

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

:私は(services.ymlで定義された)のリスナーを作成しました。リスナーで

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

、私はイベントの「主題」として$ユーザーオブジェクトを取得します:

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

それから私は$ユーザーを変更(私の役割を追加)し、それを保存することができますShopUserManager。

0

Syliusには、組み込みのロールやrbacシステムがありません。セキュリティ設定は、標準のSymfonyセキュリティシステムで行われます。したがって、ユーザーの役割に基づいて機能を区別する必要がある場合はUserモデルの$rolesパラメータをベースにして、Symfony tutorialのようにSyliusのセキュリティ設定をカスタムファイアウォールで上書きします。それに役立つことを願っています。私がやっていること)

+0

Tks Zaleslaw、私は理解していません。ShopUserはSyliusエンティティなので、作成時に自分で定義したロールを与えることができますか? – wyllyjon

+0

はい、 'ShopUser'はエンティティなので、例えばフォームの中で明確に定義された' ChoiceType'フィールドを使って設定できるはずです。デフォルトロールを変更する場合は、アプリ内の「ShopUser」エンティティをオーバーライドする必要があります(デフォルトでは、ROLE_USERロールが1つあります)。 '' $ roles''プロパティを他のプロパティと考えると、そのフィールドをフィールドにしてフォームで選択します; – Zaleslaw

+0

私は理解していませんが、フォームの中で役割を選択したくありませんユーザーによって。私はすでにフォームに 'タイプ'フィールドを持っており、選択した値に応じて、私はユーザーに何らかの役割を与えます。登録フォームでは、使用されるモデルは「顧客」であり、ShopUserは「顧客」属性を有する。私がやったのは、ShopUserをオーバーライドし、setCustomerをオーバーライドし、そのメソッド内で 'type'属性をテストし、 'addRole'を呼び出します。しかし、私はまだデフォルトの役割を持ち、新しい役割は持っていません。自分の役割を正しく追加するために他のどの方法を上書きするか分かりません – wyllyjon

関連する問題