2012-01-03 27 views
11

Tüm GET/POST paramları geçerek bir isteği iletmek mümkün mü? Symfony 2 Forward Request GET/POST paramları boyunca geçiş

Ben sadece

$this->forward('dest') 

Ben herhangi bir GET/POST params olmadan dest gidecek yaparsanız düşünüyorum?

GÜNCELLEME

Benim amacım kullanıcı yeterli "öğeleri" sahip olduğunu çekleri alır addSomething gibi bir kontrolör eylemi olması aslında şey eklemek. Ardından, {Type} Something

eklemenin eklenmesine devam etmek için isteği uygun denetleyiciye iletin Veya denetimin daha uygun olmasını sağlayan tüm denetleyicilerinde "denetim" hizmeti alır mı? Her neyse, ben her bir denetçi eylemine iletmek için bilmek onun bilgilendirici sadece ileriye parametre olarak talep sınıfını geçmek olacaktır

cevap

15

burada herhangi bir neden görmüyorum geri çekirdek üzerinden isteği iletmek. Bu mantığı, önerdiğiniz gibi bir denetleyici hizmetinde kapsülleme yoluna gidebilir veya yönlendirici dinleyiciden sonra çalışan bir kernel.request dinleyicisi oluşturabilir ve yalnızca koşullarınız karşılandığında _controller özniteliğini uygulayabilirsiniz.

Örneğin

bu routing.yml:

some_route: 
    pattern: /xyz 
    defaults: { _controller_candidate: "FooBundle:Bar:baz" } 

Bu dinleyici:

services: 
    my_listener: 
     class: MyListener 
     tags: 
      - 
       name:  kernel.event_listener 
       event: kernel.request 
       priority: -10 

önceliği: sonra çekirdek yönlendirici dinleyici çalıştırmak için yapılandırılmış

class MyListener 
{ 
    public function onKernelRequest($event) 
    { 
     $request = $event->getRequest(); 
     if (!$controller = $request->attributes->get('_controller_candidiate')) { 
      return; 
     } 

     if (/* your logic... */) { 
      $request->attributes->set('_controller', $controller'); 
     } 
    } 
} 

çekirdek yönlendirici dinleyiciSymfony 2.1'deve Symfony 2.1'de 32. Her iki durumda da, -10'un bir önceliği çalışmalıdır. Bu işe yararsa :)

+0

Bu işe yarıyor gibi görünüyor. Daha sonra denedikten sonra çalışıp çalışmadığını günceller. Tersini yapmak istiyorsam, bir kontrolör eyleminden sonra bir şeyler yap, benzer bir olay var mı? Belli ki bu belgelenmemiş yöntemleri nasıl öğreniyorsunuz? –

+0

Tamam, http://symfony.com/doc/2.0/book/internals.html#handling-requests yanıtımı buldum. Wonder kullanmak için doğru yöntem hangisi? 'Kernel.response'? –

+0

Oh '@ Route' ek açıklamasını kullanıyorum, $ request-> attributes-> get ('_ controller_candidiate')' nasıl değiştirebilirim? –

27

En kolay çözüm (ve muhtemelen için gitmek istiyorum bir) params düşünüyorum

public function indexAction() 
{ 
    $request = $this->getRequest(); 

    return $this->forward('AcmeBundle:Forward:new', array('request' => $request)); 
} 

Ve iletilen eylem sadece yöntem param olarak kullanmak:

public function testAction($request) 
{ 
    var_dump($request);exit; 
} 
+4

tüm sorgu parametresi geçmesi ANCAK olabilir - hem eylem ('yönlendirme' ve 'iletilir') eğer formları var gönderimler, bir tuzağa düşersiniz - 'iletilen' eylemi $ _POST formunu önceki denetleyiciden görür, bu nedenle CSRF Simgesini çöker (geçersiz, önceki formdan. – thorinkor

+0

@thorinkor Çevresinde geçerli bir yol var mı? Bir şekilde rejenere ettim: Service security.csrf.token_manager ve getToken() ile çalıştım ama şans yok – userfuser

+0

@userfuser en iyi çözüm - bunu önlemek :) Belki de 1. form isteğinden alıp iletme yönteminde yeniden gönderebilir misiniz? – thorinkor

0

Yönlendirme "yolu" olarak "istek bağlıyor" de görmek istiyorum

benim için çalışıyor:

public function indexAction() 
{ 
    $path = $this->getRequest()->attributes->all(); 
    return $this->forward('CompMyBundle:MyController:MyAction', $path); 
} 

$ yolunu [ '_ kontrolör'] üzerine yazılır forward() yöntemi!

7

Tüm POST paramları otomatik olarak iletilir. Hedef kontrolörde POST parametresine sahip olmak için herhangi bir işlem yapılmasına gerek yoktur. Ancak, sorgu (GET) param ve yol param'lerini açıkça iletmeniz gerekir. Yönlendirme yöntemi, sırasıyla pathParam ve queryParam dizilerini temsil eden 2 isteğe bağlı parametre alır.formlarla oynarken sadece olabilir ... bir sorun Geçerli isteğin

public testAction(Request $request){ 
    $pathParam = array(); //Specified path param if you have some 
    $queryParam = $request->query->all(); 
    $response = $this->forward("AcmeBundle:Forward:new", $pathParam, $queryParam); 
} 
+0

orijinal soruya en iyi cevap – Black