Как убрать deprecated warnings в Symfony 2?

// Декабрь 11th, 2012 // Symfony 2

Разбирался я тут недавно с подключением различных бандлов к symfony 2. Необходимо было подключить много чего, а в частности Doctrine 2 ORM/ODM бандлы. Вроде проблемы с composer уже решил, но все равно надо было определить рабочие версии и их совместимость. Как всегда, не без нюансов.

Рабочие версии бандлов и модуля mongo

Версия монго-драйвера: 1.3.0beta2

"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

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) например вот так:

<?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

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


3 Responses to “Как убрать deprecated warnings в Symfony 2?”

  1. Ivan:

    class AppKernel extends Kernel
    {
    public function init()
    {
    parent::init();
    error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT ^E_DEPRECATED); // choose a level you need
    }

    // ….
    }

    • google.com Андрей Токарчук:

      Ну как бы да :-)

      • Ivan:

        Ага рабочий вариант на этих:
        «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.*"
        },

Комментировать