Symfony 2 SecurityContext class deprecated

前端 未结 3 1580
醉梦人生
醉梦人生 2021-02-02 09:12

I get the following error when I try to reach app/example on symfony demo

Error: The Symfony\\Component\\Security\\Core\\SecurityContext class is deprec

3条回答
  •  旧巷少年郎
    2021-02-02 09:32

    Explanation

    Starting with Symfony 2.6 the SecurityContext got split into the TokenStorage and the AuthorizationChecker (see: Symfony Blog - "New in Symfony 2.6: Security component improvements").

    The main reason for this was to prevent circular reference which occurred quite often when injecting the SecurityContext into your own services.

    Solution

    The change itself is 100% backwards compatible (as stated in the linked blog post), you just need to rewrite how you accessed the SecurityContext.

    // Symfony 2.5
    $user = $this->get('security.context')->getToken()->getUser();
    // Symfony 2.6
    $user = $this->get('security.token_storage')->getToken()->getUser();
    
    // Symfony 2.5
    if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) { ... }
    // Symfony 2.6
    if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { ... }
    

    You can simply try to find the culprit by doing a text-search for security.context or SecurityContext in your source code (including the vendor directory).

    But as you stated that you're using vanilla Symfony 2.6 it seems that it simply uses some soon to be deprecated methods. So you might simply use this...

    Workaround

    As Symfony does it's deprecation by triggering E_USER_DEPRECATED errors, you can simply disable them when booting your Symfony AppKernel:

    // app/AppKernel.php
    class AppKernel extends Kernel
    {
        public function __construct($environment, $debug) {
            // Keep error reporting like it was and disable only deprecation warnings.
            error_reporting(error_reporting() & (-1 ^ E_DEPRECATED));
            // ...
        }
    }
    

    I personally like the deprecation warnings, because Symfony's changelogs tend to give very detailed information on how you need to change your code to support future versions of Symfony and the deprecation warnings normally are triggered months before the methods are actually deprecated.

提交回复
热议问题