2015-11-08 3 views
5

Как передать массив в качестве параметра для действия контроллера с помощью Symfony 2? Не могли бы вы написать пример того, как определить маршрут, который содержит неизвестный массив длины в качестве параметра. Например, url: http://localhost:8000/blog/post/?tags=[tag1,tag2,tag3], где количество тегов варьируется от 0 до 100. Также пример контроллера для этого маршрута, где действие возвращает значения массива меток.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"). 

URL:

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, но вам все еще нужно explode() для получения параметров.

+0

я удалил требования на всех, но Я получаю ту же ошибку. – olga

+0

@olga вы очистили кеш? –

+0

да я очистил кеш – olga

1

Наконец-то я нашел ответ. Вместо передачи массива лучше кодировать его в строку json. Вот какой пример:

C: \ Bitnami \ wampstack-5.5.30-0 \ sym_prog \ proj3_27 \ SRC \ MeetingBundle \ Controller \ 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 \ Controller \ 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 \ Ресурсы \ Views \ пользователь \ 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 \ Resources \ вид \ пользователь \ 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, чтобы направлять исправление объекта с правильными параметрами.

Смежные вопросы