2015-11-08 2 views
5

Wie man Array als Parameter an Controller-Aktion mit Symfony 2 übergeben? Könnten Sie bitte ein Beispiel schreiben, wie man eine Route definiert, die ein Array unbekannter Länge als Parameter enthält. Zum Beispiel url: http://localhost:8000/blog/post/?tags=[tag1,tag2,tag3], wobei die Anzahl der Tags von 0 bis 100 variiert. Auch Beispiel-Controller für diese Route, wobei Aktion Werte von Tags-Array zurückgibt.Symfony2, Wie übergebe ich Array als Parameter an die Controller-Aktion?

mit dem folgenden Codierung (siehe routing.yml und controller.php unten) Ich erhalte die Fehlermeldung:

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] 

Im Folgenden sind verschiedene Kombinationen von Routing und Controller Dateien ich habe bisher versucht:

// Version r1, routing.yml

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

// Version r2, routing.yml

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

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

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

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

// Version r3, routing.yml

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

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

Blick dieses http://stackoverflow.com/a/15545813/5397119 –

+0

I Beispiel mit routing.yml benötigen und – olga

+0

Werte, die Parameter nicht in meiner Frage controller.php ein Array bildet – olga

Antwort

2

Nun, nach einigen Versuchen wir nächste Lösung gefunden haben.

Sie können Ihr Muster in das Routing zu dieser Änderung (tags: "[a-zA-Z0-9 /] +"):

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

Dann können Sie http://localhost:8000/blog/post/tag1/tag2/tag3/tag4 passieren, aber Sie müssen noch explode() zum Abrufen von Parametern.

+0

i an allen Anforderungen entfernt haben, aber Ich bekomme den gleichen Fehler. – olga

+0

@olga hast du den Cache gelöscht? –

+0

ja ich habe den Cache gelöscht – olga

1

Endlich fand ich eine Antwort. Anstatt ein Array zu übergeben, kodieren Sie es besser in eine JSON-Zeichenfolge. Hier ist eine Art Beispiel:

C: \ Bitnami \ wampstack-5.5.30-0 \ sym_prog \ proj3_27 \ src \ MeetingBundle \ Controllers \ 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 \ Controllers \ 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 \ Ressourcen \ ansichten \ benutzer \ 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 Zweig: \ Bitnami \ wampstack-5.5.30-0 \ sym_prog \ proj3_27 \ src \ MeetingBundle \ Resources \ Ansichten \ 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 ist Variable erstellt in User Controller edit_user Aktion. Es wird als Argument in der Pfadvariablen image_deletenf verwendet. Ich weiß nicht, wie man es als Array übergibt, aber es funktioniert, wenn es als Json-String kodiert wird. Ich brauche Aktion, um auf Pfade umleiten zu können, wo ich will. Ich kann Bilder von Benutzer-, Ereignis- und Kommentarentitäten löschen, daher möchte ich nach dem Löschen zurück zu Benutzer, Ereignis oder Kommentar anstelle von default image_index, also brauche ich $bredArr, um die korrekte Entität mit korrekten Parametern zu korrigieren.

Verwandte Themen