使用FOSUserBundle扩展Symfony2中的UserManager

Wif*_*ter 5 extends symfony 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 
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 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]
Run Code Online (Sandbox Code Playgroud)

然后将服务连接到FOS user_manager(也在config.yml中):

fos_user:
    service:
        user_manager: custom_user_manager
Run Code Online (Sandbox Code Playgroud)

在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);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用参数值`%fos_user.model.user.class%`而不是硬编码实体类名作为最后一个构造函数参数. (11认同)

gil*_*den 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);
    }
}
Run Code Online (Sandbox Code Playgroud)