在 Symfony 2(.7) 中禁用已弃用的警告

Posted

技术标签:

【中文标题】在 Symfony 2(.7) 中禁用已弃用的警告【英文标题】:Disable deprecated warning in Symfony 2(.7) 【发布时间】:2015-05-05 05:25:34 【问题描述】:

自从我的Symfony 2 更新为2.7。我在phpUnitconsole 中收到了很多已弃用的错误(消息现在很清楚)。

ProjectX\ApiBundle\Tests\Controller\SectionsControllerTest::testPostDebug()
The twig.form.resources configuration key is deprecated since version 2.6 and will be removed in 3.0. Use the twig.form_themes configuration key instead.

知道如何暂时禁用它们吗?

【问题讨论】:

好吧,希望从 symfony 2.7.1 开始,弃用消息默认会被静音,并且只会出现在开发调试栏中。 symfony.com/blog/symfony-2-7-1-released 【参考方案1】:

就我而言,如果不使用SYMFONY_DEPRECATIONS_HELPERenvironnment 变量,我无法隐藏已弃用的警告。

更改您的 phpunit.xml
<phpunit>
    <!-- ... -->

    <php>
        <env name="SYMFONY_DEPRECATIONS_HELPER" value="weak"/>
    </php>
</phpunit>

然后,您只会收到一条消息,例如“Remaining deprecation notices (x)”,这不被视为测试失败。

希望这会有所帮助。

【讨论】:

这确实为我的管道解决了这个问题,但是在本地运行 phpunit 时,我实际上想输出这些弃用。 $_ENV['SYMFONY_DEPRECATIONS_HELPER'] = 'weak'; 并没有解决这个问题。【参考方案2】:

请注意,通过 error_reporting() 或 Debug::enable() 禁用弃用警告不会阻止它们被记录到 dev.log。要禁止它们被记录,您需要将独白处理程序中的日志级别更改为“警告”(弃用警告在“php”通道中记录为“信息”)。

或者,为了防止其他日志受到影响,您可以为“php”通道创建一个具有不同级别的单独独白处理程序,例如

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            formatter: monolog.formatter.session_request
            channels: '!php'
        php:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: warning
            formatter: monolog.formatter.session_request
            channels: 'php'

【讨论】:

仅供参考,php 频道不仅可以包含弃用消息。例如,它还可能包含在渲染 twig 模板期间未捕获的异常。 问题在于,可能还有一堆其他日志被归类为值得在生产环境中记录的信息【参考方案3】:

在新版本的 Twig 中删除了 twig.form 配置键。因此,您应该替换 config.yml 中的密钥

 ///DEPRECATED : 

  twig:
     form:
         resources:
             - 'path_to_template_file'

 // NEW WAY : 
  twig:
     form_themes:
         - 'path_to_template_file'

【讨论】:

【参考方案4】:

AppKernel 继承的 Kernel::init() 函数本身已贬值,因此更改它不是一个可行的长期解决方案。

您可以通过更改对 Debug::enable() 的调用来轻松覆盖错误报告;在 app/console 和 web/app_dev.php 中都是这样。

改变

Debug::enable();

Debug::enable(E_RECOVERABLE_ERROR & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED, false);

这将保留所有其他错误报告,同时抑制折旧警告。而且您根本不需要弄乱内核。

【讨论】:

【参考方案5】:

我有同样的问题并解决了类似于下面的链接。 Symfony 声明报告所有错误并覆盖您在 php.ini 中设计的内容(否则它无法捕获并为您显示漂亮的堆栈跟踪)。

因此,您需要通过在 AppKernel.php 中创建 init() 函数并设置 error_reporting 来覆盖 Symfony2 的内置错误报告,以及 (可能)一些环境检测以确保您不会在生产中显示错误,例如:

// Add this to app/AppKernel.php
public function init()

    if ($this->debug) 
        ini_set('display_errors', 1);
        error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED);
     else 
        ini_set('display_errors', 0);
    

更多细节在这里(如果你不懂俄语,请使用谷歌翻译:)http://tokarchuk.ru/2012/12/disable-deprecated-warnings-in-symfony-2/

【讨论】:

以上是关于在 Symfony 2(.7) 中禁用已弃用的警告的主要内容,如果未能解决你的问题,请参考以下文章

用户测试中多个客户端的 Symfony 4.4 弃用警告已弃用,但仍存在于文档中

Symfony 2.8:ResourceInterface::isFresh() 自 2.8 起已弃用

在 pytorch 中追溯已弃用的警告

ConnectivityManager.TYPE_WIFI 在代码中显示已弃用。我在 M 以上版本中使用了网络功能,想要删除已弃用的警告

为啥 C++ 已弃用的警告会打印两次?

仅针对一个标头禁用#warning