2015-11-08 165 views
5

如何使用Symfony 2将数组作为参数传递给控制器​​操作?你能写一个例子来说明如何定义包含未知长度数组作为参数的路由。例如,url:http://localhost:8000/blog/post/?tags=[tag1,tag2,tag3]其中标记数量从0到100不等。 此路由的示例控制器,其中action返回tags数组的值。Symfony2,如何将数组作为参数传递给控制器​​操作?

使用下面的编码(见的routing.yml及以下Controller.php这样)我得到的错误:

Catchable Fatal Error: Argument 3 passed to Symfony\Component\Routing\Route::__construct() must be of the type array, string given, called in C:\Bitnami\wampstack-5.5.30-0\sym_prog\dctr\vendor\symfony\symfony\src\Symfony\Component\Routing\Loader\YamlFileLoader.php on line 147 and defined in C:\Bitnami\wampstack-5.5.30-0\sym_prog\dctr\app/config\routing.yml (which is being imported from "C:\Bitnami\wampstack-5.5.30-0\sym_prog\dctr\app/config/routing_dev.yml"). 

网址:

http://localhost:8000/blog/post/tag1 
http://localhost:8000/blog/post/tag1/tag2/tag3/tag4 
http://localhost:8000/blog/post/?tags=[tag1,tag2] 

下面是路由和控制器中的文件不同的组合我已尝试到目前为止:

//版本r1,routing.yml

blog_post_tags: 
    path: blog/post/{tags} 
    defaults: { _controller: DefaultController:list_postsByTagActionQ } 
    requirements: 
     tags : "[a-zA-Z0-9,]+" 

//版本R2,routing.yml中

blog_post_tags: 
    resource: "@BlogBundle/Controller/" 
    type:  annotation 
    prefix: /blog/ 
    defaults: { _controller: DefaultController:list_postsByTagActionQ } 

//版本R1,2-C1,Controller.php这样

//http://localhost:8000/blog/post/?tags=[tag1,tag2] . 
/** 
* @Route("/posts/{tags}") 
* @Template() 
*/ 
public function list_postsByTagAction($tags){ 
    var_dump($tags); 
    return array('posts'=>['post1','post2']); 
} 

//版本R1,2-C2,Controller.php这样

//url http://localhost:8000/blog/post/?tags=[tag1,tag2] 
/** 
* @Route("/posts/{tags}") 
* @Method("GET") 
* @Template() 
*/ 
public function list_postsByTagActionQ1(Request $request){ 
    $tags=$request->query->get('tags'); // get a $_GET parameter  
    var_dump($tags); 
    return array('posts'=>['post1','post2']); 
} 

//版本R1,2-C3,Controller.php这样

//url http://localhost:8000/blog/post/?tags=[tag1,tag2] 
/** 
* @Route("/posts/{tags}") 
* @Method("GET") 
* @Template() 
*/ 
public function list_postsByTagActionQ3(Request $request, $tags){   
    var_dump($tags); 
    return array('posts'=>['post1','post2']); 
} 

//版本R3,routing.yml中

blog_post_tags: 
    path: blog/post/{tags} 
    defaults: { _controller: DefaultController:list_postsByTagActionQ } 

//版本R3-C4,Controller.php这样

//url http://localhost:8000/blog/post/?tags=[tag1,tag2] 
public function list_postsByTagActionQ(Request $request){ 
    $tags=$request->query->get('tags'); // get a $_GET parameter 
     var_dump($tags); 
} 
+0

看看这个http://stackoverflow.com/a/15545813/5397119 –

+0

我需要例如使用的routing.yml和Controller.php这样 – olga

+0

值,而不是参数在我的问题形成阵列 – olga

回答

2

嗯,有些尝试之后,我发现一个解决方案。

您可以在路由到该改变你的模式(代码:“[A-ZA-Z0-9 /] +”):

blog_post_tag: 
    path: blog/post/{tags} 
    defaults: { _controller: DefaultController:list_postsByTagActionQ } 
    requirements: 
     tags : "[a-zA-Z0-9\/]+" 

那么你可以传递http://localhost:8000/blog/post/tag1/tag2/tag3/tag4,但你仍然需要爆炸()获取参数。

+0

我已删除了要求不惜一切,但我得到同样的错误。 – olga

+0

@olga你清除了缓存吗? –

+0

是的,我清除缓存 – olga

1

最后,我找到了答案。不要传递数组,最好将其编码为json字符串。下面是类的实例:

C:\ Bitnami \ wampstack-5.5.30-0 \ sym_prog \ proj3_27 \ SRC \ MeetingBundle \控制器\ UserController.php

.. 
    /** 
    * Displays a form to edit an existing User entity. 
    * 
    * @Route("/{id}/edit", name="user_edit") 
    * @Method({"GET", "POST"}) 
    */ 
    public function editAction(Request $request, User $user) 
    { 
.. 
$bredArr=array('user_edit' => array ( 'id'=>$user->getId())); 
.. 
     return $this->render('MeetingBundle::user/edit.html.twig', array(
      'user' => $user, 
      'edit_form' => $editForm->createView(), 
      'image_form' => $imageForm->createView(), 
      'delete_form' => $deleteForm->createView(), 
      'bredArr'=>$bredArr, 
     )); 

C:\ Bitnami \ wampstack- 5.5.30-0 \ sym_prog \ proj3_27 \ SRC \ MeetingBundle \控制器\ ImageController.php ..

/** 
    * Deletes a Image entity without displaying forms. nf = no forms 
    * 
    * @Route("/{id}/deletenf/{bredArrJ}", name="image_deletenf") 
    * @Method("GET|POST") 
    */  
    public function deletenfAction(Request $request, $id, $bredArrJ) 
    { 

     $bredArr=json_decode($bredArrJ, $assoc = true); 

      $em = $this->getDoctrine()->getManager(); 
      $entity = $em->getRepository('MeetingBundle:Image')->find($id); 
      if (!$entity) { 
       throw $this->createNotFoundException('Unable to find Image entity.'); 
      } 
      $em->remove($entity); 
      $em->flush(); 

      if(array_key_exists('image_delete', $bredArr)) { 
       return $this->redirect($this->generateUrl('image_index')); 
      } 
      else if (array_key_exists('user_edit', $bredArr)){ 
       return $this->redirect($this->generateUrl('user_edit', array('id'=>$bredArr['user_edit']['id']))); 
      }  
      else if { 
       //redirect to other pages according key in $bredArr 
      } 
    }  

C:\ Bitnami \ wampstack-5.5.30-0 \ sym_prog \ proj3_27 \ SRC \ MeetingBundle \资源\意见\用户\ edit.html。小枝

{# dispplays user, user_delete and image uplaod forms, also shows images which belongs to user, retrieving them via ManyToMany realation in User entity field "imgsuni" #} 
{% for img in user.imgsuni %} 
<br> {% include 'MeetingBundle:user:userimg.html.twig' %} 
{% endfor %} 

C:\ Bitnami \ wampstack-5.5.30-0 \ sym_prog \ proj3_27的\ src \ MeetingBundle \资源\意见\用户\ userimg.html.twig

<img src="{{ asset('bundles/meeting/images/uploads/'~img.path~'') }}" height="100" /> 
<br><a href="{{ path('image_deletenf', { 'id': img.id, 'bredArrJ' : bredArr|json_encode }) }}"> Delete image </a> 
"{{ img.title }}". 

$ bredArr是在User控制器edit_user操作中创建的变量。它用作路径变量image_deletenf中的一个参数。我不知道如何将它作为数组传递,但是如果编码为Json字符串,它将起作用。我需要image_deletenf操作,以便能够重定向到我想要的路径。我可以从用户,事件和评论实体中删除图像,因此在删除后,我想回到用户,事件或评论,而不是默认的image_index,因此我需要此$bredArr以正确的参数指向正确的实体。

相关问题