【问题标题】:extend UserManager to search User by relation (symfony3)扩展 UserManager 以按关系搜索用户(symfony3)
【发布时间】:2017-12-07 23:32:49
【问题描述】:

我安装了 FOSUserbundle 和 HWI Oauth 包。 我的问题是:我想从存储在关系中的用户实体访问数据。我想访问 FOSUserProvider 中 UserInSocialNetworks 中的 social_network_slug 和 social_identifier 字段中的数据。 这个想法是,一个用户可以拥有多个社交网络登录名。 (1:n)- 当我使用我的 google/facebook 等登录名登录时,我想检查表 user_in_social_networks 是否已经存在社交网络的 ID。

/*
 * This is the User class, depending on fos_userBundle
 */

namespace AppBundle\Entity\Registration;

use Doctrine\Common\Collections\ArrayCollection as ArrayCollection;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * One User can have many social networks
     * @ORM\OneToMany(targetEntity="UserInSocialNetworks", mappedBy="user", cascade={"remove"})
     */
    private $socialnetworks; ....

用于存储所有用户社交媒体登录信息的实体类:

<?php

namespace AppBundle\Entity\Registration;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;



/**
 * UserInSocialNetworks
 *
 * @ORM\Table(name="user_in_social_networks")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\Registration\UserInSocialNetworksRepository")
 */
class UserInSocialNetworks
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * Many Socialnetwork Logins have one User
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Registration\User", inversedBy="socialnetworks")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     *
     */
    private $user;

    /**
     * @var int
     *
     * @ORM\Column(name="social_network_slug", type="string", length=255, nullable=true)
     */
    private $socialNetworkSlug;

    /**
     * @var string
     *
     * @ORM\Column(name="social_identifier", type="string", length=255, nullable=true)
     */
    private $socialIdentifier;

扩展的 FOSUBUserProvider 类:

    <?php
    namespace AppBundle\Entity\Registration;

    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 loadUserByOAuthUserResponse(UserResponseInterface $response)
        {
            // get user_id and socialnetworkname from response
            $userIdInSocialNetwork = $response->getUsername();
            $socialnetwork = $response->getResourceOwner()->getName();
// Here I'd like to search for an existing $userIdInSocialNetwork

我从现在开始检查的内容:我无法访问 FOSUBUserProvider 类中的 entitymanager,也无法通过这种方式进行搜索:

$user = $this->userManager->findUserBy(array(
                'socialIdentifier' => $userIdInSocialNetwork,
                'social_network_slug' => $socialnetwork)

因为这是一种关系。 感谢您的任何想法!

【问题讨论】:

    标签: doctrine-orm fosuserbundle hwioauthbundle symfony3.x


    【解决方案1】:

    正如您提到的那样,您已经扩展了FOSUBUserProvider,我假设您已经为此定义了一个新服务,如果是这样,那么您可以将教义的实体管理器传递给您的班级@doctrine.orm.entity_manager。按照FOSUserBundleHWIOAuthBundle 文档,您可以将实体管理器传递为

    services:
        my.custom.user_provider:
            class:        MyBundle\Security\Core\User\MyFOSUBUserProvider
            arguments: ['@fos_user.user_manager', { facebook: facebook_id }, @doctrine.orm.entity_manager]
    

    然后在您的班级中,您可以将此服务用作

    use Doctrine\ORM\EntityManager;
    use FOS\UserBundle\Model\UserManagerInterface;
    //.... other use statements
    
    class FOSUBUserProvider extends BaseClass
    {
        private $em;
    
        public function __construct(UserManagerInterface $userManager, array $properties, EntityManager $em)
        {
            $this->em = $em;
            parent::__construct($userManager, $properties); /* pass dependencies to parent */
        }
    
        public function loadUserByOAuthUserResponse(UserResponseInterface $response)
        {
            $this->em->getRepository('AppBundle\Entity\Registration\UserInSocialNetworks')->findBy(....);
    
            /* Do your stuff here */
        }
    }
    

    【讨论】:

    • 谢谢,快速且非常正确的答案。你拯救了我的一天!
    【解决方案2】:

    在我的实现中出现错误,但通过在第三个参数中添加引号来解决这个问题,如下所示:

    services:
    my.custom.user_provider:
        class:        MyBundle\Security\Core\User\MyFOSUBUserProvider
        arguments: ['@fos_user.user_manager', { facebook: facebook_id }, '@doctrine.orm.entity_manager']
    

    【讨论】:

    • 这看起来和 M Khalid Junaids 的回答一模一样。
    猜你喜欢
    • 2017-03-07
    • 2017-06-15
    • 1970-01-01
    • 2018-07-30
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多