我很困惑.. 我正在运行Symfony2.3。
我有一个控制器,如果提交了表单,则会转发到单独的控制器。
if ($form->isValid()) {
$response = $this->forward('MusicMBundle:Song:addTrackToSong', array(
'Track'=>$Track,
));
return $response;
}
但是,可以看出,Track参数通过此转发传递给下一个(简化的)控制器,使用另一种形式。
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 :(得分:1)
您的路线可能不正确,因为它没有参数。您可以尝试在路由文件中添加Track参数:
pattern: /addTrackToSong
到此:
pattern: /addTrackToSong/{Track}
如果您访问网址 / addTrackToSong / yourTrackValue , SongController :: addTrackToSongAction 方法中的$ Track将等于 yourTrackValue 。
解决问题的另一种方法是在操作方法中设置$ Track的默认值。
public function addTrackToSongAction(Request $request, $Track = null) {
答案 1 :(得分:-1)
一个简单易行的解决方案是序列化和反序列化(现场测试)。它实际上将任何对象(也是数组)转换为字符串并返回,因此您可以在URL中使用它。
将对象编码为字符串:
$track_object_as_string = urlencode(base64_encode(gzcompress(serialize($Track))));
将字符串解码为对象:
$Track = urldecode(unserialize(gzuncompress(base64_decode($track_object_as_string)));