我正在尝试保留一个实体,但它不起作用。 在我的测试设置中,我成功地保留了其中一个条目。 但是,在实际代码中,它不会持久化。 所以我深入研究了代码,我发现在持久化时,在不起作用的持久化中,在UnitOfWork.php
中,以下行在每种情况下返回不同的内容:
$entityState = $this->getEntityState($entity, self::STATE_NEW);
switch ($entityState) {
工作回报:case self::STATE_NEW:
或2
不工作退货:case self::STATE_MANAGED:
或1
但是不工作的代码应该是新的。
加工:
public static function createAuthorizationCode(string $authorizationCodeHash, Client $client, DateTime $expires)
{
$authorizationCode = new AuthorizationCode();
$authorizationCode->setAuthorizationCodeHash($authorizationCodeHash);
$authorizationCode->setClient($client);
$authorizationCode->setExpires($expires);
self::getEntityManager()->persist($authorizationCode);
return $authorizationCode;
}
不工作:
public function setAuthorizationCode(AuthorizationCode $authorizationCode, string $authorizationCodeHash, Client $client, User $user, $redirectUri, DateTime $expires, $scope, $idToken)
{
$authorizationCode->setAuthorizationCodeHash($authorizationCodeHash);
$authorizationCode->setClient($client);
$authorizationCode->setUser($user);
$authorizationCode->setRedirectUri($redirectUri);
$authorizationCode->setExpires($expires);
if($scope)
$authorizationCode->setScope($scope);
if ($idToken)
$authorizationCode->setIdToken($idToken);
$this->em->persist($authorizationCode);
$this->em->flush();
}
不工作的呼叫者:
public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
{
try {
$authorizationCode = $this->authorizationCodeRepository->getAuthorizationCode($code);
} catch (AuthorizationCodeNotFoundException $e) {
//this line is hit for sure and an empty object is being
//passed into setAuthorizationCode
$authorizationCode = new AuthorizationCode();
}
$oScope = $scope ? $this->scopeRepository->getScopeById($scope) : null;
$this->authorizationCodeRepository->setAuthorizationCode(
$authorizationCode,
$code,
$this->clientRepository->getClientById($client_id),
$this->userRepository->getUserByUserName($user_id),
$redirect_uri,
self::timeStampToDateTime($expires),
$oScope,
$id_token);
return true;
}
型:
<?php
namespace PIAuthEntityAccessToken;
use PIAuthEntityClientClient;
use PIAuthEntityScopeScope;
use PIAuthEntityUserUser;
use DateTime;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
*/
class AccessToken
{
public function __construct()
{
$this->deleted = false;
}
/**
* @ORMId
* @ORMColumn(type="string", unique=true, length=40, nullable=false)
* @var string
*/
protected $accessTokenHash;
/**
* @ORMColumn(type="string", length=80, nullable=true)
* @var string
*/
protected $idToken;
/**
* @ORMColumn(type="boolean")
* @var bool
*/
protected $deleted;
/**
* @ORMManyToOne(targetEntity="PIAuthEntityClientClient")
* @ORMJoinColumn(referencedColumnName="clientId")
* @var Client
*/
protected $client;
/**
* @ORMManyToOne(targetEntity="PIAuthEntityUserUser")
* @ORMJoinColumn(referencedColumnName="userName")
* @var User
*/
protected $user;
/**
* @ORMColumn(type="datetime")
* @var DateTime
*/
protected $expires;
/**
* @ORMManyToOne(targetEntity="PIAuthEntityScopeScope")
* @ORMJoinColumn(referencedColumnName="scope")
* @var Scope
*/
protected $scope;
/**
* @return string
*/
public function getAccessTokenHash(): string
{
return $this->accessTokenHash;
}
/**
* @param string $accessTokenHash
*/
public function setAccessTokenHash(string $accessTokenHash)
{
$this->accessTokenHash = $accessTokenHash;
}
/**
* @return Client
*/
public function getClient()
{
return $this->client;
}
/**
* @param Client $client
*/
public function setClient(Client $client)
{
$this->client = $client;
}
/**
* @return User
*/
public function getUser()
{
return $this->user;
}
/**
* @param User $user
*/
public function setUser(User $user)
{
$this->user = $user;
}
/**
* @return DateTime
*/
public function getExpires(): DateTime
{
return $this->expires;
}
/**
* @param DateTime $expires
*/
public function setExpires(DateTime $expires)
{
$this->expires = $expires;
}
/**
* @return Scope
*/
public function getScope()
{
return $this->scope;
}
/**
* @param Scope $scope
*/
public function setScope(Scope $scope)
{
$this->scope = $scope;
}
/**
* @return mixed
*/
public function getIdToken()
{
return $this->idToken;
}
/**
* @param mixed $idToken
*/
public function setIdToken($idToken)
{
$this->idToken = $idToken;
}
/**
* @return bool
*/
public function isDeleted(): bool
{
return $this->deleted;
}
/**
* @param bool $deleted
*/
public function setDeleted(bool $deleted)
{
$this->deleted = $deleted;
}
}
看来你的AuthorizationCodeNotFoundException
没有被抓住。您是否在同一个命名空间中,或者您是否对此有任何use
?
尝试在 catch 块中插入一个die(1)
以查看它是否被执行。
哇。 这个令人头疼。 问题在于教义如何将实体标记为持续存在。 使用spl-object-hash
http://php.net/manual/en/function.spl-object-hash.php
问题是销毁数据库并在需要为每个测试完成的相同过程中重新创建它。 你会看到文档中的一个注释说,
请注意,对象的内容(属性(不是由函数哈希处理的,只是由其内部句柄和处理程序表指针哈希。这足以保证同时驻留在内存中的任何两个对象将具有不同的哈希值。不保证未同时驻留在内存中的对象之间的唯一性,例如:
var_dump(spl_object_hash(new stdClass(((, spl_object_hash(new stdClass((((;
单独运行通常会生成相同的哈希,因为 PHP 在创建第二个 stdClass 时被取消引用和销毁后,会重用第一个 stdClass 的内部句柄。
这就是原因。 Doctine 认为我的新实体是一个已经被散列的实体。
对此的解决方案是 创建一个新EntityManager
. 希望这能帮助一些可怜的灵魂。 不要害怕深入研究代码。