Symfony2,如何将数组作为参数传递给控制器操作?
如何使用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);
}
嗯,有些尝试之后,我发现一个解决方案。
您可以在路由到该改变你的模式(代码:“[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,但你仍然需要爆炸()获取参数。
最后,我找到了答案。不要传递数组,最好将其编码为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
以正确的参数指向正确的实体。
看看这个http://*.com/a/15545813/5397119 –
我需要例如使用的routing.yml和Controller.php这样 – olga
值,而不是参数在我的问题形成阵列 – olga