如何在Laravel中为相同模式路由GET和POST?

60

有人知道在Laravel 4中是否有将这两行代码合并为一行的方式吗?

Route::get('login', 'AuthController@getLogin');
Route::post('login', 'AuthController@postLogin');
所以,现在你只需要写一个方法,因为它们都使用“相同”的方法,URL仍然保持为site.com/login,而不是重定向到site.com/auth/login?我很好奇,因为我记得CI有类似的功能,其中URL保持不变,控制器从未显示:
$route['(method1|method2)'] = 'controller/$1';
11个回答

88

3
这个答案更加精确。 - Rubens Mariuzzo
7
很抱歉,但这篇文章为什么会有那么多的点赞呢?它解释了如何使用GET和POST,但没有说明如何根据请求类型调用不同的方法。 - lennard

54

请查看以下代码。

Route::match(array('GET','POST'),'login', 'AuthController@login');

3
恰当回答这个问题的唯一方法。 - myol

38

您可以使用以下方法将所有HTTP动词结合到一个路由中:

Route::any('login', 'AuthController@login');

这将匹配 GETPOST HTTP 动词。同时还会匹配 PUTPATCHDELETE


你如何检查动词是 GET 还是 POST - enchance
你可以始终使用 $_SERVER['REQUEST_METHOD'] === 'POST',但我不建议在一个操作中混合两个逻辑... 控制器的理念是将逻辑与 Post-Redirect-Get 模式分离。花2到3分钟阅读这个特定的讨论线程:https://github.com/laravel/laravel/pull/1517。 - Rubens Mariuzzo
2
@enchance,您可以使用以下代码检查请求是 GET 还是 POSTif (Request::isMethod('post')) { //... } - Sid

21
Route::any('login', 'AuthController@login');

并在控制器中:

if (Request::isMethod('post'))
{
// ... this is POST method
}
if (Request::isMethod('get'))
{
// ... this is GET method
}
...

3
这是一个更好的答案。谢谢。 - muya.dev

11

您可以尝试以下方法:

Route::controller('login','AuthController');

然后在你的AuthController类中实现这些方法:

public function getIndex();
public function postIndex();

应该可以工作 ;)



8

这跟5年前得到最多赞的回答有什么不同? - gre_gor

6
Route::match(array('GET', 'POST', 'PUT'), "/", array(
    'uses' => 'Controller@index',
    'as' => 'index'
));

2

使用match处理两种方法

Route::match(['GET','POST'], 'users', UserController@store);

这个答案与现有的答案有何不同? - gre_gor
@gre_gor 有一件事让我困惑,那就是控制器不再以字符串形式传递,而是作为对象本身传递。我尝试使用旧代码,在Laravel 10中将其作为字符串传递时无法正常工作。 - undefined

2

在路由中

Route::match(array('GET','POST'),'/login', 'AuthController@getLogin');

在控制器中

public function login(Request $request){
    $input = $request->all();
    if($input){
     //Do with your post parameters
    }
    return view('login');
}

1
在Laravel 5.1中,可以通过隐式控制器来实现这一点。 看看我从Laravel文档中找到的。
Route::controller('users', 'UserController');

接下来,只需在您的控制器中添加方法。方法名称应以它们响应的HTTP动词开头,后跟URI的标题大小写版本:
<?php

namespace App\Http\Controllers;

class UserController extends Controller
{
    /**
     * Responds to requests to GET /users
     */
    public function getIndex()
    {
        //
    }

    /**
     * Responds to requests to GET /users/show/1
     */
    public function getShow($id)
    {
        //
    }

    /**
     * Responds to requests to GET /users/admin-profile
     */
    public function getAdminProfile()
    {
        //
    }

    /**
     * Responds to requests to POST /users/profile
     */
    public function postProfile()
    {
        //
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接