Вход в пакет FOSUser не работает с UUID Ramsey после обновления

#php #symfony #doctrine-orm #uuid

#php #symfony #doctrine-orm #uuid

Вопрос:

Я обновил приложение symfony с 4.0 до 4.4, все работает нормально, за исключением того, что при входе в панель управления ma я получаю эту ошибку Could not convert database value "11ea3053-6c85-df5a-a..." to Doctrine Type uuid_binary_ordered_time. Expected format: UuidV1
если я понизил ramsey/uuid-doctrine версию, все работает нормально.
Текущая версия Symfony 4.4

Тот же пользователь может войти в систему с помощью rest API с базовой авторизацией. Вот мой параметр id, в User.php котором используется UUID. Заранее спасибо.

  /**
 * @var Uuid
 *
 * @ORMId
 * @ORMColumn(type="uuid_binary_ordered_time", unique=true)
 * @ORMGeneratedValue(strategy="CUSTOM")
 * @ORMCustomIdGenerator(class="RamseyUuidDoctrineUuidOrderedTimeGenerator")
 */
protected $id;


 /**
 * @return string
 */
public function getId()
{
    return $this->id->getHex();
}
  

введите описание изображения здесь

Ответ №1:

итак, я нашел решение вышеуказанной проблемы. на самом деле проблема была с сериализацией и десериализацией symfony. Все работает нормально, за исключением входа в панель администратора, которая использует сеанс для хранения пользовательских данных, переопределяет метод сериализации и десериализации безопасности User Class User.php , и все работает нормально.
Главное, что во время сериализации я должен преобразовать свой uuid в string, а во время десериализации я должен преобразовать обратно строковый uuid. вот код в моем User.php классе сущностей.

  public function serialize()
{
    return serialize(array(
        $this->password,
        $this->salt,
        $this->usernameCanonical,
        $this->username,
        $this->enabled,
        $this->id->toString(),
        $this->email,
        $this->emailCanonical,
    ));
}

public function unserialize($serialized)
{
    $data = unserialize($serialized);

    if (13 === count($data)) {
        // Unserializing a User object from 1.3.x
        unset($data[4], $data[5], $data[6], $data[9], $data[10]);
        $data = array_values($data);
    } elseif (11 === count($data)) {
        // Unserializing a User from a dev version somewhere between 2.0-alpha3 and 2.0-beta1
        unset($data[4], $data[7], $data[8]);
        $data = array_values($data);
    }
    $data[5] = UuidV1::fromString($data[5]);
    list(
        $this->password,
        $this->salt,
        $this->usernameCanonical,
        $this->username,
        $this->enabled,
        $this->id,
        $this->email,
        $this->emailCanonical
        ) = $data;
}