我有一个简单的拍卖列表表格,上面有图片上传器。我创建了一个自定义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方法没有第二个参数它可以工作,但我不能使用碰撞技术来防止混合不同形式的图片。
知道会话包的问题或我对此问题的处理方法有什么问题?