7

Mam metody działania w Foo kontrolera, który wymaga parametrów:ZF2: Jak przekazać parametry do wtyczki do przodu, które mogę następnie uzyskać w metodzie, do której je przekazuję?

public function fooAction($one, $two) { 
    $a = one; 
    $b = $two; 
} 

I muszę przekazać do tej metody z innej metody jakiegoś Boo kontrolera. A jeden z tych parametrów musi być zgodny z parametrem. Jedynym przykładem, że the manual ma to:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo')); 

żadne dodatkowe parametry. Ale piszą one:

$ params to opcjonalna tablica parametrów, za pomocą których można wyświetlić obiekt RouteMatch o numerze dla celów tego konkretnego żądania.

Tak, próbowałem:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array(
                 'action' => 'boo', 
                 'one' => &$one, 
                 'two' => $two, 
               )); 

Ale to nie działa.

Czy istnieje sposób przekazania dodatkowych parametrów do kontrolera przekazywania?

UPD:

one nie działają zbyt:

$result = $this->forward()->dispatch('Boo\Controller\Boo', array(
                 'action' => 'boo', 
                 'params' => array(
                  'one' => &$one, 
                  'two' => $two, 
                ))); 


$result = $this->forward()->dispatch('Boo\Controller\Boo', array(
                 'action' => 'boo', 
                 'options' => array(
                  'one' => &$one, 
                  'two' => $two, 
                ))); 

UPD 2:

nadal nie mogę uzyskać funkcjonalność chcę (przekazać parametry Europejska forward wtyczkę), ale znalazłem inne rozwiązania. Przed wywołaniem wtyczki forward ustawić zmienne do obiektu Request i po forward dostaję je z Request w moim boo działaniu mojego Boo \ Controller \ BooController:

// in Foo::fooAction 
$this->getRequest()->one = &$one; 
$this->getRequest()->two = $two; 
$result = $this->forward()->dispatch('Boo\Controller\Boo', array('action' => 'boo')); 

// in Boo::booAction 
$a = $this->getRequest()->one; 
$b = $this->getRequest()->two; 

rozwiązania głupi, to nie będzie działać z żądaniami Ajax. Nadal interesuje mnie przekazywanie parametrów za pomocą wtyczki do przodu. LUB MOŻLIWE, w jaki sposób uzyskać je w wersji booAction. Ponieważ nie ma nic w Request, jeśli przekazać je z forward.

UPD 3 i końcowa:

końcu znalazłem gdzie oni postanowili ukryć parametry mijam z wtyczką forward. Umieszczono je w obiekcie RouteMatch.

- Tryyyy zgadnąć, gdzie ukryliśmy twoje params ... Och, tak, są w RouteMatch, oczywiście, że tam są, czy nie sądzisz, że coś jeszcze?

I NIE MA ŻADNYCH INFORMACJI w sekcji wtyczki forward instrukcji!

Aby uzyskać params, muszę zrobić to w moim BooController::booAction:

$param = $this->getEvent()->getRouteMatch()->getParam('nameOfParam'); 
+0

to 'Boo' jest prawidłowym aliasem sterownika? Jak wskazano w dokumentacji 'Boo' musi być w pełni kwalifikowanym ClassName (np.' Mymodule \ Controller \ BooController') lub powinien być aliasem do tego kontrolera, który definiujesz wewnątrz swojej konfiguracji – Sam

+0

Tak, jest to w pełni kwalifikowana nazwa klasy , to jest ''Boo \ Controller \ Boo'', który mam. Tak pisałem w pytaniu, aby było krótsze. Zmień teraz, aby uniknąć nieprzejrzystości. – Green

+1

To wciąż jest tylko alias. Można bezpiecznie założyć, że masz skonfigurowany alias invokables z 'Boo \ Controller \ Boo' =>' Boo \ Controller \ BooController'? Poza tym twoje pierwsze podejście jest właściwe. Jak sprawdzić, czy są obecne parametry? Czy są one również zdefiniowane w konfiguracji trasy? Blog z Tihs wykorzystuje funkcjonalność, której szukasz: http://www.michaelgallego.fr/blog/2012/10/06/how-to-replace-the-action-helper-in-zf-2-and -make-great-widgetized-content / – Sam

Odpowiedz

6

Można utworzyć klasę pojemnika i używać go w obu kontrolerów

w module.conf

public function getServiceConfig() 
{ 
    return array(
     'invokables' => array(
      'my_handy_container'  => 'path\container_class_name', 
     ) 
    ); 
} 

Utwórz program ładujący w obu kontrolerach:

public function getMyHandyContainer() 
{ 
    if (!$this->myHandyContainer) { 
     $this->myHandyContainer = $this->getServiceLocator()->get('my_handy_container'); 
    } 
    return $this->myHandyContainer; 
} 

i wywołać ją przy użyciu:

$myContainer = $this->getMyHandyContainer()->myHandyContainer; 
$myContainer->foo = 5; // set something 

ZF2 sposób przekazać Vars używając do przodu

W metodzie mijania zrobić:

return $this->forward()->dispatch('controller_name', [ 
    'action' => 'whatever', 
    'varname' => $value, 
    'varname2' => $value2 
]); 

W wywoływanego metody kontrolera zrobić:

$param2 = $this->params()->fromRoute('varname2',false); 
10

Dlaczego nie używać wtyczki params?

Działa to dla mnie:

public function indexAction() { 

     $object = new SomeObject(); 

     return $this->forward()->dispatch('Application\Controller\Index', [ 
       'action'  => 'show', 
       'myObject' => $object, 
     ]); 
    } 

public function showAction() { 

     $object = $this->params('myObject'); 

     var_dump($object); 

     return []; 
} 
1

Dzięki za pytanie, bardzo mi pomogło. Znaleziono prosty sposób na przekazanie wszystkich parametrów do forward() -> dispatch (...). W metodzie działania kontrolera:

$params = $this->params()->fromRoute(); 

zwrotów tablicy $ dane jako dane przekazywane jako $ forward() -> wysyłka ($ controllerName, $ dane).

2

Pomyślałem, że dodam inną opcję, która działa dla mnie.

Możesz po prostu przekazać parametry bezpośrednio do przodu i użyć funkcji routeMatch, aby uzyskać do nich dostęp na drugim końcu.

return $this->forward() 
      ->dispatch('Module\Controller\Foo', array(
              'action' => 'bas', 
              'id' => 6) 
              ); 

Przechodzi do Foo Controller, basAction w tej metodzie można następnie użyć następującego kodu, aby uzyskać dostęp param id

$myParam = (int) $this->getEvent()->getRouteMatch()->getParam('id'); 

nie wiem, czy to spełnia określone wymagania - ale pracuje dla mnie.

1

Here in the official ZF2 documentation jest napisane dokładnie, jak to działa:

$params jest opcjonalną tablicę parametrów z których do materiału siewnego obiekt RouteMatch dla celów tego konkretnego wniosku. Znaczenie parametrów zostanie dopasowane przez ich klucz do identyfikatorów routingu w konfiguracji (w przeciwnym razie niepasujące klucze zostaną zignorowane).

Tak mijają tak:

$params = array(
    'foo' => 'foo', 
    'bar' => 'bar' 
); 
$this->forward()->dispatch('My\Controller', $params) 

a następnie można uzyskać trasy params meczu w swojej My\Controller jak zwykle:

$foo = $this->params()->fromRoute('foo'); 
$bar = $this->params()->fromRoute('bar'); 

Dla osób borykających się z dostępu do parametrów w swoim kontrolerze tu miły omówienie od this CheatSheet.

$this->params()->fromPost('foo'); //POST 
$this->params()->fromQuery('foo'); //GET 
$this->params()->fromRoute('foo'); //RouteMatch 
$this->params()->fromHeader('foo');//Header 
$this->params()->fromFiles('foo'); //Uploaded file 
Powiązane problemy