2012-03-21 49 views
5

我試圖根據這個link擴展的UserManager在Symfony2中與FOSUserBundle

我的服務就是正確檢測延長FOS的的UserManager,但我有一個錯誤,我不能解析:

ErrorException: Catchable Fatal Error: Argument 1 passed to FOS\UserBundle\Entity\UserManager::__construct() must be an instance of Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface, none given, called in 

MyUserManager:

namespace ChoupsCommerce\UserBundle\Model; 

use FOS\UserBundle\Entity\UserManager; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 

class MyUserManager extends UserManager 
{ 
    public function loadUserByUsername($username) 
    { 
     $user = $this->findUserByUsernameOrEmail($username); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $username)); 
     } 

     return $user; 
    } 
} 
+0

你有沒有發現解決方法?我也有完全一樣的問題。 謝謝。 – Creasixtine 2012-04-13 16:50:11

+0

並非如此,我只是停止使用FOS,而只是使用Symfony2登錄系統。 – Wifsimster 2012-04-14 11:19:15

+0

你試過我的解決方案嗎? – gilden 2012-04-15 22:25:32

回答

4

您需要添加類的構造方法(__construct),並通過必要的參數下到基類:

namespace ChoupsCommerce\UserBundle\Model; 

use Doctrine\ORM\EntityManager; 
use FOS\UserBundle\Entity\UserManager; 
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; 
use FOS\UserBundle\Util\CanonicalizerInterface; 

class MyUserManager extends UserManager 
{ 
    public function __construct(
     EncoderFactoryInterface $encoderFactory, 
     CanonicalizerInterface $usernameCanonicalizer, 
     CanonicalizerInterface $emailCanonicalizer, 
     EntityManager $em, 
     $class 
    ) { 
     parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer, $em, $class); 
    } 
} 
2

對不起,我的英文很差。

可能是您的自定義管理器服務的論點是錯誤的,因爲它說

Argument 1 passed to FOS\UserBundle\Entity\UserManager::__construct() must be an instance of Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface, none given, called in

這裏是我的配置:

iep_core.iep_user_manager: 
    class: Iep\CoreBundle\Service\IepUserManager 
    arguments: [@security.encoder_factory, @fos_user.util.username_canonicalizer, @fos_user.util.email_canonicalizer, @fos_user.entity_manager, Iep\CoreBundle\Entity\User] 
18

我有同樣的問題,這裏是我的解決方案(基本上是前兩個答案的組合):

在config.yml中設置服務,不要忘記參數

services: 
    custom_user_manager: 
     class: Acme\UserBundle\Model\CustomUserManager 
     arguments: [@security.encoder_factory, @fos_user.util.username_canonicalizer, @fos_user.util.email_canonicalizer, @fos_user.entity_manager, Acme\UserBundle\Entity\User] 

然後服務連接到FOS user_manager(也config.yml):

fos_user: 
    service: 
     user_manager: custom_user_manager 

在CustomUserManager召回構造法,像gilden說:

class CustomUserManager extends UserManager{ 

    public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, ObjectManager $om, $class) 
    { 
     parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer, $om, $class); 
    } 

} 
+10

您可以使用參數值'%fos_user.model.user.class%'而不是硬編碼的實體類名稱作爲最後一個構造函數參數。 – devsheeep 2014-02-17 10:17:53