2016-01-13 8 views
5

Ho bisogno di accedere a un'entità in twig da symfony2. All'interno del controler, posso fare qualcosa come:Il metodo redirectToRoute() può avere argomenti come render()?

return $this->render('frontendBundle::carrodecompras.html.twig', array(
     'entity' => $entity 
)); 

E poi nel ramo posso accedere alle proprietà di entità con entity.name e così via.

ho bisogno di ottenere la stessa cosa, ma con la funzione redirectToRoute()

return $this->redirectToRoute('frontend_carrodecompras', array(
     'entity' => $entity, 
)); 

Ma non sembra funzionare.

sto ottenendo il seguente errore:

Variabile "entità" non esiste in frontendBundle :: carrodecompras.html.twig alla linea 32

EDIT: sto usando Symfony 2.7

esiste la $ entità variabile (in realtà è chiamato $ cortina in app stavo usando $ entità di semplificazione), poco prima che la funzione redirectToRoute ho fatto questo per testarlo

echo "<pre>"; 
var_dump($cortina); 
echo "</pre>"; 

return $this->redirectToRoute('frontend_carrodecompras', array(
       'cortina' => $cortina, 
       )); 

E il risultato è questo:

object(dexter\backendBundle\Entity\cortina)#373 (16) { 
    ["id":"dexter\backendBundle\Entity\cortina":private]=> 
    int(3) 
    ... 

Questo è il codice Twig:

<tr> 
    {% set imagentela = "img/telas/" ~ cortina.codInterno ~ ".jpg" %} 
    <td><img src="{{ asset(imagentela | lower) }}" alt="" width="25" height="25"> 
    </td> 
    <td>{{ cortina.nombre }}</td> 
    <td>{{ "$" ~ cortina.precio|number_format('0',',','.') }}</td> 
</tr> 
+0

È necessario confermare e accertarsi che "$ entity" effettivamente esista. – jbafford

+0

l'entità viene mantenuta nel database prima che venga chiamato il metodo redirectToRoute, quindi l'entità $ esiste! – enlego

+0

Dubito che '$ entità' esista in realtà dove stai chiamando' redirectToRoute'. Puoi fornire un contesto aggiuntivo? Forse la funzione che sta chiamando redirectToRoute se non è troppo grande? O almeno mostrando il percorso del codice da dove viene definito '$ entity' dove viene utilizzato? – jbafford

risposta

11

Quando si chiama redirectToRoute($route, array $parameters) da un controller, $parameters viene utilizzato per generare i token URL, non variabili da rendere in vista , questo viene fatto dal controller assegnato alla route a cui si sta reindirizzando.

esempio:

class FirstController extends Controller 
{ 
    /** 
    * @Route('/some_path') 
    */ 
    public function someAction() 
    { 
     // ... some logic 
     $entity = 'some_value'; 

     return $this->redirectToRoute('some_other_route', array('entity' => $entity)); // cast $entity to string 
    } 
} 

class SecondController extends Controller 
{ 
    /** 
    * @Route('/some_other_path/{entity}', name="some_other_route") 
    */ 
    public function otherAction($entity) 
    { 
     // some other logic 
     // in this case $entity equals 'some_value' 

     $real_entity = $this->get('some_service')->get($entity); 

     return $this->render('view', array('twig_entity' => $real_entity)); 
    } 
} 
+0

Questa soluzione ha risolto il problema. Non stavo passando la variabile $ entity nell'altraAction (quella a cui stavo inizialmente reindirizzando). – enlego

1

$this->redirectToRoute('something', array('id' => 1) è un wrapper convenienza per $this->redirect($this->generateUrl('something', array('id' => 1))). Costruisce un URL con i tuoi parametri e si aspetta che il valore dei parametri sia una stringa o un numero.

http://symfony.com/blog/new-in-symfony-2-6-new-shortcut-methods-for-controllers

è necessario o passare l'ID del soggetto per poi recuperare i dati nella nuova azione o scomposizione in singoli pezzi di dati prima che colpisca la chiamata redirectToRoute().

class MyController extends Controller { 
    public function myAction(){ 
     $cortina = new Cortina(); 
     $cortina->something = "Some text"; 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($cortina); 
     $em->flush(); 

     return $this->redirectToRoute('frontend_carrodecompras', array(
      'id' => $cortina->getId() 
     ); 
    } 
} 
Problemi correlati