Может ли метод RedirectToRoute() иметь такие аргументы, как render()?


Мне нужно получить доступ к сущности в twig из symfony2. Внутри контроллера я могу сделать что-то вроде:

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

А затем в twig я могу получить доступ к свойствам сущности с помощью entity.name и тому подобного.

Мне нужно выполнить то же самое, но с функцией redirectToRoute()

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

Но, похоже, это не работает.

Я получаю следующую ошибку:

Переменная "сущность" не существует в FrontendBundle::carrodecompras.html.twig в строке 32

ИЗМЕНИТЬ: Я использую Симфония 2.7

Переменная $entity существует (на самом деле она называется $cortina в приложении, которое я использовал для упрощения $entity), как раз перед функцией перенаправления маршрута я сделал это, чтобы проверить ее

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

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

И результат таков:

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

Это код ветки:

<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>
Author: Mohammed Zayan, 2016-01-13

2 answers

Когда вы вызываете redirectToRoute($route, array $parameters) с контроллера, $parameters используется для генерации маркеров URL, а не переменных для отображения в представлении, это делается контроллером, назначенным маршруту, на который вы перенаправляете.

Пример:

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
Author: Heah, 2016-01-13 20:14:46

$this->redirectToRoute('something', array('id' => 1) является удобной оболочкой для $this->redirect($this->generateUrl('something', array('id' => 1))). Он создает URL-адрес с вашими параметрами и ожидает, что значение параметров будет строкой или числом.

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

Вам нужно либо передать идентификатор сущности, чтобы затем извлечь данные в новом действии, либо разбить его на отдельные фрагменты данных, прежде чем он попадет в вызов 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
Author: SacWebDeveloper, 2016-01-13 20:13:35