Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 如何以通用方式处理筛选器的会话存储,避免;“必须管理实体”;_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 如何以通用方式处理筛选器的会话存储,避免;“必须管理实体”;

Symfony 如何以通用方式处理筛选器的会话存储,避免;“必须管理实体”;,symfony,doctrine-orm,Symfony,Doctrine Orm,我们都遇到过这样的问题:“当我们试图setFilters()/getFilters() 那么,如何以通用的方式处理过滤器的会话存储,以避免合并和分离或手动重新水合 请看下面的答案。好吧,一些同事(@benji07)在工作中写道: /** *设置过滤器 *@param string$name用于存储筛选器的密钥的名称 *@param数组$filters */ 公共函数setFilters($name,array$filters=array()) { foreach($key=>$value作为过滤

我们都遇到过这样的问题:“当我们试图
setFilters()
/
getFilters()

那么,如何以通用的方式处理过滤器的会话存储,以避免
合并
分离
手动重新水合

请看下面的答案。

好吧,一些同事(@benji07)在工作中写道:

/**
*设置过滤器
*@param string$name用于存储筛选器的密钥的名称
*@param数组$filters
*/
公共函数setFilters($name,array$filters=array())
{
foreach($key=>$value作为过滤器){
//将实体对象转换为一对类/id
如果(是对象($value)){
if($value instanceof ArrayCollection){
如果(计数($value)){
$filters[$key]=数组(
'class'=>get_class($value->first()),
'ids'=>array()
);
foreach(价值为$v){
$identifier=$this->getDoctrine()->getEntityManager()->getUnitOfWork()->getEntityIdentifier($v);
$filters[$key]['id'][=$identifier['id'];
}
}
}
elseif(!$value instanceof\DateTime){
$filters[$key]=数组(
“类”=>获取类($value),
'id'=>this->getDoctrine()->getEntityManager()->getUnitOfWork()->getEntityIdentifier($value)
);
}
}
}
$this->getRequest()->getSession()->set(
$name,
$filters
);
}
/**
*获取过滤器
*@param string$name用于获取筛选器的密钥的名称
*@param数组$filters
*
*@return数组
*/
公共函数getFilters($name,array$filters=array())
{
$filters=array\u merge(
$this->getRequest()->getSession()->get(
$name,
数组()
),
$filters
);
foreach($key=>$value作为过滤器){
//从类/id对中获取实体
if(is_数组($value)&&isset($value['class'])&&isset($value['id'])){
$filters[$key]=$this->getDoctrine()->getEntityManager()->find($value['class'],$value['id']);
}elseif(isset($value['id'])){
$data=$this->getDoctrine()->getEntityManager()->getRepository($value['class'])->findBy(array('id'=>$value['id']);
$filters[$key]=新的ArrayCollection($data);
}
}
返回$filters;
}
它适用于基本实体和多值选择

PS:别忘了为
ArrayCollection

免责声明,我们不知道这是否是一种好的做法,我们知道至少有一个限制:您必须确保您试图在会话中保存的对象具有
id
(99.9%的情况下)