Может ли метод 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>
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));
}
}
$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()
);
}
}