web-dev-qa-db-fra.com

La méthode redirectToRoute () peut-elle avoir des arguments tels que render ()?

J'ai besoin d'accéder à une entité dans twig depuis symfony2 . À l'intérieur du contrôleur, je peux faire quelque chose comme:

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

Et puis dans twig, je peux accéder aux propriétés de l'entité avec entity.name et ainsi de suite.

Je dois accomplir la même chose mais avec la fonction redirectToRoute()

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

Mais cela ne semble pas fonctionner. 

Je reçois l'erreur suivante:

La variable "entity" n'existe pas dans frontendBundle :: carrodecompras.html.twig à la ligne 32

EDIT: J'utilise Symfony 2.7

La variable $ entity existe (elle s'appelle en fait $ cortina dans l'application que j'utilisais $ entity pour simplifier), juste avant la fonction redirectToRoute, je l'ai fait pour le tester.

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

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

Et le résultat est le suivant:

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

Ceci est le code 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>
7
enlego

Lorsque vous appelez redirectToRoute($route, array $parameters) à partir d'un contrôleur, $parameters est utilisé pour générer les jetons d'URL, et non les variables à afficher, le contrôleur affecté à la route que vous redirigez.

exemple :

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));
    }
}
14
Heah

$this->redirectToRoute('something', array('id' => 1) est un emballage de commodité pour $this->redirect($this->generateUrl('something', array('id' => 1))). Il crée une URL avec vos paramètres et s'attend à ce que la valeur des paramètres soit une chaîne ou un nombre.

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

Vous devez soit transmettre l'ID de l'entité pour récupérer les données de la nouvelle action, soit les diviser en éléments de données individuels avant que l'appel redirige vers 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()
        );
    }
}
1
SacWebDeveloper