2014-09-11 7 views
6

Ho un controller come qui di seguito,
MyController:laravel 4: reindirizzare una richiesta POST al diverso metodo di controllo

public function methodA() { 
    return Input::get('n')*10; 
} 

public function methodB() { 
    return Input::get('n')*20; 
} 

voglio chiamare il metodo all'interno MyController in base alle POST valore.

routes.php

Route::post('/', function(){ 
    $flag = Input::get('flag'); 
    if($flag == 1) { 
     //execute methodA and return the value 
    } else { 
     //execute methodB and return the value 
    } 
}); 

Come posso fare questo?

+0

È possibile utilizzare un doppio punto dopo "Itinerario" per iniziare: D –

+0

Ci scusiamo per questo. – palatok

+0

Solo un suggerimento selvaggio, perché non utilizzare un parametro url extra e risparmia questo problema –

risposta

6

Quello che penso sarebbe una soluzione più pulita è quella di inviare la richiesta posta al diverso URL in base alla bandiera e percorsi diversi per ciascuna, quella mappa per i metodi del controller

Route::post('/flag', '[email protected]'); 
Route::post('/', '[email protected]); 

EDIT:

Per fare a modo tuo, è possibile utilizzare questo frammento

Route:post('/', function(){ 
    $app = app(); 
    $controller = $app->make('MyController'); 
    $flag = Input::get('flag'); 
    if($flag == 1) { 
     return $controller->callAction('methodA', $parameters = array()); 
    } else { 
     return $controller->callAction('methodB', $parameters = array()); 
    } 
}); 

Source

O

Route:post('/', function(){ 
    $flag = Input::get('flag'); 
    if($flag == 1) { 
     App::make('MyController')->methodA(); 
    } else { 
     App::make('MyController')->methodB(); 
    } 
}); 

Source

E solo per notare - Ho assolutamente zero esperienza pratica con Laravel, ho appena cercato e trovato questo.

+0

mi è stato chiesto di farlo in altro modo – palatok

+0

@palatok Aggiornato. –

+0

GRANDE! ha funzionato. Molte grazie . – palatok

3

Questo è per Laravel 4.x. Quando si utilizza laravel 5, è necessario aggiungere spazi dei nomi ... La domanda è di circa laravel 4


Il metodo Route::controller() è quello che serve.

I file rotte dovrebbe assomigliare a questa:

Route:post('/', function(){ 
    $flag = Input::get('flag'); 
    if($flag == 1) { 
     Route::controller('/', '[email protected]'); 
    } else { 
     Route::controller('/', '[email protected]'); 
    } 
}); 

E i metodi sarebbe simile a questa:

public function methodA() { 
    return Input::get('n') * 10; 
} 

public function methodB() { 
    return Input::get('n') * 20; 
} 
+1

Sto ricevendo ReflectionException (-1) La classe non esiste – palatok

+0

Questo è per Laravel 4.x. Quando usi Laravel 5, devi aggiungere Namespace ... La domanda riguarda Laravel 4 –

3

In base alla risposta nei commenti, è necessario l'URL 1 e decidere quale metodo utilizzare in base al valore $ _POST. Questo è quello che vi serve:

Nel file Routes.php, aggiungere un metodo generale che

Route::post('/', '[email protected]); 

Nel file MyController:

public function landingMethod() { 
    $flag = Input::get('flag'); 
    return $flag == 1 ? $this->methodA() : $this->methodB();//just a cleaner way than doing `if...else` to my taste 
} 

public function methodA() { //can also be private/protected method if you're not calling it directly 
    return Input::get('n') * 10; 
} 

public function methodB() {//can also be private/protected method if you're not calling it directly 
    return Input::get('n') * 20; 
} 

Spero che questo aiuti!

+0

Bella soluzione. Ma in realtà ho più controller, e non credo che chiamare un controller da un altro controller non sia così carino. Comunque grazie per la tua gentile risposta – palatok

Problemi correlati