我正在尝试使用操作href
将一些数据传递给我的控制器。我不知道为什么,但laravel使用 GET 方法传递数据,但我需要 GET 而不是 GET POST 。我真的不明白为什么laravel这样做并且找不到答案。我做了多次,我的语法似乎是正确的。有人可以看看吗?
刀片:
<td>
@foreach($products as $product)
<a href="{{ action('ProductsController@delete', $product->id ) }}">
<span class="glyphicon glyphicon-trash"></span></a>
{{ $product->name }},
@endforeach
</td>
我的路线:
Route::post('delete', ['as' => 'delete', 'uses' => 'ProductController@delete']);
在我的控制器中只是一个:
public function delete()
{
return 'hello'; // just testing if it works
}
错误:
MethodNotAllowedHttpException in RouteCollection.php line 219....
我知道这是一个get方法,因为如果我试图将数据传递给我的控制器,我的URL看起来像这样:
blabla.../products/delete?10
我的语法有问题吗?我真的不明白为什么它使用get方法。
我还尝试了data-method="post"
我的<a>
标签,但这也没有用。
感谢您抽出宝贵时间。
答案 0 :(得分:7)
当您使用<a href=example.com>
等锚点建立链接时,您的方法将始终为GET。这就像在浏览器中打开URL一样,您发出了GET请求。
您应该使用表单将POST请求发送到控制器的delete方法。假设你有HTML和表单的Illuminate HTML包,你可以这样做:
{!! Form::open(['method' => 'DELETE', 'route' => $route]) !!}
{!! Form::submit('delete', ['onclick' => 'return confirm("Are you sure?");']) !!}
{!! Form::close() !!}
修改强> 使用按钮标记:
{!! Form::open(['method' => 'DELETE', 'route' => $route]) !!}
<button type="submit"><i class="glyphicon glyphicon-remove"></i>Delete</button>
{!! Form::close() !!}
答案 1 :(得分:1)
这是你的问题:
<a href="{{ action('ProductsController@delete', $product->id ) }}">
始终通过GET提交锚标记。它是一个内置的HTTP,并不是Laravel特有的。
提交表单时指定POST HTTP Verb或者HTTP方法由指定POST作为HTTP谓词的AJAX请求调用。
相反,请考虑提交所需内容的表单中的submit
类型按钮。
<td>
@foreach($products as $product)
<form method="POST" action="{{ route('delete') }}">
<input type="hidden" name="product_id" value="{{ $product->id }}">
{!! csrf_field() !!}
<button type="submit" class="btn">
<span class="glyphicon glyphicon-trash"></span>
</button>
</form>
{{ $product->name }},
@endforeach
</td>
然后在你的控制器中:
public function delete()
{
// 'Die Dump' all of the input from the form / request
dd( request()->input()->all() );
// 'Die Dump' the specific input from the form
dd( request()->input('product_id') );
}
您将开始了解GET和POST请求在发送键/值对时的不同。
了解更多信息:
答案 2 :(得分:0)
最适合laravel7。首先定义具有给定表单ID的表单。
@auth
<form id="logout-form" action="{{ route('logout') }}" method="POST"
style="display: none;">
@csrf
</form>
@endauth
然后可以使用anchor标签进行注销操作。在后台,javascript可以正常工作。无论何时注销,然后对给定的post方法和注销路径的表单方法进行操作即可。
<a class="nav-link dropdown-toggle text-muted waves-effect waves-dark"
href="{{ route('logout') }}" onclick="event.preventDefault();document.getElementById('logout-form').submit();"
id="2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="mdi mdi-logout"></i>
</a>
最大的好处是,表单并非非必需地加载。 到目前为止已登录,否则未加载
答案 3 :(得分:0)
Laravel 7
通过jQuery
:
<form id="form" action="{{route('route_name')}}" method="POST">@csrf</form>
<a href="javascript:void(0)" onclick="$('#form').submit()"></a>
通过JS
:
<form id="form" action="{{route('route_name')}}" method="POST">@csrf</form>
<a href="javascript:void(0)" onclick="document.getElementById('form').submit()"></a>