无法通过用户名或电子邮件从bundle中的数据库找到用户



我目前正在与Symfony合作开发两个网站,每个数据库都有一些共同点。我们创建了一个捆绑包来包含主网站的数据库,第二个包有自己的数据库。每个网站的数据库中都有一组用户(不相同),并且FOSUserBundle设置正确。

我正在尝试创建一个命令,将第二个网站的一些用户迁移到主网站,对于每个用户,我想检查它是否已存在于数据库中。

如果我的数据库是本地的,我可能会做类似$email_exist = $userManager->findUserByEmail($email);的事情,但我无法访问其他网站的 userManager。 我试过了:

$emBug->getRepository('BugTrackerModelBundle:User')->findByEmail($email)
$emBug->getRepository('BugTrackerModelBundle:User')->findBy(array('email' => $email))

我什至在我的存储库中创建了一个自定义函数,它执行相同的操作,每次我收到错误时都会Entity 'BugTrackerModelBundleEntityUser' has no field 'email'. You can therefore not call 'findByEmail' on the entities' repository.

我绝对肯定我的数据库中确实有电子邮件和用户名字段(我都尝试过)。我还尝试使用id而不是电子邮件,它有效,因此问题确实与该字段有关。

我正在使用FOSUserBundle,我的用户类扩展了BaseUser(这就是用户名和电子邮件的来源)

有没有(简单的)方法可以做到这一点?无需添加新的用户提供程序。

请不要告诉我"你不应该这样做"或我应该只有 1 个数据库,它没有用,无论如何我都无法更改它。

我的用户实体:

<?php
namespace BugTrackerModelBundleEntity;
use BugTrackerModelBundleEntityProjectProjectToUser;
use BugTrackerModelBundleEntityAuthorityAuthorityToUser;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
use FOSUserBundleModelUser as BaseUser;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;
use SymfonyComponentValidatorConstraints as Assert;
use SymfonyComponentHttpFoundationFileFile as BaseFile;
use SymfonyComponentHttpFoundationFileUploadedFile;
use VichUploaderBundleMappingAnnotation as Vich;
/**
* Class User
*
* @ORMTable(name="user")
* @UniqueEntity(fields={"email"}, message="A user with same email already exists")
* @ORMEntity(repositoryClass="BugTrackerModelBundleRepositoryUserRepository")
* @VichUploadable
*/
class User extends BaseUser
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var bool
* @ORMColumn(type="boolean")
*/
protected $deleted;
/**
* @var bool
* @ORMColumn(name="notify", type="boolean", options={"default" : 1}, nullable=true)
*/
protected $notify;
/**
* @var string
* @ORMColumn(name="first_name", type="string", length=255, nullable=true)
*/
protected $firstName;
/**
* @var string
* @ORMColumn(name="last_name", type="string", length=255, nullable=true)
*/
protected $lastName;
/**
* @var string
* @ORMColumn(name="job_title", type="string", length=255, nullable=true)
*/
protected $jobTitle;
/**
* @var BaseFile|UploadedFile
*
* @VichUploadableField(mapping="user_image", fileNameProperty="image")
*/
protected $userImage;
/**
* @var string
*
* @ORMColumn(name="image", type="string", nullable=true)
*/
protected $image;
/**
* @var Company
* @ORMManyToOne(targetEntity="BugTrackerModelBundleEntityCompany", cascade={"persist"})
* @ORMJoinColumn(referencedColumnName="id")
*/
protected $company;
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="BugTrackerModelBundleEntityProject", mappedBy="createdBy")
*/
protected $projects;
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="BugTrackerModelBundleEntityProjectProjectToUser", mappedBy="user", cascade={"all"})
*/
protected $assignedProjects;
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="BugTrackerModelBundleEntityAuthorityAuthorityToUser", mappedBy="user", cascade={"all"})
*/
protected $assignedAuthorities;
/**
* @var DateTime
*
* @ORMColumn(name="created_at", type="datetime", nullable=true)
*/
protected $createdAt;
/**
* @var DateTime
*
* @ORMColumn(name="updated_at", type="datetime", nullable=true)
*/
protected $updatedAt;
/**
* @var Country
* @ORMManyToOne(targetEntity="BugTrackerModelBundleEntityCountry", cascade={"persist"})
* @ORMJoinColumn(referencedColumnName="id")
*/
protected $country;
/**
* @var string
*
* @ORMColumn(name="time_zone", type="string", nullable=true)
*/
protected $timeZone;
/**
* @var string
*
* @ORMColumn(name="user_role", type="string", nullable=false)
*/
protected $userRole;
/**
* User constructor.
*/
public function __construct()
{
parent::__construct();
$this->enabled = true;
$this->deleted = false;
$this->notify = true;
$this->createdAt = new DateTime();
$this->updatedAt = new DateTime();
$this->projects = new ArrayCollection();
$this->assignedProjects = new ArrayCollection();
$this->assignedAuthorities = new ArrayCollection();
}
}

用户实体元数据:

{
"name":"BugTracker\ModelBundle\Entity\User",
"namespace":"BugTracker\ModelBundle\Entity",
"rootEntityName":"BugTracker\ModelBundle\Entity\User",
"customGeneratorDefinition":null,
"customRepositoryClassName":"BugTracker\ModelBundle\Repository\UserRepository",
"isMappedSuperclass":false,
"isEmbeddedClass":false,
"parentClasses":[
],
"subClasses":[
],
"embeddedClasses":[
],
"namedQueries":[
],
"namedNativeQueries":[
],
"sqlResultSetMappings":[
],
"identifier":[
"id"
],
"inheritanceType":1,
"generatorType":4,
"fieldMappings":{
"id":{
"fieldName":"id",
"type":"integer",
"scale":0,
"length":null,
"unique":false,
"nullable":false,
"precision":0,
"id":true,
"columnName":"id"
},
"deleted":{
"fieldName":"deleted",
"type":"boolean",
"scale":0,
"length":null,
"unique":false,
"nullable":false,
"precision":0,
"columnName":"deleted"
},
"notify":{
"fieldName":"notify",
"type":"boolean",
"scale":0,
"length":null,
"unique":false,
"nullable":true,
"precision":0,
"options":{
"default":1
},
"columnName":"notify"
},
"firstName":{
"fieldName":"firstName",
"type":"string",
"scale":0,
"length":255,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"first_name"
},
"lastName":{
"fieldName":"lastName",
"type":"string",
"scale":0,
"length":255,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"last_name"
},
"jobTitle":{
"fieldName":"jobTitle",
"type":"string",
"scale":0,
"length":255,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"job_title"
},
"image":{
"fieldName":"image",
"type":"string",
"scale":0,
"length":null,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"image"
},
"createdAt":{
"fieldName":"createdAt",
"type":"datetime",
"scale":0,
"length":null,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"created_at"
},
"updatedAt":{
"fieldName":"updatedAt",
"type":"datetime",
"scale":0,
"length":null,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"updated_at"
},
"timeZone":{
"fieldName":"timeZone",
"type":"string",
"scale":0,
"length":null,
"unique":false,
"nullable":true,
"precision":0,
"columnName":"time_zone"
},
"userRole":{
"fieldName":"userRole",
"type":"string",
"scale":0,
"length":null,
"unique":false,
"nullable":false,
"precision":0,
"columnName":"user_role"
}
},
"fieldNames":{
"id":"id",
"deleted":"deleted",
"notify":"notify",
"first_name":"firstName",
"last_name":"lastName",
"job_title":"jobTitle",
"image":"image",
"created_at":"createdAt",
"updated_at":"updatedAt",
"time_zone":"timeZone",
"user_role":"userRole"
},
"columnNames":{
"id":"id",
"deleted":"deleted",
"notify":"notify",
"firstName":"first_name",
"lastName":"last_name",
"jobTitle":"job_title",
"image":"image",
"createdAt":"created_at",
"updatedAt":"updated_at",
"timeZone":"time_zone",
"userRole":"user_role"
},
"discriminatorValue":null,
"discriminatorMap":[
],
"discriminatorColumn":null,
"table":{
"name":"user"
},
"lifecycleCallbacks":[
],
"entityListeners":[
],
"associationMappings":{
"company":{
"fieldName":"company",
"joinColumns":[
{
"name":"company_id",
"unique":false,
"nullable":true,
"onDelete":null,
"columnDefinition":null,
"referencedColumnName":"id"
}
],
"cascade":[
"persist"
],
"inversedBy":null,
"targetEntity":"BugTracker\ModelBundle\Entity\Company",
"fetch":2,
"type":2,
"mappedBy":null,
"isOwningSide":true,
"sourceEntity":"BugTracker\ModelBundle\Entity\User",
"isCascadeRemove":false,
"isCascadePersist":true,
"isCascadeRefresh":false,
"isCascadeMerge":false,
"isCascadeDetach":false,
"sourceToTargetKeyColumns":{
"company_id":"id"
},
"joinColumnFieldNames":{
"company_id":"company_id"
},
"targetToSourceKeyColumns":{
"id":"company_id"
},
"orphanRemoval":false
},
"projects":{
"fieldName":"projects",
"mappedBy":"createdBy",
"targetEntity":"BugTracker\ModelBundle\Entity\Project",
"cascade":[
],
"orphanRemoval":false,
"fetch":2,
"type":4,
"inversedBy":null,
"isOwningSide":false,
"sourceEntity":"BugTracker\ModelBundle\Entity\User",
"isCascadeRemove":false,
"isCascadePersist":false,
"isCascadeRefresh":false,
"isCascadeMerge":false,
"isCascadeDetach":false
},
"assignedProjects":{
"fieldName":"assignedProjects",
"mappedBy":"user",
"targetEntity":"BugTracker\ModelBundle\Entity\Project\ProjectToUser",
"cascade":[
"remove",
"persist",
"refresh",
"merge",
"detach"
],
"orphanRemoval":false,
"fetch":2,
"type":4,
"inversedBy":null,
"isOwningSide":false,
"sourceEntity":"BugTracker\ModelBundle\Entity\User",
"isCascadeRemove":true,
"isCascadePersist":true,
"isCascadeRefresh":true,
"isCascadeMerge":true,
"isCascadeDetach":true
},
"assignedAuthorities":{
"fieldName":"assignedAuthorities",
"mappedBy":"user",
"targetEntity":"BugTracker\ModelBundle\Entity\Authority\AuthorityToUser",
"cascade":[
"remove",
"persist",
"refresh",
"merge",
"detach"
],
"orphanRemoval":false,
"fetch":2,
"type":4,
"inversedBy":null,
"isOwningSide":false,
"sourceEntity":"BugTracker\ModelBundle\Entity\User",
"isCascadeRemove":true,
"isCascadePersist":true,
"isCascadeRefresh":true,
"isCascadeMerge":true,
"isCascadeDetach":true
},
"country":{
"fieldName":"country",
"joinColumns":[
{
"name":"country_id",
"unique":false,
"nullable":true,
"onDelete":null,
"columnDefinition":null,
"referencedColumnName":"id"
}
],
"cascade":[
"persist"
],
"inversedBy":null,
"targetEntity":"BugTracker\ModelBundle\Entity\Country",
"fetch":2,
"type":2,
"mappedBy":null,
"isOwningSide":true,
"sourceEntity":"BugTracker\ModelBundle\Entity\User",
"isCascadeRemove":false,
"isCascadePersist":true,
"isCascadeRefresh":false,
"isCascadeMerge":false,
"isCascadeDetach":false,
"sourceToTargetKeyColumns":{
"country_id":"id"
},
"joinColumnFieldNames":{
"country_id":"country_id"
},
"targetToSourceKeyColumns":{
"id":"country_id"
},
"orphanRemoval":false
},
"groupUsers":{
"fieldName":"groupUsers",
"mappedBy":"user",
"targetEntity":"BugTracker\ModelBundle\Entity\Group\GroupUser",
"cascade":[
"remove",
"persist",
"refresh",
"merge",
"detach"
],
"orphanRemoval":false,
"fetch":2,
"type":4,
"inversedBy":null,
"isOwningSide":false,
"sourceEntity":"BugTracker\ModelBundle\Entity\User",
"isCascadeRemove":true,
"isCascadePersist":true,
"isCascadeRefresh":true,
"isCascadeMerge":true,
"isCascadeDetach":true
}
},
"isIdentifierComposite":false,
"containsForeignIdentifier":false,
"idGenerator":{
},
"sequenceGeneratorDefinition":null,
"tableGeneratorDefinition":null,
"changeTrackingPolicy":1,
"isVersioned":null,
"versionField":null,
"cache":null,
"reflClass":{
"name":"BugTracker\ModelBundle\Entity\User"
},
"isReadOnly":false,
"reflFields":{
"id":{
"name":"id",
"class":"BugTracker\ModelBundle\Entity\User"
},
"deleted":{
"name":"deleted",
"class":"BugTracker\ModelBundle\Entity\User"
},
"notify":{
"name":"notify",
"class":"BugTracker\ModelBundle\Entity\User"
},
"firstName":{
"name":"firstName",
"class":"BugTracker\ModelBundle\Entity\User"
},
"lastName":{
"name":"lastName",
"class":"BugTracker\ModelBundle\Entity\User"
},
"jobTitle":{
"name":"jobTitle",
"class":"BugTracker\ModelBundle\Entity\User"
},
"image":{
"name":"image",
"class":"BugTracker\ModelBundle\Entity\User"
},
"createdAt":{
"name":"createdAt",
"class":"BugTracker\ModelBundle\Entity\User"
},
"updatedAt":{
"name":"updatedAt",
"class":"BugTracker\ModelBundle\Entity\User"
},
"timeZone":{
"name":"timeZone",
"class":"BugTracker\ModelBundle\Entity\User"
},
"userRole":{
"name":"userRole",
"class":"BugTracker\ModelBundle\Entity\User"
},
"company":{
"name":"company",
"class":"BugTracker\ModelBundle\Entity\User"
},
"projects":{
"name":"projects",
"class":"BugTracker\ModelBundle\Entity\User"
},
"assignedProjects":{
"name":"assignedProjects",
"class":"BugTracker\ModelBundle\Entity\User"
},
"assignedAuthorities":{
"name":"assignedAuthorities",
"class":"BugTracker\ModelBundle\Entity\User"
},
"country":{
"name":"country",
"class":"BugTracker\ModelBundle\Entity\User"
},
"groupUsers":{
"name":"groupUsers",
"class":"BugTracker\ModelBundle\Entity\User"
}
}
}

第二个网站上的学说配置

doctrine:
dbal:
default_connection: default
connections:
default:
mapping_types:
enum: string
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
bugtracker:
mapping_types:
enum: string
driver: pdo_mysql
host: '%database_host_bugtracker%'
port: '%database_port_bugtracker%'
dbname: '%database_name_bugtracker%'
user: '%database_user_bugtracker%'
password: '%database_password_bugtracker%'
charset: UTF8

如果您使用用户名而不是电子邮件怎么办,因为根据您发布的实体电子邮件属性存在于父类FOSUserBundleModelUser中,并且您的子类设置电子邮件,就像setEmail(){....}在此函数中,它还将相同的值设置为用户名parent::setUsername($email);所以我想您可以使用username属性获取用户

$emBug->getRepository('BugTrackerModelBundle:User')->findBy(array('username' => $email));

或者 eles 在您的类中定义电子邮件属性,就像您定义的用户名属性一样

/**
* @var string
* @ORMColumn(type="string" definition....)
*/
protected $email;

从你的描述中,我最好的猜测是FOSUserBundle的BaseUser的学说xml映射没有加载

这就是找不到"电子邮件"字段的原因。

据我了解,您不想在主网站中使用捆绑包以确保安全性。因此,我假设您没有执行主网站文档的第 2 步或第 4-7 步。

我建议克服这个问题的最简单方法是:

从添加的信息来看,问题是您正在尝试将 FOSUserBundle 与 2 个实体管理器一起使用。对此已经有一个问题。

我的建议是手动注册FOSUserBundle的学说映射,如此处所述,通过添加:

doctrine:
orm:
entity_managers:
# ...
bugtracker:
mapping:
FOSUserBundle:
type: xml
dir: '%kernel.root_dir%/../vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Resources/config/doctrine/model'
prefix: FOSUserBundleModel
is_bundle: false # needed as we don't follow the standard convention for bundles

其中,错误跟踪器是实体管理器定义的名称。

最新更新