如何在表单提交时将参数发送到路由

Posted

技术标签:

【中文标题】如何在表单提交时将参数发送到路由【英文标题】:How to send parameter to route on form submit 【发布时间】:2017-06-19 14:18:06 【问题描述】:

我有以下路线:

Route::get("/changeLang/lang", 'SiteController@changeLang');

我有以下表格:

<form action=" url('/changeLang/???') " method="GET">
     csrf_field() 
    <select onchange="this.form.submit()" name="lang">
        <option value="eng">English</option>
        <option value="cro">Hrvatski</option>
    </select>
</form>

所以我想将该表单提交到该路由,以便该路由接收用户选择的语言。我不知道表单方法应该是GET还是POST。

那么如何在表单操作中指定指向该路由的链接,以便发送所选语言?用什么来代替 URL 末尾的问号?

而且我不喜欢使用 Laravel 的 Form 外观(或者它只是类)来回显 html 元素,所以如果可能的话,我想不这样做。

【问题讨论】:

很好的表单提交是行不通的,因为它会是/changeLang/lang?lang=cro 【参考方案1】:

您不能提交表单并让它以您期望的格式生成 URL。你会得到一个/changeLang/lang?lang=cro格式的URL

所以你有两个选择。您提交表单,它会根据查询字符串值重定向。

或者您将 javascript 添加到表单中,以便生成您所追求的 url。

<select onchange="window.location.href='/changeLang/' + this.value;" name="lang">

【讨论】:

谢谢,但在我看来,路线名称不能在 camelCase 中,而是在 snake_case 中。如果我尝试使用骆驼案例,它实际上会转到 /change_lang/lang=cro 并且找不到该路线。【参考方案2】:

如果你的路线是这样的。

Route::get("/changeLang", 'SiteController@changeLang');

您的表单将是这样的。

<form action=" url('/changeLang') " method="GET">
 csrf_field() 
<select onchange="this.form.submit()" name="lang">
    <option value="eng">English</option>
    <option value="cro">Hrvatski</option>
</select>

要从GET[POST 可选地更改路线后] 获取价值,请在您的controller 中执行类似操作。

public function changeLang(Request $request)

    $data = $request->all();
    //echo $request->lang;
    // or you can access data like this.
    echo $data['lang'];

如果你想要这条路线

Route::get("/changeLang/lang", 'SiteController@changeLang');

那么你需要将它附加到路由中,请求 url 将是这样的。

https://host/changeLang/eng

在你的控制器中。

public function changeLang($lang)

    echo $lang;

url(route)

url 函数为给定路径生成一个完全限定的 URL

更多关于url

希望这会有所帮助!

【讨论】:

我明白了,但我不知道如何在 HTML 代码中指定指向路由的链接【参考方案3】:

使用这个

<form action=" url('/changeLang', [$lang]) " method="GET">
     csrf_field() 
    <select onchange="this.form.submit()" name="lang">
        <option value="eng">English</option>
        <option value="cro">Hrvatski</option>
    </select>
</form>

或者这个

<form action=" url('/changeLang/' . $lang,) " method="GET">
     csrf_field() 
    <select onchange="this.form.submit()" name="lang">
        <option value="eng">English</option>
        <option value="cro">Hrvatski</option>
    </select>
</form>

【讨论】:

【参考方案4】:

更好地使用 laravel 表单生成器:

 Form::open([
      'method' => 'GET',
      'action' => ['some@action', $param]
]) 

...

 Form::close() 

或者:

 <form action=" url('/changeLang/lang' . $param) " method="GET">

【讨论】:

以上是关于如何在表单提交时将参数发送到路由的主要内容,如果未能解决你的问题,请参考以下文章

提交表单时将语言参数传递到下一页(url)

如何在Vue中提交表单,重定向到新路由并传递参数?

如何在提交表单时将结果重定向到React中的另一个页面

Django,如何在提交表单时将 HTML 表单值传递给 URL?

form表单提交action 如何接收

如何在表单提交时将 HTML 标签值传递给 PageModel