Symfony2自定义SessionBag不保存多维数组

时间:2016-01-18 08:28:22

标签: php forms symfony session

我有一个简单的拍卖列表表格,上面有图片上传器。我创建了一个自定义SessionBag来存储由plupload Javascript上传器上传的图片的图片URL,这些图片URL在提交表单之前上传,以便在数据持久化时,可以从会话中获取上传文件的图片URL并添加到实体。如果用户决定用拍卖表格打开多个标签,为了防止数据冲突,我使用表格的CSRF标记作为会话包中图片数组中的标识符键来引用图片网址。但是,出于某种原因,它不会使用作​​为数组键给出的标记来保存图片。如果我将它们保存到没有密钥的数组中,它只保存图片URL。

以下是SessionBag的代码:

class UploadedPicturesAttributeBag implements SessionBagInterface
{

const DEFAULT_INDEX = 'default';

/**
 * @var array
 */
protected $pictures = array();

/**
 * {@inheritdoc}
 */
public function getName()
{
    return Constants\Session::UPLOADED_PICTURES_BAG;
}

/**
 * {@inheritdoc}
 */
public function initialize(array &$array)
{
    $this->pictures[self::DEFAULT_INDEX] = &$array;
}

/**
 * {@inheritdoc}
 */
public function getStorageKey()
{
    return Constants\Session::UPLOADED_PICTURES_BAG;
}

/**
 * {@inheritdoc}
 */
public function clear()
{
    $this->pictures = null;
}

/**
 * @param string $index
 *
 * @return bool
 */
public function clearIndex($index = null)
{
    if (array_key_exists($index, $this->pictures)) {
        $this->pictures[$index] = null;
    }

    $this->pictures[self::DEFAULT_INDEX] = null;
}


/**
 * @param string $index
 *
 * @return array|bool
 */
public function getPictures($index = null)
{
    if (null === $index) {
        return $this->pictures[self::DEFAULT_INDEX];
    }

    if (array_key_exists($index, $this->pictures)) {
        return $this->pictures[$index];
    }

    return false;
}

/**
 * @param string $index
 *
 * @return bool
 */
public function hasPictures($index = null)
{
    if (null === $index) {
        return count($this->pictures[self::DEFAULT_INDEX]) > 0;
    }

    return count($this->pictures[$index]) > 0;
}

/**
 * @param string $pictureName
 * @param string $index
 */
public function addPicture($pictureName, $index = null)
{
    if (null === $index && !in_array($pictureName, $this->pictures[self::DEFAULT_INDEX], true)) {
        $this->pictures[self::DEFAULT_INDEX][] = $pictureName;
    }

    if (!in_array($pictureName, $this->pictures[$index], true)) {
        $this->pictures[$index][] = $pictureName;
    }
}
}

在处理上传的控制器中,我从容器中获取已注册的会话包,并使用名称和csrf令牌调用addPicture方法。当我将包放在下一页时,它将数组显示为空。如果我使用addPicture方法没有第二个参数它可以工作,但我不能使用碰撞技术来防止混合不同形式的图片。

知道会话包的问题或我对此问题的处理方法有什么问题?

0 个答案:

没有答案