使用Laravel 5.6和MySQL。我要使用以下控制器功能更新类别表中的类别名称和图像?
public function update(Request $request, $id)
{
if ($request->isMethod('get'))
return view('categories.form', ['image' => Category::find($id)]);
else {
$rules = [
'categoryname' => 'required',
];
$this->validate($request, $rules);
$image = Category::find($id);
if ($request->hasFile('image')) {
$dir = 'images/';
if ($image->image != '' && File::exists($dir . $image->image))
File::delete($dir . $image->image);
$extension = strtolower($request->file('image')->getClientOriginalExtension());
$fileName = str_random() . '.' . $extension;
$request->file('image')->move($dir, $fileName);
$image->categoryimage = $fileName;
} elseif ($request->remove == 1 && File::exists('images/' . $image->image)) {
File::delete('images/' . $image->post_image);
$image->categoryimage = null;
}
}
$image->categoryname = $request->categoryname;
$image->save();
return redirect()->route('categories.index');
}
和路线
Route::match(['get', 'put'], 'category/update/{id}', 'CategoryController@update');
并编辑表单
@if(isset($image))
<form method="PUT" action="http://localhost:8000/category/update/{{$image->id}}" enctype="multipart/form-data">
<input type="hidden" name="_method" value="put">
<label for="description" class="col-form-label col-md-3 col-lg-2">Description</label>
<div class="col-md-8">
<input class="form-control" autofocus placeholder="Description" name="categoryname" type="text" id="categoryname" value="{{ isset($image) ? $image->categoryname : '' }}">
<label for="image" class="col-form-label col-md-3">Image</label>
<div class="col-md-5">
<img id="preview"
src="{{asset((isset($image) && $image->categoryimage!='')?'images/'.$image->categoryimage:'images/noimage.png')}}"
height="200px" width="200px"/>
<input class="form-control" style="display:none" name="image" type="file" id="image" name="_token" value="{{ csrf_token() }}">
<br/>
<a href="javascript:changeProfile();">Add Image</a> |
<a style="color: red" href="javascript:removeImage()">Remove</a>
<input type="hidden" style="display: none" value="0" name="remove" id="remove">
但是当我尝试更新数据时,它没有更新。仅刷新到同一页面。不,有任何错误
url看起来像这样
http://localhost:8000/category/update/21?categoryname=tractorrer&image=&remove=0 //tractorrer is updated category name
如何解决此问题?
答案 0 :(得分:1)
您是否已像这样转储所有请求以检查其是否包含categoryname
。
dd($request->all());
如果dd
不显示categoryname
值,则在发送请求时似乎是问题所在。
如果尚未尝试使用method="POST"
而不是method="PUT"
。
我以前从未将PUT
与表单提交一起使用
答案 1 :(得分:1)
关于您的代码示例,有几件事涉及。就像对于GET和PUT路由只有一种叫update
的方法一样。可能不是一个养成的好习惯。特别是因为这是一条获取路线,因此您无需进行任何更新。因此,方法名称/功能说明是错误的。
但是,除此之外,您什么也看不到,因为您不能在表单上使用method="PUT"
。您需要使用method="POST"
,然后在表单中需要这些行。一个告诉表单这是一个补丁请求,另一个将csrf令牌放入其中。
{{csrf_field()}}
{{ method_field('PATCH') }}
然后我会将您的路线更新为PATCH,而不是PUT。
答案 2 :(得分:0)
首先
您设置POST而不是表单方法的PUT。
第二,
您的代码看起来有些混乱。我更新了您的操作代码;
Retrofit2
您可以按照我的指令再试一次。我希望它能帮助您解决问题。