Bug #3756

Empty SplObjectStorage property is not reconstituted

Added by Robert Lemke 269 days ago. Updated 264 days ago.

Status:Rejected Start:2009-06-25
Priority:Should have Due date:
Assigned to:Karsten Dambekalns % Done:

100%

Category:FLOW3 Persistence
Target version:0.5.0 alpha 2

Description

If a persisted object contains a property of type SplObjectStorage and that storage does not contain any objects, the storage itself won't be reconstituted on recreating the persisted object.

Example:
/**
 * A blog
 *
 * @scope prototype
 * @entity
 */
class Blog {

    /**
     * The posts contained in this blog
     *
     * @var \SplObjectStorage
     * @lazy
     */
    protected $posts;

    /**
     * Constructs a new Blog
     */
    public function __construct() {
        $this->posts = new \SplObjectStorage();
    }

    /**
     * Adds a post to this blog
     *
     * @param \F3\Blog\Domain\Model\Post $post
     * @return void
     */
    public function addPost(\F3\Blog\Domain\Model\Post $post) {
        $post->setBlog($this);
        $this->posts->attach($post);
    }

    /**
     * Returns all posts in this blog
     *
     * @return \SplObjectStorage
     * @author Robert Lemke <robert@typo3.org>
     */
    public function getPosts() {
        if ($this->posts instanceof \F3\FLOW3\Persistence\LazyLoadingProxy) {
            $this->posts->_loadRealInstance();
        }
        return clone $this->posts;
    }

}
?>

If the Blog contains no Posts, getPosts() will return a clone of the empty SplObjectStorage. However, if the Blog has been reconstituted, $this->posts is NULL and therefore issues a fatal error on cloning $this->posts.

History

2009-06-30 12:56 - Karsten Dambekalns

  • Status changed from New to Rejected
  • % Done changed from 0 to 100

An SplObjectStorage instance is always persisted and restored, even when empty. The problem was caused by the fix for #3650 in r2640 - the posts member variable was never initialized and really contained NULL.

Also available in: Atom PDF