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

Php 通过symfony2中的控制器传递对象,php,symfony,web,controllers,Php,Symfony,Web,Controllers,我很困惑。。 我正在运行Symfony2.3 我有一个控制器,如果提交表单,它将转发给一个单独的控制器 if ($form->isValid()) { $response = $this->forward('MusicMBundle:Song:addTrackToSong', array( 'Track'=>$Track, )); return $response; } 但是,可以

我很困惑。。 我正在运行Symfony2.3

我有一个控制器,如果提交表单,它将转发给一个单独的控制器

   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
我是框架的初学者,我不知道从哪里开始,也找不到任何东西

如果我能提供任何其他信息让我知道


非常感谢

您的路线可能不正确,因为它没有参数。您可以通过以下方式更改布线文件中的模式,尝试在布线中添加轨迹参数:

pattern: /addTrackToSong
为此:

pattern: /addTrackToSong/{Track}
如果访问url/addTrackToSong/yourTrackValue,SongController::addTrackToSongAction方法中的$Track将等于yourTrackValue

解决此问题的另一种方法是在action方法中为$Track设置默认值

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

一个简单易行的解决方案是序列化和反序列化(现场测试)。它实际上将任何对象(也包括数组)转换为字符串并返回,因此您可以在URL中使用它

将对象编码为字符串:

    $track_object_as_string = urlencode(base64_encode(gzcompress(serialize($Track))));
将字符串解码为对象:

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

您是否尝试删除Request参数并使用
$this->getRequest()
而不是指向错误的路由(转发路由)或$Track应为空
公共函数addTrackToSongAction(Request$Request,$Track=null)
,但我赞成第一个。感谢您的回复。所以我尝试使用参数进行路由,但是Track实际上是一个对象,作为一个数组传递,大约有10个值。当我添加null参数时,传递null,而不是传递本身的轨迹。我想我会尝试使用跟踪id,然后在下一页从实体管理器获取它。虽然效率不高,但我还是感到困惑。再次感谢!轨迹对象是实体吗?在这种情况下,只需将Track实体的ID作为参数传递,并在需要时使用该ID再次加载整个对象。完美!我还没更新完我的帖子,你就已经回复了。听起来这应该是个好计划。谢谢是的,我想应该。毕竟,这就是标识符的作用,不是吗?;)如果您仍然有问题,请告诉我们:)如果他不想在URL中提供trackid,该怎么办?这可能是安全漏洞。假设您只能访问一个trackid。使用URL中的这种模式,您可以轻松地输入任何您想要的内容。你必须以不同的方式实现它,这很糟糕。所以,没有办法将对象传递给控制器?这是无用的,因为URL有长度限制,永远不要使用它。如果你有足够短的对象,我不同意你的看法。URL可以有2000个字符长,这对于一个相当长的压缩对象来说已经足够了。但我不鼓励这种做法,它被认为是一种黑客行为,而不是一种良好的做法。