2016-01-15 1 views
0

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

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, как показано here. Класс FOSUserBundle BaseUser можно найти here.

После выполнения начального исследования выяснилось, что ошибка вызвана ошибкой совместимости с PHP 5.6 и Doctrine 2 из-за изменения Serializable в PHP 5.6. Разработчики Doctrine исправили эту проблему (см. GitHub pull request), но я до сих пор не знаю, какую версию 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.*", 
     ... 
}, 

Update:

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

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

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

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>]... 
+0

Пожалуйста, подробно сообщите, какую ошибку вы получаете – Maks3w

+0

Вытянутый запрос, с которым вы связаны, был объединен давным-давно, включен во все поддерживаемые версии Doctrine. – xabbuh

+0

Doctrine 2.4.8 - это максимум, который я могу получить с помощью php5.3, работающего с symfony 2.8 –

ответ

4

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

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

UPDATE

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

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.

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

+0

Можете ли вы добавить содержимое своего объекта пользователя? Особенно часть вызова Serializable – chalasr

+0

Существует старый вопрос для очень похожего вопроса http://stackoverflow.com/questions/24031048/fos-userbundle-unable-to-login. Попробуйте реализовать одну из быстрых и грязных (но работающих) альтернатив, предложенных в ответах. См. Эту проблему https://github.com/doctrine/doctrine2/issues/3897 – chalasr

+0

Похоже, что проверка проверки PHP_VERSION не решила проблему для PHP 5.6. У ветки 2.4 есть правильная проверка на 5.6 (см. Https://github.com/doctrine/doctrine2/blob/2.4/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php#L866), но по какой-то проводной причине вход в систему не выполняется без сообщения об ошибке при использовании '" doctrine/orm ":" ~ 2.4 ",' который я вызван той же проблемой, что и с 2.3 – wowpatrick