Laravel-route(“ resource.destroy”)调用“ resource.show”

时间:2018-08-21 07:47:15

标签: laravel laravel-5 crud

这是web.php

Route::group(['middleware' => 'auth'],
    function () {
        Route::get('letters/getRows', 'LetterController@getRows')->name('letters.getRows');
        Route::get('letters/{letter}/A4', 'LetterController@A4')->name('letters.A4');
        Route::get('letters/{letter}/A5', 'LetterController@A5')->name('letters.A5');
        Route::resource('letters', 'LetterController');
    }
);

我创建了如下链接

"<a class='mx-2 h5' href='".route('letters.destroy', $entity->id)."'><i class='icon-remove-circle'></i></a>".

其中$entity->id是字母的id。问题是,它链接到show方法而不是destroy方法。我该怎么办?

使用这样的表格

{{ Form::open(array('route' => array('letters.destroy', $entity->id), 'method' => 'delete')) }}
    <button type="submit" >Delete Account</button>
{{ Form::close() }}

可以解决问题,但我想使用a标签而不是表格。

更新

php artisan route:list中,destroy和show的网址相同

enter image description here

谢谢

2 个答案:

答案 0 :(得分:3)

当您使用Route::resource方法时,它将创建一条路径来销毁诸如/letters/:id/这样的资源,而另一条路径来编辑该资源:/letters/:id,还有一条显示更多/letters/:id

它们看起来都一样。但是,区别在于用于到达每个路由的HTTP方法/动词。

如果查看php artisan route:list的输出,则会找到所用HTTP方法的列表。像这样:

GET|HEAD  | letters/{letter} | letters.show 
PUT|PATCH | letters/{letter} | letters.update
DELETE    | letters/{letter} | letters.destroy

因此,要显示字母,请使用GET方法,要编辑字母,请使用PUT方法,要销毁/删除,请使用DELETE方法。 / p>

当您使用a标签时,浏览器将使用GET方法,从而到达letters.show路由。 HTML表单,可以使用POSTGET。最后,要使用DELETE http方法,您需要一个表单,该表单带有名为_method的隐藏输入,并且表单内有value="delete。查看docs了解更多详细信息。

LaravelCollective package documentations

中对此也有注释
  

注意:由于HTML表单仅支持POST和GET,因此会通过自动向表单中添加_method隐藏字段来欺骗PUT和DELETE方法。

最后,如果必须使用锚标记<a>,则可以使用javascript来监听click事件并使用DELETE方法提交表单。

更新以添加示例: 您可以在框架here

的默认应用布局中找到使用锚标签提交表单的示例。

这是提交删除请求的修改版本:

<a class="dropdown-item" href="#"
   onclick="event.preventDefault();
                                     document.getElementById('destroy-form').submit();">
    {{ __('DELETE') }}
</a>

<form id="destroy-form" action="{{ route('letters.destroy', $entity) }}" method="POST" style="display: none;">
    @method('DELETE')
    @csrf
</form>

答案 1 :(得分:2)

你不能。如果您想发出DELETE请求,则需要通过某种形式(方法POST_method DELETE)或使用Java脚本来欺骗它。

超链接将引起新的请求,这些请求将是GET个请求。这就是网络的工作方式。