Laravel - 路由 ("resource.destroy") 调用 "resource.show"
Laravel - route("resource.destroy") calls "resource.show"
这是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');
}
);
我创建了一个link如下
"<a class='mx-2 h5' href='".route('letters.destroy', $entity->id)."'><i class='icon-remove-circle'></i></a>".
其中 $entity->id
是字母的 id
。问题是,它 link 是 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的url是一样的
谢谢
当您使用 Route::resource
方法时,它会创建一个路径来销毁这样的资源:/letters/:id/
和另一个路径来编辑资源:/letters/:id
,还有一个要显示 /letters/:id
他们看起来都一样。但是,区别在于用于到达每个路由的 HTTP method/verb。
如果您查看 php artisan route:list
的输出,您将找到使用的 HTTP 方法列表。类似于:
GET|HEAD | letters/{letter} | letters.show
PUT|PATCH | letters/{letter} | letters.update
DELETE | letters/{letter} | letters.destroy
因此,显示一个字母,你使用GET
方法,编辑一个字母,使用PUT
方法,destroy/delete,你使用DELETE
]方法。
当你使用a
标签时,浏览器将使用GET
方法,从而到达letters.show
路由。 Html形式,可以使用POST
或GET
。最后要使用 DELETE
http 方法,您需要一个带有名为 _method
的隐藏输入的表单和表单内的 value="delete
。查看 docs 了解更多详情。
LaravelCollective package documentations
中也有关于此的说明
Note: Since HTML forms only support POST and GET, PUT and DELETE methods will be spoofed by automatically adding a _method hidden field to your form.
最后,如果你必须使用锚标签<a>
,你可以使用javascript来监听点击事件并提交一个带有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>
你不能。如果您想发出 DELETE
请求,您需要通过表单(方法 POST
、_method
DELETE
)或使用 Javascript.[=15 来欺骗它=]
超链接会引起新的请求,这将是 GET
请求。这就是网络的运作方式。
这是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');
}
);
我创建了一个link如下
"<a class='mx-2 h5' href='".route('letters.destroy', $entity->id)."'><i class='icon-remove-circle'></i></a>".
其中 $entity->id
是字母的 id
。问题是,它 link 是 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的url是一样的
谢谢
当您使用 Route::resource
方法时,它会创建一个路径来销毁这样的资源:/letters/:id/
和另一个路径来编辑资源:/letters/:id
,还有一个要显示 /letters/:id
他们看起来都一样。但是,区别在于用于到达每个路由的 HTTP method/verb。
如果您查看 php artisan route:list
的输出,您将找到使用的 HTTP 方法列表。类似于:
GET|HEAD | letters/{letter} | letters.show
PUT|PATCH | letters/{letter} | letters.update
DELETE | letters/{letter} | letters.destroy
因此,显示一个字母,你使用GET
方法,编辑一个字母,使用PUT
方法,destroy/delete,你使用DELETE
]方法。
当你使用a
标签时,浏览器将使用GET
方法,从而到达letters.show
路由。 Html形式,可以使用POST
或GET
。最后要使用 DELETE
http 方法,您需要一个带有名为 _method
的隐藏输入的表单和表单内的 value="delete
。查看 docs 了解更多详情。
LaravelCollective package documentations
中也有关于此的说明Note: Since HTML forms only support POST and GET, PUT and DELETE methods will be spoofed by automatically adding a _method hidden field to your form.
最后,如果你必须使用锚标签<a>
,你可以使用javascript来监听点击事件并提交一个带有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>
你不能。如果您想发出 DELETE
请求,您需要通过表单(方法 POST
、_method
DELETE
)或使用 Javascript.[=15 来欺骗它=]
超链接会引起新的请求,这将是 GET
请求。这就是网络的运作方式。