Как убрать deprecated warnings в Symfony 2?
Разбирался я тут недавно с подключением различных бандлов к symfony 2. Необходимо было подключить много чего, а в частности Doctrine 2 ORM/ODM бандлы. Вроде проблемы с composer уже решил, но все равно надо было определить рабочие версии и их совместимость. Как всегда, не без нюансов.
Рабочие версии бандлов и модуля mongo
Версия монго-драйвера: 1.3.0beta2
1 2 3 4 5 6 7 |
"doctrine/common": "2.3.0", "doctrine/migrations": "dev-master", "doctrine/dbal": "2.3.0", "doctrine/orm": "2.3.0", "doctrine/mongodb": "1.0.x-dev", "doctrine/mongodb-odm": "1.0.x-dev", "doctrine/mongodb-odm-bundle": "3.0.*" |
Это те версии, с которыми всё в результате завелось. А изначально не заводилось, и symfony плевался вот такой ошибкой:
Deprecated: Function MongoCollection::setSlaveOkay() is deprecated
Фишка в том, что doctrine-mongodb-odm на данный момент не совместим с версией 1.3.x монго-драйвера, и надо либо делать downgrade до версии 1.2.10
1 |
pecl install -f mongo-1.2.10 |
либо подавлять такие предупреждения (warnings). Делать downgrade мне не хотелось (тем более, что там есть баги), так что я пошел по второму пути.
Убираем depracated warnings в Symfony 2
Вообще так конечно делать не следует, а то недалеко и до подавления ошибок (@) дойти. Однако есть ситуации, типа этой, в которых это – лучший вариант. Установка error_reporting(-1) содержится в Symfony\Component\HttpKernel\Kernel::init() и в скомпиленном /app/bootstrap.php.cache Чтобы убрать его нужно определить функцию выше (в нашем AppKernel.php) например вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<?php use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Config\Loader\LoaderInterface; // For init() use Symfony\Component\ClassLoader\DebugClassLoader; use Symfony\Component\HttpKernel\Debug\ErrorHandler; use Symfony\Component\HttpKernel\Debug\ExceptionHandler; class AppKernel extends Kernel { public function registerBundles() { $bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Symfony\Bundle\AsseticBundle\AsseticBundle(), new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new JMS\AopBundle\JMSAopBundle(), new JMS\DiExtraBundle\JMSDiExtraBundle($this), new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(), new ThankYou\DefaultBundle\ThankYouDefaultBundle(), new Doctrine\Bundle\MongoDBBundle\DoctrineMongoDBBundle(), ); if (in_array($this->getEnvironment(), array('dev', 'test'))) { $bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); } return $bundles; } public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); } // Переписанные функции Symfony\Component\HttpKernel\Kernel public function init() { if ($this->debug) { ini_set('display_errors', 1); // error_reporting(-1); @netandreus: не надо отображать все ошибки в деве (из-за драйвера монги) error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT ^E_DEPRECATED); DebugClassLoader::enable(); ErrorHandler::register($this->errorReportingLevel); if ('cli' !== php_sapi_name()) { ExceptionHandler::register(); } } else { ini_set('display_errors', 0); } } } |
Соответственно делаем это только для dev-среды. А вообще, так делать плохо! Ошибок в вашем приложении быть не должно!) Но это только в идеальной стране идеальные программисты пишут идеальный код…. а в рилайфе всякое случается…
Ссылки
mongodb driver 1.2.11 Function MongoCollection::setSlaveOkay() is deprecated
class AppKernel extends Kernel
{
public function init()
{
parent::init();
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT ^E_DEPRECATED); // choose a level you need
}
// ….
}
Ну как бы да 🙂
Ага рабочий вариант на этих:
“require”: {
“php”: “>=5.3.3”,
“symfony/symfony”: “2.1.*”,
“doctrine/orm”: “>=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.1.*",
"doctrine/mongodb-odm-bundle": "3.0.*",
"doctrine/mongodb-odm":"1.0.*",
"doctrine/mongodb":"1.0.*",
"twig/extensions": "1.0.*@dev",
"symfony/assetic-bundle": "2.1.*",
"symfony/swiftmailer-bundle": "2.1.*",
"symfony/monolog-bundle": "2.1.*",
"sensio/distribution-bundle": "2.1.*",
"sensio/framework-extra-bundle": "2.1.*",
"sensio/generator-bundle": "2.1.*",
"jms/security-extra-bundle": "1.2.*",
"jms/di-extra-bundle": "1.1.*"
},