2

基本的に、Symfony で FOSUserBundle を使用して FOSFacebookBundle を実装しようとしています。FOSFacebookBundle の 2.0 ブランチの readme に従いましたが、現在このエラーが発生しています。何か案が ?

エラー :

Catchable Fatal Error: Argument 2 passed to FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider::__construct()
must implement interface Symfony\Component\Security\Core\User\UserProviderInterface,
instance of FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider given,
called in /var/www/Symfony/app/cache/dev/appDevDebugProjectContainer.php on line 2434
and defined in /var/www/Symfony/vendor/bundles/FOS/FacebookBundle/Security/Authentication/Provider/FacebookProvider.php line 37

security.yml (セキュリティセクション):

factories:
    - "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"

providers:
    chain_provider:
        providers: [fos_userbundle, fos_facebook]
    fos_userbundle:
        id: fos_user.user_manager
    fos_facebook:
        id: fos_facebook.auth 

encoders:
    "FOS\UserBundle\Model\UserInterface": sha512

firewalls:
    main:
        pattern:        .*
        fos_facebook:
            provider: fos_facebook 
            app_url: "to_do"
            server_url: "to_do"
            default_target_path: /
        form_login:
            provider:       fos_userbundle
            login_path:     /login
            use_forward:    false
            check_path:     /login_check
            failure_path:   null
            default_target_path: /
        logout:
            path:   /logout
            target: /
        anonymous:    true

access_control:
    - { path: /admin/.*, role: ROLE_ADMIN }
    - { path: /video/.*, role: ROLE_USER }
    - { path: /$, role: IS_AUTHENTICATED_ANONYMOUSLY }

config.yml の関連部分:

fos_user:
    db_driver:     orm
    firewall_name: main
    use_listener: false
    user_class:   Projectname\UserBundle\Entity\User
    registration:
        form:
            type: projectname_user_registration
    service:
        user_manager: projectname_user.my_user_manager

fos_facebook:
    file:   %kernel.root_dir%/../vendor/facebook/src/base_facebook.php
    alias:  facebook
    app_id: %projectname_bundle.facebook.app_id%
    secret: %projectname_bundle.facebook.secret%
    cookie: true
    permissions: %projectname_bundle.facebook.perms%

MyUserManager.php (FOSUserbundle でメール アドレスをユーザー名として使用できるように変更しました。本当に関連性があるかどうかはわかりませんが、FacebookProvider コンストラクターに渡された 2 番目の引数に問題があることをエラーが示しており、この引数は想定されていますUserManager になる):

<?php

namespace ProjectName\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 email "%s" was found.', $username));
        }

        return $user;
    }
}
4

1 に答える 1

0

FacebookProvider ( FOS\FacebookBundle\Security\Authentication\Provider\FacebookProvider )は、 UserProviderInterface ではなくAuthenticationProviderInterfaceを実装します。これはユーザー プロバイダーではなく認証プロバイダーであり、fos_facebook にはユーザー プロバイダーが必要です。

したがって、カスタム ユーザー プロバイダーを定義する必要があります: ここで説明されています (インストール手順 6. および「FOS\UserBundle を使用したカスタム ユーザー プロバイダーの例」)。

1) security.yml

これを追加 :

# application/config/config.yml
security:
    providers:
        ...
        # choose the provider name freely
        my_fos_facebook_provider:
            id: my.facebook.user
        ...
firewalls:
    main:
        pattern:      .*
        fos_facebook:
            ...
            provider: my_fos_facebook_provider
            ...

2) config.yml

これを追加 :

services:
    my.facebook.user:
        class: Acme\MyBundle\Security\User\Provider\FacebookProvider
        arguments:
            facebook: "@fos_facebook.api"
            userManager: "@fos_user.user_manager"
            validator: "@validator"
            container: "@service_container"

3) FacebookProvider.php

Acme/MyBundle/Security/User/Provider/ にファイル FacebookProvider.php を作成します。

Readme.mdの最後のコード

4) ユーザー.php

いくつかの FB 関連フィールド (ID、名、姓など) を追加して、ユーザー エンティティを編集します。

Readme.mdの最後のコード

于 2012-05-18T07:20:13.067 に答える