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

M a*_*a D 1 crud laravel laravel-5

这是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');
    }
);
Run Code Online (Sandbox Code Playgroud)

我创建了一个链接如下

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

其中 the$entity->idid字母的。问题是,它链接到show方法而不是destroy方法。我能做些什么?

使用这样的表格

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

可能会解决问题,但我想使用a标签而不是表单。

更新

其中php artisan route:list,destroy 和 show 的 url 是相同的

在此输入图像描述

谢谢

Ham*_*oud 5

当您使用该Route::resource方法时,它将创建一条用于销毁资源的路由,如下所示:/letters/:id/以及另一条用于编辑资源的路由:/letters/:id,还有一个用于显示/letters/:id

他们看起来都一样。然而,不同之处在于用于到达每个路由的 HTTP 方法/动词。

如果查看 if 的输出php artisan route:list,您将找到所使用的 HTTP 方法的列表。就像是:

GET|HEAD  | letters/{letter} | letters.show 
PUT|PATCH | letters/{letter} | letters.update
DELETE    | letters/{letter} | letters.destroy
Run Code Online (Sandbox Code Playgroud)

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

当你使用a标签时,浏览器将使用该GET方法,从而到达路由letters.show。Html 形式,可以使用POSTGET. 最后,要使用DELETEhttp 方法,您需要一个带有隐藏输入的表单,名为_methodvalue="delete表单内部。检查文档以获取更多详细信息。

LaravelCollective 包文档中也有关于此的注释

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

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

更新以添加示例:您可以在此处框架的默认应用程序布局中找到使用锚标记提交表单的示例

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

<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>
Run Code Online (Sandbox Code Playgroud)