2015-11-08 20 views
5

Come passare l'array come parametro all'azione del controller utilizzando Symfony 2? Potresti scrivere un esempio su come definire il percorso, che contiene un array di lunghezza sconosciuta come parametro. Per esempio url: http://localhost:8000/blog/post/?tags=[tag1,tag2,tag3] dove il numero di tag varia da 0 a 100. Anche il controller di esempio per questa rotta, dove l'azione restituisce i valori della matrice di tag.Symfony2, Come passare l'array come parametro all'azione del controller?

Utilizzando il seguente codifica (vedi routing.yml e controller.php sotto) sto ottenendo l'errore:

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] 

Qui di seguito sono diverse combinazioni di file di routing e di controller ho provato finora:

// versione R1, routing.yml

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

// versione R2, routing.yml

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

// versione 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']); 
} 

// versione 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']); 
} 

// versione 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']); 
} 

// versione r3, routing.yml

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

// versione 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

aspetto questo http://stackoverflow.com/a/15545813/5397119 –

+0

ho bisogno esempio con routing.yml e controller.php – olga

+0

valori, non dei parametri nella mia interrogazione costituisce una matrice – olga

risposta

2

Bene, dopo alcuni tentativi ho trovato soluzione successiva.

È possibile modificare il vostro modello di routing per questo (tags: "[a-zA-Z0-9 /] +"):

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

Poi si può passare http://localhost:8000/blog/post/tag1/tag2/tag3/tag4, ma è ancora necessario esplode() per ottenere i parametri.

+0

Ho rimosso i requisiti a tutti, ma sto ottenendo lo stesso errore. – olga

+0

@olga hai cancellato la cache? –

+0

sì ho cancellato la cache – olga

1

Infine, ho trovato una risposta. Invece di passare un array, meglio codificarlo su una stringa json. Ecco tipo di esempio:

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 \ risorse \ vista \ user \ edit.html.ramoscello

{# 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 \ vista \ user \ 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 è variabile creata nell'azione User controller edit_user. Viene utilizzato come argomento nella variabile di percorso image_deletenf. Non so come passarlo come array, ma funziona se codificato come stringa Json. Ho bisogno dell'azione image_deletenf, per poter reindirizzare ai percorsi dove voglio. Posso cancellare le immagini da entità utente, evento e commento, quindi dopo la cancellazione vorrei tornare all'utente, evento o commento invece di default image_index, quindi ho bisogno di questo $bredArr per dirigere l'entità corretta con i parametri corretti.

Problemi correlati