2013-07-13 3 views
1

Я очень озадачен. Я бегу Symfony2.3.Передача объектов через контроллеры в symfony2

У меня есть контроллер, который отправляет отдельный контроллер, если форма отправлена.

if ($form->isValid()) { 
     $response = $this->forward('MusicMBundle:Song:addTrackToSong', array(
      'Track'=>$Track, 
      )); 
     return $response; 
    } 

Однако, как можно видеть, параметр трека проходит через эти вперед к следующему (упрощенному) контроллеру, с другой формой.

public function addTrackToSongAction(Request $request, $Track){ 
      if ($form->isValid()) { 
       //LOGIC 
       return $this->redirect($this->generateUrl('MusicMBundle_homepage')); 
      } 
      return $this->render('MusicMBundle:Song:addtracktosong.html.twig', array(
       'Track' => $Track, 'form' => $form->createView(), 
     )); 

Если я var_dump ($ Track) в любом месте функции, она существует, и именно то, что я хочу, чтобы это было.

Однако, когда вторая форма была отправлена, Symfony2 выдает следующее сообщение об ошибке:

Controller "Music\MBundle\Controller\SongController::addTrackToSongAction()" requires 
that you provide a value for the "$Track" argument (because there is no default value 
or because there is a non optional argument after this one). 

Довольно откровенно я озадачен. У меня есть доступ ко всему, что мне нужно, но symfony очень злится на меня. Думаю, проблема в моей стратегии переадресации?

Вот мой файл маршрутизации, если проблема может быть там:

MusicMBundle_Song_addTrackToSong: 
pattern: /addTrackToSong 
defaults: { _controller: MusicMBundle:Song:addTrackToSong } 
requirements: 
    _method: GET|POST 

Я новичок в рамках, и я просто не знаю, с чего начать и не может найти что-нибудь на нем.

Если я могу предоставить любую другую информацию, дайте мне знать.

Большое спасибо!

+0

вы пытаетесь удалить параметр запроса и использовать '$ this-> GetRequest()' вместо –

+0

Либо вы указываете на неверный маршрут (переадресованный маршрут), либо на $ Track должен быть nullable 'public function addTrackToSongAction (Request $ request, $ Track = null)', но я проголосую за первый. –

ответ

1

Ваш маршрут может быть неправильным, поскольку он не имеет параметров. Вы можете попробовать добавить параметр для трека в вашем маршруте, изменив свой рисунок в файле маршрутизации от этого:

pattern: /addTrackToSong 

к этому:

pattern: /addTrackToSong/{Track} 

Если вы посещаете URL /addTrackToSong/yourTrackValue, $ Трек в SongController :: addTrackToSongAction метод будет равен yourTrackValue.

Другим способом решения проблемы было бы установить значение по умолчанию для $ Track в вашем методе действий.

public function addTrackToSongAction(Request $request, $Track = null) { 
+0

Спасибо за ответ. Поэтому я попытался выполнить маршрутизацию с параметрами, однако Track - фактически объект, переданный как массив с примерно 10 значениями. Когда я добавляю нулевой параметр, значение null передается, а не дорожка, переданная сама по себе. Я думаю, что попробую использовать идентификатор трека, а затем получить его от менеджера сущности на следующей странице. Не совсем эффективный, но я все еще озадачен. Еще раз спасибо! – user2580051

+0

Является ли объект трека сущностью? В этом случае просто передайте идентификатор объекта Track в качестве аргумента и загрузите весь объект снова, когда это необходимо, используя этот идентификатор. – UrGuardian4ngel

+0

Отлично! Вы ответили, прежде чем я даже закончил обновлять свой пост. Похоже, это должен быть хороший план. Благодаря! – user2580051

-1

Одним простым и простым решением является сериализация и десериализация (полевое тестирование). Он фактически преобразует любой объект (также массивы) в строки и обратно, поэтому вы можете использовать его в URL-адресах.

Кодирование объекта в строку:

$track_object_as_string = urlencode(base64_encode(gzcompress(serialize($Track)))); 

декодировании строку в объект:

$Track = urldecode(unserialize(gzuncompress(base64_decode($track_object_as_string))); 
+0

Это просто бесполезно, потому что URL имеет ограничения по длине, никогда не используйте это. – Croll

+0

Я прошу отличить, если у вас достаточно коротких объектов. И URL может составлять 2000 символов, что достаточно для довольно длинного заархивированного объекта. Но я бы не стал его поощрять, это считается скорее хаком, чем хорошей практикой. – lovro

Смежные вопросы