Laravel 4: перенаправление запроса post на другой метод контроллера

у меня есть контроллер, как показано ниже,
MyController:

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

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

Я хочу вызвать метод a внутри MyController по данным в должности значение.

маршруты.в PHP

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

Как я могу это сделать ?

3 ответов


то, что я думаю, было бы более чистым решением, - это отправить ваш запрос на разные URL-адреса в зависимости от вашего флага и иметь разные маршруты для каждого, которые сопоставляются с вашими методами контроллера

Route::post('/flag', 'MyController@methodA');
Route::post('/', 'MyController@methodB);

EDIT:

чтобы сделать это по-своему, Вы можете использовать этот фрагмент

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());
    }
});

источник

или

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

источник

и просто отметить - У меня есть абсолютно нулевой практический опыт работы с Laravel, я просто искал и нашел это.


согласно вашему ответу в комментариях, вам нужно 1 url и решить, какой метод использовать на основе значения $_POST. Это то, что вам нужно:

в своем Routes.php файл, добавьте общий метод, который

Route::post('/', 'MyController@landingMethod);

в своем :

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;
}  

надеюсь, что это помогает!


это для Laravel 4.X. При использовании Laravel 5 необходимо добавить пространства имен... Вопрос о Laravel 4


на Route::controller() метод-это то, что вам нужно.

ваши файлы маршрутов должны выглядеть следующим образом:

Route:post('/', function(){
    $flag = Input::get('flag');
    if($flag == 1) {
        Route::controller('/', 'MyController@methodA');
    } else {
        Route::controller('/', 'MyController@methodB');
    }
});

и методы будут выглядеть так:

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

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