在Laravel中为HTML添加表单操作

32

我无法在视图HTML表单的操作标签中传递URL。

<form method="post" action="??what to write here??" accept-charset="UTF-8">

我希望将其操作设置为WelcomeController文件中的log_in函数,在控制器中。
以下是我的路由:
Route::get('/','WelcomeController@home');
Route::post('/', array('as' => 'log_in', 'uses' => 'WelcomeController@log_in'));
Route::get('home', 'HomeController@index');

提交后URL不变。
http://localhost:8000/

主要错误行

Whoops, looks like something went wrong.

之后出现了 1/1 TokenMismatchException in compiled.php line 2440:

13个回答

41
您可以使用action()助手来生成指向您的路由的URL:
<form method="post" action="{{ action('WelcomeController@log_in') }}" accept-charset="UTF-8">

请注意,Laravel 5默认安装已经包含了整个身份验证过程的视图和控制器。只需在新安装的情况下前往/home,您就应该会被重定向到登录页面。

还要确保阅读文档中的身份验证部分


你现在遇到的错误 (TokenMismatchException) 是因为 Laravel 已经默认开启跨站点请求伪造保护(CSRF)

要使用它(并消除错误),请在表单中添加一个隐藏字段:

<input name="_token" type="hidden" value="{{ csrf_token() }}"/>

或者,您也可以通过从app/Http/Kernel.php$middleware数组中删除'App\Http\Middleware\VerifyCsrfToken'来禁用CSRF保护。


主页开始出现了,但是在点击提交按钮后它并没有跳转到那个页面。 - Shahid Rafiq
1
你可以编辑你的问题。请这样做并适当地添加格式化的代码。 - lukasgeiter
我无法找到问题编辑选项,可以请您检查我发布的答案。 - Shahid Rafiq
标签下面有几个链接,其中一个是编辑。我已经为您添加了编辑链接。请删除您的“答案”。 - lukasgeiter
这些路由看起来还不错。提交后你看到了什么? - lukasgeiter
显示剩余3条评论

20

Laravel 5.8

步骤1:前往路径 routes/api.php,添加:

Route::post('welcome/login', 'WelcomeController@login')->name('welcome.login');

步骤2:前往路径文件视图

<form method="POST" action="{{ route('welcome.login') }}">
</form>

结果 HTML

<form method="POST" action="http://localhost/api/welcome/login">

<form>

<form method="POST" action="http://localhost/api/welcome/login"> 这是一种不好的做法...因为当你上传项目到服务器时,你需要根据域名更改URL。 - Rajib

10

如果您想从表单操作中调用控制器,则可以使用以下代码:

<form action="{{ action('SchoolController@getSchool') }}"  >

这里的SchoolController是控制器名称,getSchool是方法名称,你必须在方法名称之前使用getpost,并且它应该与表单标签中的相同。


9

1) 在 Laravel 5 中,表单助手被移除了。您需要先安装 Laravel Collective。

参考链接:https://laravelcollective.com/docs/5.1/html

{!! Form::open(array('route' => 'log_in')) !!}

或者

{!! Form::open(array('route' => '/')) !!}

2) 对于 Laravel 4,表单助手已经存在。

{{ Form::open(array('url' => '/')) }}

7

使用action="{{ action('WelcomeController@log_in') }}"

然而TokenMismatchException表示您的表单中缺少CSRF令牌。

您可以通过使用<input name="_token" type="hidden" value="{{ csrf_token() }}">来添加它。


这个答案本质上与被接受和得到最多投票的答案相同...只是细节较少。最好的做法是给那个答案点赞,而不是添加自己的答案。 - Jarod Moser

6
在Laravel 8中:
步骤1:在blade文件中:
<form action="{{ route('authLogin')  }}" method="post">
  @csrf
  ....
</form>

步骤二:接着在 web.php 文件中执行以下操作:
use App\Http\Controllers\UsersController;

Route::post('login-user', [UsersController::class, 'login'])->name('authLogin');

第三步:在UsersController中:

public function login(Request $request){
    dd($request->all());
}

很高兴分享。感谢您提出这个问题。
**更多信息,请参见https://laravel.com/docs/8.x/routing#generating-urls-to-named-routes

6
对于Laravel 2020. 好的,以下是一个例子:
<form class="modal-content animate" action="{{ url('login_kun')  }}" method="post">
  @csrf   // !!! attention - this string is a must 
....
 </form>

然后在web.php中:

Route::post("/login_kun", "LoginController@login");

还有一个在新创建的LoginController中:

 public function login(Request $request){
    dd($request->all());
}

而且,你已经完成了,我的朋友。

这个URL帮助我在Laravel-8版本中使用 - https://laravel.com/docs/8.x/routing#generating-urls-to-named-routes - Kamlesh

4
{{ Form::open(array('action' => "WelcomeController@log_in")) }}
...
{{ Form::close() }}

2
任何稍有编程知识的人都可以理解。 - zundi

4
您需要为您的路由设置名称。 像这样:
    Route :: get('/','WelcomeController@home') - > name('welcome.home');
    Route :: post('/',array('as' => 'log_in','uses' => 'WelcomeController@log_in')) - > name('welcome.log_in');
    Route :: get('home','HomeController@index') - > name('home.index');

我只是在需要的路线上放置了名称。 在我的情况下,从刀片模板的标记表单中调用。 像这样:
<form action="{{ route('home.index') }}" >

或者,您可以这样做:
<form action="/" >

3

表单提交动作:

<form method="post" action="{{url('login')}}" accept-charset="UTF-8">

更改您的路由: 在路由中 -> Web.php

Route::post('login','WelcomeController@log_in');

在我的 Lumen 安装中,许多人提到的 action() 函数返回了一个错误,但 url() 函数可以正常工作。 - kregus

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