[BUGFIX] FLUIDTEMPLATE - Serialization of 'Closure' is not allowed
authorOliver Hader <oliver@typo3.org>
Tue, 5 Jun 2012 21:44:57 +0000 (23:44 +0200)
committerOliver Hader <oliver@typo3.org>
Tue, 3 Jul 2012 20:20:51 +0000 (22:20 +0200)
The Fluid TemplateCompiler uses closures to store a cached
variant of the accordant Fluid node. Several calls in Fluid
use serialize() and also will process those closures, which
will end up in a PHP fatal error.

The most obvious part is the object manager which will then
try to serialize all objects - including closures - that are
available in the object container.

The problem can be circumvented by using accordant magic PHP
methods like __sleep() and __wakeup() to ignore those properties.

Change-Id: I70e78a09b2a118cc26f099063743c530f0addc72
Fixes: #32295
Related: #36820
Releases: 6.0, 4.7, 4.6

typo3/sysext/extbase/Classes/Object/ObjectManager.php

index 12bcaaf..b0d7207 100644 (file)
@@ -46,6 +46,41 @@ class Tx_Extbase_Object_ObjectManager implements Tx_Extbase_Object_ObjectManager
        }
 
        /**
+        * Serialization (sleep) helper.
+        *
+        * Removes properties of this object from serialization.
+        * This action is necessary, since there might be closures used
+        * in the accordant content objects (e.g. in FLUIDTEMPLATE) which
+        * cannot be serialized. It's fine to reset $this->contentObjects
+        * since elements will be recreated and are just a local cache,
+        * but not required for runtime logic and behaviour.
+        *
+        * @see http://forge.typo3.org/issues/36820
+        * @return array Names of the properties to be serialized
+        */
+       public function __sleep() {
+                       // Use get_objects_vars() instead of
+                       // a much more expensive Reflection:
+               $properties = get_object_vars($this);
+               unset($properties['objectContainer']);
+
+               return array_keys($properties);
+       }
+
+       /**
+        * Unserialization (wakeup) helper.
+        *
+        * Initializes the properties again that have been removed by
+        * a call to the __sleep() method on serialization before.
+        *
+        * @see http://forge.typo3.org/issues/36820
+        * @return void
+        */
+       public function __wakeup() {
+               $this->__construct();
+       }
+
+       /**
         * Returns TRUE if an object with the given name is registered
         *
         * @param  string $objectName Name of the object