Laravel 4:将发布请求重定向到不同的控制器方法

时间:2014-09-11 19:45:23

标签: php laravel-4 laravel-routing

我有一个如下控制器,
MyController:

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

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

我想根据 POST 值调用 MyController 中的方法。

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

我该怎么做?

3 个答案:

答案 0 :(得分:6)

我认为更清洁的解决方案是根据您的标志将您的发布请求发送到不同的网址,并为每个网址设置不同的路由,这些路由映射到您的控制器方法

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

编辑:

按照您的方式执行,您可以使用此代码段

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

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

<强> Source

请注意 - 我对Laravel的实践经验绝对没有,我只是搜索并发现了这一点。

答案 1 :(得分:3)

这适用于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;
}  

答案 2 :(得分:3)

根据您在评论中的回答,您需要1个网址并根据$ _POST值决定使用哪种方法。这就是你需要的:

Routes.php文件中,添加

的常规方法
Route::post('/', 'MyController@landingMethod);

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

希望这有帮助!