我知道浏览器只支持POST
和GET
个请求,而Laravel使用以下代码支持PUT
个请求:
<?= Form::open('/path/', 'PUT'); ?>
... form stuff ...
<?= Form::close(); ?>
这会生成以下HTML
<form method="POST" action="http://example.com/home/" accept-charset="UTF-8">
<input type="hidden" name="_method" value="PUT" />
... form stuff ...
</form>
框架如何处理这个问题?是否在 决定将请求发送到哪个路由之前捕获POST
请求 ?它是否使用ajax将实际PUT
发送到框架?
答案 0 :(得分:49)
它插入一个隐藏字段,该字段提到它是PUT或DELETE请求
echo Form::open('user/profile', 'PUT');
结果:
<input type="hidden" name="_method" value="PUT">
然后它在request.php
核心文件中路由时查找_method(在代码中查找'spoofing') - 如果它检测到它 - 将使用该值路由到正确的restful控制器。
仍然使用“POST”来实现这一目标。没有使用ajax。
答案 1 :(得分:14)
Laravel使用symfony Http Foundation来检查这个_method变量,并根据其内容将请求更改为PUT或DELETE。是的,这发生在路由发生之前。
答案 2 :(得分:1)
您还可以在表单中使用数组,如下所示:
{{ Form::open( array('route' => array('equipment.update', $item->id ),
'role' => 'form',
'method' => 'put')) }}
只需将方法更改为您想要的内容即可。
答案 3 :(得分:1)
虽然回答很晚,但我认为将此问题添加到发现此问题并且无法使其工作的其他任何人都很重要。
使用Laravel这样的资源路线时:
Route::resource('myRoute','MyController');
为了调用PUT
方法,我们需要update()
。为了使其正常工作(在表单提交之外),您需要确保将 ContentType 作为 x-www-form-urlencoded 传递。这是default for forms,但是使用cURL或使用Postman等工具发出请求将无效,除非您设置此项。
答案 4 :(得分:1)
PUT通常是指更新请求。
使用
打开laravel刀片模板内的表单时{{ Form::open('/path/', 'PUT') }}
它会在表单中创建一个隐藏字段,如下所示,
<input type="hidden" name="_method" value="PUT" />
为了在控制器内处理PUT请求,您需要创建一个带有put前缀的方法,
for example, putMethodName()
所以,如果你指定,
{{ Form::open('controller/methodName/', 'PUT') }}
在Form中:打开。然后你需要创建一个控制器方法,如下所示,
class Controller extends BaseController {
public function putMethodName()
{
// put - usual update code logic goes here
}
}
答案 5 :(得分:-1)
实际上没有PUT请求! 它的POST请求! 当你告诉laravel;嘿laravel这是一个PUT请求!这意味着你想要更新一些资源! {{Form :: open('user / profile','PUT')}} 上面的行表示它的PUT请求(只是意味着更新资源,就像我之前没有PUT请求那样) 该行代码在表单中创建一个隐藏字段,指定请求的类型,当laravel路由器获取请求时,它搜索URI的PUT处理程序 例如......喜欢: Route :: put('/ url / you /提及/ here /','someController @ someAction');