通过symfony2中的控制器传递对象

时间:2013-07-13 23:03:52

标签: php symfony web controllers

我很困惑.. 我正在运行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

我是框架的初学者,我只是不知道从哪里开始,也找不到任何内容。

如果我能提供任何其他信息,请告诉我。

非常感谢!

2 个答案:

答案 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)));