2015-09-21 90 views
0

我正在使用一個樹枝來顯示元素列表。這些元素來自API的解碼json數組。選擇一個未實體實體

我有我的用戶和這些元素之間的OneToMany關係。

用戶需要選擇其中一個元素,這些元素將通過addElement()函數添加到用戶中。

我試圖在循環中使用Symfony2窗體,但它只顯示在第一個元素上。我也嘗試使用鏈接到控制器的功能,但因爲沒有這些元素在我的DB是堅持,我得到這個錯誤:

"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 %} 

這裏是我創建並填寫我的元素的功能:

public function getAvailabilities($availabilities, $planes,  $airports) 
{ 
    $reservations = array(); 
    foreach ($availabilities as $ar) 
    { 
     $leg = new Leg(); 
     $leg->getId(); 
     foreach($ar as $a) 
     { 
      $leg = $this->fillLeg($leg, $a); 
      foreach($a->availabilities as $aleg) 
      { 
       $leg->setAirplaneType($this->findPlane($planes, $aleg->airplane_type_id)); 
       $leg->setAirportStart($this->findAirport($airports, $a->lfi_from)); 
       $leg->setAirportEnd($this->findAirport($airports, $a->lfi_to)); 
       $leg->setDurationLeg($aleg->duration); 
       $leg->setEndHour($aleg->datetime_to); 
      } 
      $startdate = $a->datetime; 
     } 
     $reservations[] = $leg; 
    } 
    return $reservations; 
} 

這裏是結果,當我轉儲($元素):

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 ▶} 
    ] 
} 
} 
] 

主要問題是API會返回幾千條結果。出於顯而易見的原因,我無法堅持所有。

我想問的最簡單的方法是「什麼是最好的方式發送一個實體上的數據到另一個功能在我的控制器,沒有堅持這個實體?」。到目前爲止,我一直使用持久化元素,用id作爲標識符,但是當我們處理非持久化實體時,我意識到它變得更加棘手。

+0

你可以分享一些代碼,以便我們可以看到你想要實現的目標嗎? – tchap

+0

完成後,我添加了for循環,以及我之前嘗試的鏈接。 –

+0

...但我們仍然錯過了有用的代碼:你在哪裏創建你的JSON?元素的價值是什麼?你的實體是什麼?另外,你的Twig模板中的'l'不會引用任何內容;循環變量似乎是'元素'... – tchap

回答

0

如果您有一個OneToMany您的User與這些Elements之間的關係,這意味着Elements以某種方式持續存在。那麼爲什麼你不能使用元素的id

在你堅持下去它的情況下,你可能需要在控制器代碼添加ParamConverter沿着這些線路的地方:

/** 
    * @Route("/selectLeg/{element}") 
    * @ParamConverter("element", class="YourBundle:Element", options={"mapping": {"name": "element.whatever_param"}}) 
    * @Template() 
    */ 
public function selectLegAction(Element $element) 

事實是,如果Symfony2的不知道你的Element實體,您將無法對User執行addElement()

我猜的是你在前端得到元素列表,然後嘗試更新User對象。在您的控制器

<a href="{{ path('selectLeg', {'legAsJSONString': element|json_encode}) }}">Select this leg</a> 

,並創建一個新的Element:在這種情況下,我會json_encode你的元素在枝條(這畢竟是我的理解一個簡單的數組)

/** 
    * @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 

} 

編輯:改編髮表您的評論。如果您不需要在用戶選擇特定元素之前保留元素(支線),則以GET參數,路徑參數或POST的數據以字符串形式發送該元素請求(清潔解決方案)。你不需要id,因爲你可以在請求中傳遞完整的對象,作爲JSON字符串。

getAvailabilities()中刪除無用的$leg->getId();,它實際上並沒有做任何事情,而且ID也不存在。

如果我錯過了這一點,而且$leg對象太複雜,因此在JSON序列化沒有,那麼你將需要堅持它,因爲兩個相繼的請求將需要訪問它。

+0

謝謝你的回答。我試過你的解決方案,仍然面臨同樣的問題:沒有堅持我的實體,我不能得到一個標識符來生成路線。我添加了其餘的代碼,並且改變了問題以使其儘可能清楚。 –

+0

查看我的更新回答。對我而言,通過POST或GET發送完整對象是您的最佳解決方案,因爲該對象看起來是可序列化的。那麼你不需要標識符。如果你不能這樣做,你**將需要**堅持你的腿之間的兩個請求... – tchap

+0

我試着用你的更新的答案,我可以發送的元素,但由於某種原因,JSON是空的。但是,我試圖在枝編碼之前轉儲元素,它已滿。儘管我不知道爲什麼它被清除,但我認爲我正在爲我的問題找到正確的方向。 –