1

我正在尝试设置HWIOAuthBundleFOSUserBundle.

在制作自己的扩展用户提供程序时FOSUBUserProvider,我执行了以下操作:

namespace Naroga\Reader\CommonBundle\Service\Security;

use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;

class NarogaUserProvider extends FOSUBUserProvider {

    public function loadUserByOAuthUserResponse(UserResponseInterface $response) {

        [...]

    }

}

我的 services.yml 如下:

naroga.reader.common.security.user_provider:
    class: Naroga\Reader\CommonBundle\Service\Security\NarogaUserProvider
    arguments: [ @fos_user.user_manager ]

每当我运行程序时,我都会收到以下错误:

Argument 2 passed to HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider::__construct() must be of the type array, none given, called in

这很有意义,因为FOSUBUserProvider::__construct' 的签名是public function __construct(UserManagerInterface $userManager, array $properties).

我不知道将什么定义为我的服务的第二个参数,以便它可以覆盖FOSUBUserProvider. 我一直在谷歌上搜索它,我发现的只是人们有同样的问题,没有答案。

我将永远感谢温柔的灵魂告诉我第二个参数必须是什么才能符合 FOSUBUserProvider 的签名。

谢谢你。

4

2 回答 2

1

第二个参数用于映射。据我了解,这是您实体中对应 OAuth 服务的名称和字段名称。

例如,您可以按如下方式发送它们:

naroga.reader.common.security.user_provider:
    class: Naroga\Reader\CommonBundle\Service\Security\NarogaUserProvider
    arguments: [ @fos_user.user_manager, { facebook: facebookId, twitter: twitterId } ]
于 2013-03-19T20:37:34.717 回答
1

如果您还想传递一些额外的参数,假设使用调度程序触发一个事件,这是我的情况,只需覆盖构造函数。

use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;

FOSUBUserProvider extends BaseClass
{
    /**
     * @var EventDispatcherInterface
     */
    private $eventDispatcher;

    /**
     * Constructor.
     *
     * @param UserManagerInterface $userManager FOSUB user provider.
     * @param array $properties Property mapping.
     * @param EventDispatcherInterface $eventDispatcher
     */
    public function __construct(
        UserManagerInterface $userManager,
        array $properties,
        EventDispatcherInterface $eventDispatcher)
    {
        $this->userManager     = $userManager;
        $this->properties      = array_merge($this->properties, $properties);
        $this->accessor        = PropertyAccess::createPropertyAccessor();
        $this->eventDispatcher = $eventDispatcher;
    }

以及服务定义:

tb_user_provider:
    class: "%tb_user_provider.class%"
    arguments: [@fos_user.user_manager, { facebook: facebook_id }, @event_dispatcher]
于 2015-07-13T19:53:18.937 回答