Bridge a legacy Application with Symfony Sessions

Bridge a legacy Application with Symfony Sessions

If you're integrating the Symfony full-stack Framework into a legacy application that starts the session with session_start(), you may still be able to use Symfony's session management by using the PHP Bridge session.

If the application has its own PHP save handler, you can specify null for the handler_id:

  • YAML
    1
    2
    3
    4
    framework:
        session:
            storage_id: session.storage.php_bridge
            handler_id: ~
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:framework="http://symfony.com/schema/dic/symfony"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <framework:config>
            <framework:session storage-id="session.storage.php_bridge"
                handler-id="null"
            />
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    $container->loadFromExtension('framework', array(
        'session' => array(
            'storage_id' => 'session.storage.php_bridge',
            'handler_id' => null,
        ),
    ));
    

Otherwise, if the problem is simply that you cannot avoid the application starting the session with session_start(), you can still make use of a Symfony based session save handler by specifying the save handler as in the example below:

  • YAML
    1
    2
    3
    4
    framework:
        session:
            storage_id: session.storage.php_bridge
            handler_id: session.handler.native_file
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:framework="http://symfony.com/schema/dic/symfony"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <framework:config>
            <framework:session storage-id="session.storage.php_bridge"
                handler-id="session.storage.native_file"
            />
        </framework:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    $container->loadFromExtension('framework', array(
        'session' => array(
            'storage_id' => 'session.storage.php_bridge',
            'handler_id' => 'session.storage.native_file',
        ),
    ));
    

Note

If the legacy application requires its own session save handler, do not override this. Instead set handler_id: ~. Note that a save handler cannot be changed once the session has been started. If the application starts the session before Symfony is initialized, the save handler will have already been set. In this case, you will need handler_id: ~. Only override the save handler if you are sure the legacy application can use the Symfony save handler without side effects and that the session has not been started before Symfony is initialized.

For more details, see Integrating with Legacy Sessions.

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.