扩展 UserManager 以按关系搜索用户 (symfony3)
extend UserManager to search User by relation (symfony3)
我安装了 FOSUserbundle 和 HWI Oauth 包。
我的问题是:我想从存储在关系中的用户实体访问数据。我想从 FOSUserProvider 中的 UserInSocialNetworks 访问字段 social_network_slug 和 social_identifier 中的数据。
这个想法是,一个用户可以拥有多个社交网络登录名。 (1:n)- 当我使用 google/facebook 等登录名登录时,我想检查 table 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; ....
用于存储所有用户社交媒体登录的实体 Class:
<?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 class:
<?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 class 中的 entitymanager,而且我无法那样搜索:
$user = $this->userManager->findUserBy(array(
'socialIdentifier' => $userIdInSocialNetwork,
'social_network_slug' => $socialnetwork)
因为这是一种关系。
谢谢你的想法!
正如您提到的,您已经扩展了 FOSUBUserProvider
,我假设您已经为此定义了一个新服务,如果是这样,那么您可以将学说的实体管理器传递给您的 class @doctrine.orm.entity_manager
。在 HWIOAuthBundle
documentation for FOSUserBundle
之后,您可以将实体管理器作为
services:
my.custom.user_provider:
class: MyBundle\Security\Core\User\MyFOSUBUserProvider
arguments: ['@fos_user.user_manager', { facebook: facebook_id }, @doctrine.orm.entity_manager]
然后在您的 class 中,您可以将此服务用作
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 */
}
}
我的实现出现错误,但通过向第三个参数添加引号来解决此问题,如下所示:
services:
my.custom.user_provider:
class: MyBundle\Security\Core\User\MyFOSUBUserProvider
arguments: ['@fos_user.user_manager', { facebook: facebook_id }, '@doctrine.orm.entity_manager']
我安装了 FOSUserbundle 和 HWI Oauth 包。 我的问题是:我想从存储在关系中的用户实体访问数据。我想从 FOSUserProvider 中的 UserInSocialNetworks 访问字段 social_network_slug 和 social_identifier 中的数据。 这个想法是,一个用户可以拥有多个社交网络登录名。 (1:n)- 当我使用 google/facebook 等登录名登录时,我想检查 table 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; ....
用于存储所有用户社交媒体登录的实体 Class:
<?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 class:
<?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 class 中的 entitymanager,而且我无法那样搜索:
$user = $this->userManager->findUserBy(array(
'socialIdentifier' => $userIdInSocialNetwork,
'social_network_slug' => $socialnetwork)
因为这是一种关系。 谢谢你的想法!
正如您提到的,您已经扩展了 FOSUBUserProvider
,我假设您已经为此定义了一个新服务,如果是这样,那么您可以将学说的实体管理器传递给您的 class @doctrine.orm.entity_manager
。在 HWIOAuthBundle
documentation for FOSUserBundle
之后,您可以将实体管理器作为
services:
my.custom.user_provider:
class: MyBundle\Security\Core\User\MyFOSUBUserProvider
arguments: ['@fos_user.user_manager', { facebook: facebook_id }, @doctrine.orm.entity_manager]
然后在您的 class 中,您可以将此服务用作
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 */
}
}
我的实现出现错误,但通过向第三个参数添加引号来解决此问题,如下所示:
services:
my.custom.user_provider:
class: MyBundle\Security\Core\User\MyFOSUBUserProvider
arguments: ['@fos_user.user_manager', { facebook: facebook_id }, '@doctrine.orm.entity_manager']