Мое приложение Synfony2 не может разрешить зависимость службы

Я пытаюсь интегрировать FOSUserBundle с HWIBundle, чтобы добавить в свое приложение подключения к социальным сетям. FOSUser работает отлично, но у меня возникла проблема с интеграцией с HWIOAuthBundle.

Связки загружаются в AppKernel, отлично.

Это мой config.yml

hwi_oauth:
    connect:
        account_connector: my_user_provider
    firewall_name: name
    fosub:
        username_iterations: 30
        properties:
            facebook: facebook_id
            google: google_id
    resource_owners:
        facebook:
            type:                facebook
            client_id:           "%facebook_app_id%"
            client_secret:       "%facebook_app_secret%"
            scope:               ""
        google:
            type:                google
            client_id:           "%google_app_id%"
            client_secret:       "%google_app_secret%"
            scope:               "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"

Это мой файл security.yml:

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

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_USER

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            login_path: /login
            check_path: /login_check
        oauth:
            resource_owners:
                facebook:           "/login/check-facebook"
                google:             "/login/check-google"
            login_path:        /login
            failure_path:      /login

            oauth_user_provider:
                service: my_user_provider
        logout:       true
        anonymous:    true

    login:
        pattern:  ^/login$
        security: false

        remember_me:
            key: "%secret%"
            lifetime: 31536000 # 365 days in seconds
            path: /
            domain: ~ # Defaults to the current domain from $_SERVER

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/backend/, role: ROLE_ADMIN }

Это мой пакет services.yml

parameters:
    my_user_provider.class: Main\SiteBundle\Services\FOSUBUserProvider

services:
    my_user_provider:
        class: "%my_user_provider.class%"
        arguments: [@fos_user.user_manager,{facebook: facebook_id, google: google_id}]

А это Служба:

namespace Main\SiteBundle\Services;

use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
use Symfony\Component\Security\Core\User\UserInterface;

class FOSUBUserProvider extends BaseClass
{

    /**
     * {@inheritDoc}
     */
    public function connect(UserInterface $user, UserResponseInterface $response)
    {
        $property = $this->getProperty($response);
        $username = $response->getUsername();

        //on connect - get the access token and the user ID
        $service = $response->getResourceOwner()->getName();

        $setter = 'set'.ucfirst($service);
        $setter_id = $setter.'Id';
        $setter_token = $setter.'AccessToken';

        //we "disconnect" previously connected users
        if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
            $previousUser->$setter_id(null);
            $previousUser->$setter_token(null);
            $this->userManager->updateUser($previousUser);
        }

        //we connect current user
        $user->$setter_id($username);
        $user->$setter_token($response->getAccessToken());

        $this->userManager->updateUser($user);
    }
    /**
     * {@inheritdoc}
     */
    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
    {
        $username = $response->getUsername();
        $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
        //when the user is registrating
        if (null === $user) {
            $service = $response->getResourceOwner()->getName();
            $setter = 'set'.ucfirst($service);
            $setter_id = $setter.'Id';
            $setter_token = $setter.'AccessToken';
            // create new user here
            $user = $this->userManager->createUser();
            $user->$setter_id($username);
            $user->$setter_token($response->getAccessToken());
            //I have set all requested data with the user's username
            //modify here with relevant data
            $user->setUsername($username);
            $user->setEmail($username);
            $user->setPassword($username);
            $user->setEnabled(true);
            $this->userManager->updateUser($user);
            return $user;
        }

        //if user exists - go with the HWIOAuth way
        $user = parent::loadUserByOAuthUserResponse($response);

        $serviceName = $response->getResourceOwner()->getName();
        $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

        //update access token
        $user->$setter($response->getAccessToken());

        return $user;
    }

}

Да, это ошибка, которую я получаю в браузере:

ServiceNotFoundException в строке 58 CheckExceptionOnInvalidReferenceBehaviorPass.php: служба «hwi_oauth.security.oauth_utils» зависит от несуществующей службы «hwi_oauth.resource_ownermap.name».

Выполняя «обновление композитора», я получаю это

[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException] Служба "hwi_oauth.security.oauth_utils" зависит от несуществующей службы "hwi_oauth.resource_ownermap.name".

Сценарий Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache, обрабатывающий событие post-update-cmd, завершен с исключением

[RuntimeException] Произошла ошибка при выполнении команды «cache:clear --no-warmup».


person Louis B    schedule 12.03.2015    source источник
comment
Вы предоставили много кода, и это здорово, но, пожалуйста, предоставьте также информацию о проблеме. Сообщение об ошибке/исключении, журналы и т. д. Это то, что говорит вам о том, что что-то не так.   -  person Jakub Matczak    schedule 12.03.2015


Ответы (1)


В config.yml вы настроили hwi_oauth с «имя_брандмауэра: имя».

Но в security.yml у вас нет брандмауэра с таким именем «имя» (но у вас есть «основной» именованный брандмауэр, не упомянутый в hwi_oauth в config.yml). Это вызывает сообщение об ошибке, которое у вас есть.

person Artemide Innominato    schedule 17.06.2015