Symfony2中在LdapUserProvider调用ImageEncoderService遇问题
在Symfony2自定义LdapUserProvider中注入ImageEncoderService的解决方案
嗨,我来帮你搞定这个问题!其实核心点你可能没注意到:自定义的UserProvider本质也是Symfony的服务,所以和控制器、仓库一样,只要把它注册为服务并注入依赖就行,网上没专门提是因为这是服务注入的通用逻辑。下面一步步来:
1. 完善LdapUserProvider的构造函数
首先确保你的构造函数已经声明了要注入的ImageEncoderService,并完成属性赋值:
// 记得引入ImageEncoderService的命名空间 use Your\Bundle\Service\ImageEncoderService; class LdapUserProvider implements UserProviderInterface { private $ldapManager; private $bindUsernameBefore; private $userClass; private $em; private $session; private $imgEncoder; public function __construct( LdapManagerUserInterface $ldapManager, $bindUsernameBefore = false, $userClass, EntityManager $em, Session $session, ImageEncoderService $imgEncoder // 新增这个依赖参数 ) { $this->ldapManager = $ldapManager; $this->bindUsernameBefore = $bindUsernameBefore; $this->userClass = $userClass; $this->em = $em; $this->session = $session; $this->imgEncoder = $imgEncoder; // 将注入的服务赋值给类属性 } // 你的其他UserProvider方法... }
2. 将LdapUserProvider注册为服务
打开你的services.yml(如果用XML配置就是services.xml),把LdapUserProvider注册成服务,并注入所有依赖,包括你的ImageEncoderService:
services: # 注册自定义的LdapUserProvider服务 app.ldap_user_provider: class: Your\Bundle\Security\User\LdapUserProvider arguments: - "@ldap.manager.user" # 替换成你项目中实际的LdapManager服务ID - false # bindUsernameBefore的默认值,和构造函数参数对应 - "Your\\Bundle\\Entity\\User" # 替换成你的User实体类完整路径 - "@doctrine.orm.entity_manager" # EntityManager的默认服务ID - "@session" # Session的默认服务ID - "@app.image_encoder_service" # 替换成你的ImageEncoderService的服务ID
3. 在security.yml中使用服务ID而非类名
最后,在安全配置里,不要直接写LdapUserProvider的类名,而是用你刚才注册的服务ID:
security: providers: ldap_provider: id: app.ldap_user_provider # 这里用服务ID,而非直接指定class
关键说明
很多教程没提这一点是因为默认开发者知道:Symfony的安全组件在使用自定义UserProvider时,必须把它作为服务来管理,这样才能利用Symfony的依赖注入容器注入其他服务。如果直接写类名,Symfony会尝试直接实例化这个类,没法处理带依赖的构造函数,这就是你之前遇到问题的核心原因。
另外要注意:
- 确保你的
ImageEncoderService本身已经正确注册为服务,不然注入时会报“服务不存在”的错误 - 如果你的Symfony2版本低于2.4,可能需要在服务定义里加上
public: true(2.4+版本默认服务为public) - 检查所有依赖的服务ID是否和你的项目实际配置一致,比如
ldap.manager.user要对应你项目中LdapManager的服务ID
内容的提问来源于stack exchange,提问作者metad00r
相关产品推荐
相关产品推荐

