2012-05-04 57 views
5

我對Symfony2完全陌生,但已經愛上了這個框架。Symfony2:如何使用FOSUserBundle創建多個註冊表格

我有一個項目,需要有3種不同的用戶類型。

一個是超級管理員,另外兩個將是一個普通用戶,但具有不同的配置文件佈局。配置文件的不同佈局意味着這兩種用戶類型的註冊表單在註冊後必須具有不同的表單域和不同的佈局。

我想我有這個想法(不知道以後會不會好)如何在註冊後管理用戶。但現在我不明白如何建立兩個不同的註冊表格,這些註冊表格將從FOSUserBundle擴展而來。

據我明白FOSUB有在登記已經建立,且不能有多個「登記」的結構只有一個點

在config.yml我有:

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: Company\UserBundle\Entity\User 
    registration: 
     confirmation: { enabled: true } 

安全.yml:

security: 
    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      csrf_provider: form.csrf_provider 
     logout:  true 
     anonymous: true 

我的想法是創建一個擴展FOSUB三種不同的捆綁,但文件說,只有一個包可以聲明FOSUB如父。

另一個選項(來自文檔)是擴展ContainerAware實現所有原始方法。但即使在這種情況下,我也不明白爲什麼我必須配置app/config/{config | security | routing} .yml來獲得將使用FOSUB和我的自定義窗體的實例/ register_employee,/ register_manager鏈接?

請指點我正確的方向。 謝謝。

回答

4

FOSUserBundle不是提供用戶身份驗證,而是管理用戶。該軟件包爲您提供了一個更好的結構來管理應用程序的用戶。如果您查看代碼,您會發現用於默認註冊和其他用戶活動的控制器。

理想情況下,您會希望編寫自己的控制器並使用該包來僅存儲和檢索用戶。當您想要管理多個註冊/登錄表單時,這是特別需要的。

一旦您開始考慮FOSUserBundle只管理用戶並且不進行身份驗證/註冊,情況就會變得更加清晰。

您可能還想看看https://github.com/sonata-project/SonataUserBundle,它提供了SonataAdminBundle和FOSUserBundle之間的集成。

+0

是的,我已經實施了我自己的註冊版本。它僅用於註冊用戶,用於其他功能:提醒,激活......我使用標準的FOSUB實現。 –

5

是的,它是可行的。但這將是一個複雜的過程。你可以做以下的(我沒有帶自己的嘗試,雖然:))

  • 創建像/register/{type}一個路由模式,並相應修改registerAction。查看this文檔以覆蓋控制器。

  • registerAction方法創建一個空白User實體並從路由參數設置類型。然後致電$form->setData(),g [1]

  • OverrideRegistrationFormType添加一個事件偵聽器,該偵聽器將偵聽FormEvents::PRE_SET_DATA數據事件。在這裏,您將根據類型動態添加表單域。檢查this食譜條目。

  • 現在來驗證部分。爲每個用戶類型創建兩種類型的驗證組。您可以根據提交的數據動態設置驗證組。檢查here

  • 如果您想在表格保存期間做額外操作,您可以覆蓋onSuccess方法RegistrationFormHandler。檢查底部的this文檔來做到這一點。

[1]這樣,

public function registerAction() 
{ 
    $form = $this->container->get('fos_user.registration.form'); 
    $user = new User(); 
    $form->setData($user); 
    //..... 
} 

編輯:

第三步驟將無法工作。您必須重寫process方法RegistrationFormHandler以從控制器操作中傳遞類型參數。