Существует ли версия Doctrine 2, совместимая с PHP 5.6?

У меня есть приложение Symfony 2.3, использующее Doctrine >=2.2.3,‹2.4-dev. Я обновил свой рабочий сервер до PHP 5.6, что вызвало следующую ошибку с FOSUserBundle:

Warning: Erroneous data format for unserializing 'air\cms2Bundle\Entity\User' in /vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php on line 833

Fatal error: __clone method called on non-object in /vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php on line 837

Объект является просто расширением FOSUserBundle BaseUser, как показано здесь. Класс FOSUserBundle BaseUser можно найти здесь.

Проведя некоторые первоначальные исследования, я обнаружил, что ошибка вызвана проблемой совместимости PHP 5.6 и Doctrine 2 из-за изменения в Сериализуемый в PHP 5.6. Разработчики Doctrine исправили проблему (см. запрос на включение GitHub), но я все еще не уверен, какая версия Doctrine 2 мне нужна в composer.json, чтобы получить исправление, и я также не уверен, с какими версиями Symfony 2 она совместима.

Мой текущий composer.json:

"require": {
        "php": ">=5.3.3",
        "symfony/symfony": "2.3.*",
        "doctrine/orm": ">=2.2.3,<2.4-dev",
        "doctrine/doctrine-bundle": "1.2.*",
        ...
},

Обновление:

Я обновил свой composer.json до:

"require": {
    "php": ">=5.6.0",
    "symfony/symfony": "2.6.*",
    "doctrine/orm": "~2.5",
    "doctrine/doctrine-bundle": "1.2.*",
    ...
},

Но, к сожалению, это вызывает неразрешимую проблему зависимости:

Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install doctrine/orm v2.5.4
    - Conclusion: remove doctrine/doctrine-bundle v1.2.0
    - Conclusion: remove doctrine/dbal v2.4.5
    - Conclusion: don't install doctrine/orm v2.5.3
    - Conclusion: don't install doctrine/orm v2.5.2
    - Conclusion: don't install doctrine/orm v2.5.1
    - Conclusion: don't install doctrine/dbal v2.4.5
    - Conclusion: don't install doctrine/dbal v2.5.2|install doctrine/dbal v2.4.5
    - Conclusion: don't install doctrine/dbal v2.5.3|install doctrine/dbal v2.4.5
    - Conclusion: don't install doctrine/dbal v2.5.4|install doctrine/dbal v2.4.5
    - Installation request for doctrine/doctrine-bundle 1.2.* -> satisfiable by doctrine/doctrine-bundle[v1.2.0].
    - Installation request for doctrine/orm ~2.5 -> satisfiable by doctrine/orm[v2.5.0, v2.5.1, v2.5.2, v2.5.3, v2.5.4].
    - doctrine/doctrine-bundle v1.2.0 requires doctrine/dbal >=2.2,<2.5-dev -> satisfiable by doctrine/dbal[v2.4.5, 2.2.0, 2.2.1, 2.2.2, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.3.5, v2.4.0, v2.4.1, v2.4.2, v2.4.3, v2.4.4].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.2.0].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.2.1].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.2.2].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.3.0].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.3.1].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.3.2].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.3.3].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.3.4].
    - Can only install one of: doctrine/dbal[v2.5.0, 2.3.5].
    - Can only install one of: doctrine/dbal[v2.5.0, v2.4.0].
    - Can only install one of: doctrine/dbal[v2.5.0, v2.4.1].
    - Can only install one of: doctrine/dbal[v2.5.0, v2.4.2].
    - Can only install one of: doctrine/dbal[v2.5.0, v2.4.3].
    - Can only install one of: doctrine/dbal[v2.5.0, v2.4.4].
    - doctrine/orm v2.5.0 requires doctrine/dbal >=2.5-dev,<2.6-dev -> satisfiable by doctrine/dbal[v2.5.0, v2.5.1, v2.5.2, v2.5.3, v2.5.4].
    - Conclusion: don't install doctrine/dbal v2.5.1

Я также попытался обновить свой composer.json до

"require": {
    "php": ">=5.6.0",
    "symfony/symfony": "2.6.*",
    "doctrine/common": "~2.5",
    ...
},

Но это вызывает ошибку при запуске app/console clear:cache после того, как композитор закончил обновление.

Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Removing doctrine/orm (v2.4.8)
  - Removing doctrine/doctrine-bundle (v1.2.0)
  - Removing doctrine/dbal (v2.4.5)
  - Removing jdorn/sql-formatter (v1.2.17)
Writing lock file
Generating autoload files
> Incenteev\ParameterHandler\ScriptHandler::buildParameters
Updating the "app/config/parameters.yml" file
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache
PHP Fatal error:  Class 'Doctrine\Bundle\DoctrineBundle\DoctrineBundle' not found in /vagrant/logbookWebApp-data/app/AppKernel.php on line 16
Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the post-update-cmd event terminated with an exception


  [RuntimeException]                                                         
  An error occurred when executing the "'cache:clear --no-warmup'" command.  


update [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--lock] [--no-plugins] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--with-dependencies] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [-i|--interactive] [--] [<packages>]...

person wowpatrick    schedule 15.01.2016    source источник
comment
Пожалуйста, опишите, какую ошибку вы получаете   -  person Maks3w    schedule 15.01.2016
comment
Запрос на вытягивание, на который вы ссылались, был давным-давно объединен и включен во все все еще поддерживаемые версии Doctrine.   -  person xabbuh    schedule 15.01.2016
comment
Doctrine 2.4.8 — это максимум, который я могу получить с php5.3 под управлением Symfony 2.8.   -  person Jason Butler    schedule 15.01.2016
comment
Какой параметр конфигурации вашей платформы установлен в composer.json? getcomposer.org/doc/06-config.md#platform   -  person Jakub Zalas    schedule 16.01.2016
comment
@xabbuh: Знаете ли вы, включает ли ветка Doctrine 2.4 упомянутое исправление?   -  person wowpatrick    schedule 17.01.2016
comment
Нет, вам нужно 2.5 или выше IIRC.   -  person xabbuh    schedule 18.01.2016


Ответы (1)


На самом деле, вы можете прекрасно использовать такую ​​версию, как "~2.5" Doctrine, с PHP 5.6.
Для версии PHP ниже, чем 5.4, Doctrine 2.4.8, безусловно, является последней совместимой версией.

Вы даете слишком много информации и недостаточно информации.
Пожалуйста, будьте точны в своей ошибке.

ОБНОВЛЕНИЕ

Чтобы исправить эту ошибку,
выполните следующую команду.

php -r "echo PHP_VERSION_ID;"

ИЛИ Создайте простой php-скрипт со следующим содержимым:

<?php echo PHP_VERSION_ID; ?>

Затем выполните его. Для моей версии PHP (5.6.16) он возвращает:

50616

Теперь возьмите результат и перейдите к vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php возле строки 827 и замените метод newInstance на:

public function newInstance()
{
  if ($this->_prototype === null) {
       if (PHP_VERSION_ID === YOURPHPVERSIONHERE || PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513) {
          $this->_prototype = $this->reflClass->newInstanceWithoutConstructor();
      } else {
          $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name));
      }
  }
   return clone $this->_prototype;
}

Это решает проблему для версии PHP вашего компьютера, используя доктрину с версией, установленной по умолчанию в Symfony 2.3.

Это не идеальное решение, поскольку при повторном клонировании репозитория или переустановке поставщиков исправление будет уничтожено.

person chalasr    schedule 15.01.2016
comment
Можете ли вы добавить содержимое вашего объекта User? Особенно часть, вызывающая Serializable - person chalasr; 16.01.2016
comment
Существует старый вопрос по очень похожей проблеме /вопросы/24031048/ . Попробуйте реализовать одну из быстрых и грязных (но работающих) альтернатив, предложенных в ответах. См. этот выпуск github.com/doctrine/doctrine2/issues/3897 - person chalasr; 17.01.2016
comment
Похоже, что проверка идентификатора PHP_VERSION не решает проблему для PHP 5.6. Ветвь 2.4 имеет правильную проверку для 5.6 (см. github.com/doctrine/doctrine2/blob/2.4/lib/Doctrine/ORM/Mapping/), но по какой-то проводной причине вход в систему завершается с ошибкой без сообщения об ошибке при использовании "doctrine/orm": "~2.4",, что я вызвано та же проблема, что и с 2.3 - person wowpatrick; 18.01.2016
comment
Какую версию FOSUserBundle вы используете? Я пытаюсь воспроизвести вашу проблему - person chalasr; 18.01.2016
comment
В настоящее время установлена ​​версия 1.3.6. - person wowpatrick; 18.01.2016
comment
Я добавил исправление в свой ответ. Для меня только что добавленная следующая проверка || PHP_VERSION_ID === 50616 в методе newInstance решила проблему. - person chalasr; 18.01.2016
comment
Прежде всего, спасибо за усилия, которые вы вкладываете в это! Я проверил решение, как вы описали в обновленном вопросе, и поведение, о котором я упоминал во втором комментарии (с установленной Doctrine 2.4), все еще сохраняется: ошибка, выданная в исходном вопросе, исчезла, но при попытке войти в систему FOSUserBundle просто перезагружается страница входа. Мое первое предположение заключалось в том, что это по-прежнему вызвано исходной ошибкой, которую мы сейчас обсуждаем, но, возможно, Doctrine 2.4 исправляет исходную ошибку, и сейчас я столкнулся с другой несовместимостью FOSUserBundle. - person wowpatrick; 18.01.2016
comment
Вам следует избегать всех пользовательских требований, которые вы добавили из-за первой ошибки. Чтобы избежать всех ошибок, которые могут возникнуть в будущем из-за совместимости, перезапустите с первой точки с хорошими зависимостями, повторно добавьте свой полный пакет и полную конфигурацию, предварительно сделав резервную копию, и тогда все должно работать. Я реализовал FOSUserBundle, чтобы точно воспроизвести вашу проблему, и он полностью работает. Ошибка в точке login_check вызвана первой проблемой, и она была исправлена ​​моим ответом. Кроме того, мне было бы неплохо перезапустить с нуля, применить мой ответ, и если вы вошли в систему ... - person chalasr; 18.01.2016
comment
Давайте продолжим обсуждение в чате. - person wowpatrick; 18.01.2016
comment
Понижение без каких-либо объяснений немного неблагодарно! - person chalasr; 25.02.2016