Php 选择一个未持久化的实体

Php 选择一个未持久化的实体,php,symfony,Php,Symfony,我正在使用一个twig for循环来显示元素列表。这些元素来自解码的json数组和API 我的用户和这些元素之间有一种“一对一”的关系 用户需要选择这些元素之一,这些元素将通过addElement()函数添加到用户 我试图在循环中使用Symfony2表单来实现这一点,但它只显示在第一个元素上。我还尝试使用指向控制器函数的链接,但由于这些元素都没有保留在我的数据库中,因此出现以下错误: "Unable to guess how to get a Doctrine instance from the

我正在使用一个twig for循环来显示元素列表。这些元素来自解码的json数组和API

我的用户和这些元素之间有一种“一对一”的关系

用户需要选择这些元素之一,这些元素将通过addElement()函数添加到用户

我试图在循环中使用Symfony2表单来实现这一点,但它只显示在第一个元素上。我还尝试使用指向控制器函数的链接,但由于这些元素都没有保留在我的数据库中,因此出现以下错误:

"Unable to guess how to get a Doctrine instance from the request information."
以下是我如何显示我的元素:

{% block itinerary %}
    {% for element in elements %}

<aside class="flights-results__by-price col-md-3">
  <span class="flights-results__price">{{ element.price ? element.price : 'Unknown' }}</span>
  <a href="{{ path('selectLeg', {'element': element}) }}">Delete</a>
</aside>

    {% endfor %}
{% endblock itinerary %}
下面是我转储($elements)时的结果:

主要问题是API返回数千个结果。出于显而易见的原因,我无法坚持所有这些观点

我想最简单的提问方式是“在不持久保存该实体的情况下,将实体上的数据发送到控制器中的另一个函数的最佳方式是什么?”。到目前为止,我一直使用id作为标识符的持久化元素,但我意识到,当我们处理非持久化实体时,它会变得更加棘手。

如果您的
用户
和这些
元素
之间有一个单一的关系,这意味着这些元素以某种方式被持久化。那么为什么不能使用元素的
id

如果您坚持使用它,您可能需要在控制器代码中沿以下行的某个位置添加ParamConverter:

/**
  * @Route("/selectLeg/{element}")
  * @ParamConverter("element", class="YourBundle:Element", options={"mapping": {"name": "element.whatever_param"}})
  * @Template()
  */
public function selectLegAction(Element $element)
事实上,如果Symfony2不知道您的
元素
实体,您将无法对
用户
执行
addElement()

我猜你会在前端得到元素列表,然后尝试更新你的
User
对象。在本例中,我将使用Twig对元素进行json_编码(如果我理解的话,这毕竟是一个简单的数组):

编辑:根据您的评论进行调整。如果您不需要在用户选择特定元素之前保留该元素(leg),则以字符串形式在GET参数、路由参数或POST请求的数据中发送该元素(更干净的解决方案)。您不需要id,因为您可以在请求中以JSON字符串的形式传递完整对象

移除无用的
$leg->getId()
getAvailabilities()
以及,它实际上不做任何事情,并且id也不存在


如果我没有抓住要点,并且
$leg
对象太复杂,因此无法在JSON中序列化,那么您将需要保存它,因为两个后续请求需要访问它。

您可以共享一些代码以便我们看到您试图实现的目标吗?完成后,我添加了for循环,我之前试过的链接。。。。但我们仍然错过了有用的代码:您在哪里创建JSON?
元素的值是多少?你的实体是什么?此外,你的小树枝模板中的
l
没有引用任何内容;循环变量似乎是
element
…是的,我的错,“l”表示元素。我添加了这些元素的结构。谢谢你的回答。我尝试了您的解决方案,但仍然面临着相同的问题:如果不持久化实体,我就无法获得生成路由的标识符。我添加了我的代码的其余部分,并更改了问题以使其尽可能清楚。请参阅我的更新答案。对我来说,通过POST或GET发送完整对象是最好的解决方案,因为对象看起来是可序列化的。那么,您不需要标识符。如果你不能做到这一点,你将需要在两个请求之间的某个地方保留你的分支…我尝试了你的更新答案,我可以发送元素,但由于某种原因,json是空的。但是,我试图在细枝编码之前转储元素,它已满。虽然我不知道为什么会被清除,但我认为我的问题方向是正确的。您可能想看看
json\u encode
选项:。如果你让它工作,也请接受我的回答;
FlightController.php on line 55:
array:4 [▼
  0 => {#953 ▼
    +"3e1f975601f59090decc8f2d5ced72010162e48e": {#954 ▼
  +"lfi_from": "FR58957"
  +"lfi_to": "FR45300"
  +"datetime": "2015-09-10 20:00:00"
  +"nb_pax": "4"
  +"availabilities": array:1 [▼
    0 => {#955 ▶}
  ]
}
  }
  1 => {#956 ▼
+"3e1f975601f59090decc8f2d5ced72010162e48e": {#957 ▼
  +"lfi_from": "FR45300"
  +"lfi_to": "AG00060"
  +"datetime": "2015-09-10 23:00:00"
  +"nb_pax": "4"
  +"availabilities": array:1 [▼
    0 => {#958 ▶}
  ]
}
}
2 => {#959 ▼
+"3e1f975601f59090decc8f2d5ced72010162e48e": {#960 ▼
  +"lfi_from": "FR45300"
  +"lfi_to": "AG00060"
  +"datetime": "2015-11-30 23:00:00"
  +"nb_pax": "4"
  +"availabilities": array:1 [▼
    0 => {#961 ▶}
  ]
}
}
3 => {#962 ▼
+"3e1f975601f59090decc8f2d5ced72010162e48e": {#963 ▼
  +"lfi_from": "FR45300"
  +"lfi_to": "OLOLOL"
  +"datetime": "2015-09-18 23:00:00"
  +"nb_pax": "2"
  +"availabilities": array:1 [▼
    0 => {#964 ▶}
  ]
 }
}
]
/**
  * @Route("/selectLeg/{element}")
  * @ParamConverter("element", class="YourBundle:Element", options={"mapping": {"name": "element.whatever_param"}})
  * @Template()
  */
public function selectLegAction(Element $element)
<a href="{{ path('selectLeg', {'legAsJSONString': element|json_encode}) }}">Select this leg</a>
/**
  * @Route("/selectLeg/{legAsJSONString}")
  */
public function selectLegAction($legAsJSONString) {

  $e = json_decode($legAsJSONString);

  $leg = new Leg();
  $leg->setWhateverParameter($e->parameter_in_the_array);
  // more parameters here
  $em->persist($leg)->flush();

  /// Now here you have $leg->getId(); if  ever you need it

}