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