2012-03-21 26 views
5

tôi đã cố gắng để mở rộng UserManager của FOS theo linkMở rộng UserManager trong Symfony2 với FOSUserBundle

dịch vụ của tôi này được phát hiện một cách chính xác nhưng tôi có một lỗi tôi không thể giải quyết:

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

Bạn đã tìm thấy một cách giải quyết? Tôi có chính xác cùng một vấn đề. Cảm ơn. – Creasixtine

+0

Không thực sự, tôi chỉ dừng sử dụng FOS và tôi đơn giản sử dụng hệ thống đăng nhập Symfony2. – Wifsimster

+0

Bạn đã thử giải pháp của tôi chưa? – gilden

Trả lời

4

Bạn cần thêm phương thức hàm tạo (__construct) và chuyển đối số bắt buộc xuống lớp cơ sở:

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

Xin lỗi tiếng Anh của tôi kém.

Có thể lập luận quản lý dịch vụ tùy chỉnh của bạn là sai vì nó nói

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

Dưới đây là cấu hình của tôi:

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

tôi đã cùng một vấn đề, đây là giải pháp của tôi (về cơ bản một kết hợp hai câu trả lời đầu tiên):

Thiết lập dịch vụ trong config.yml, đừng quên đối số

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] 

Sau đó kết nối dịch vụ cho FOS user_manager (cũng trong config.yml):

fos_user: 
    service: 
     user_manager: custom_user_manager 

Trong CustomUserManager nhớ lại cấu trúc-phương pháp, như Gilden nói:

class CustomUserManager extends UserManager{ 

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

} 
+10

Bạn có thể sử dụng giá trị tham số '% fos_user.model.user.class%' thay cho tên lớp thực thể được mã hóa cứng làm đối số hàm tạo cuối cùng. – devsheeep

Các vấn đề liên quan