laravel笔记4文章模块
------------恢复内容开始------------
Missing required parameters for [Route: admin.news.edit] [URI: admin/news/{news}/edit]. (View: E:\phpStudy_64\phpstudy_pro\WWW\yfkt.com\resources\views\admin\news\index.blade.php)
Previous exceptions
解决:对单个新闻的编辑和删除的时候blade里面的路由要有id参数(
)
href='{{route('admin.news.edit',['news'=>$item->id])}}' role="button">编辑</a>
------------恢复内容结束------------
在编辑文章时显示文章修改的数据,在控制器里修改
//这里面News是个模型 $news是用来保存数据的(用with)
public function edit(News $news)
{
//可以打印一下$news 里面是有数据的
dd($news);
return view('admin.news.edit')->with('news',$news);
}
然后在blade模板相应html属性里添加value="{{$news->title}},提交数据的地址要改为(xxxxx.update,id)里面不要忘了带参数id
<form class="forms-sample" action={{route('admin.news.update','news'=>$news->id])}} method="POST" enctype="multipart/form-data">
错误提示:
The POST method is not supported for this route. Supported methods: GET, HEAD, PUT, PATCH, DELETE.
解决:执行php artisan route:list看提交的路由是什么请求方式,在这里是put(表单默认只支持get和post)
方法1@method('PUT') blade里面加这个代码 方法2 路由里面用any或者match 参考官方文档
{!!$news->content!!}这个可以防止js代码里html代码转义
---------------------------------------------------------------------
编辑修改文章控制器方法
public function update(Request $request, News $news)
{
//前两个request是修改文章后提交的 后面两个news是原有的
//dd($request->post());
$data = [
'title'=>$request->title,
'keyword'=>$request->keyword,
'desc'=>$request->desc,
'remark'=>$request->remark,
'views'=>$request->views,
// 'pic'=>$request->pic,
'content'=>$request->content,
];
// 判断是存在图片文件
if($request->file('file')){
$data['pic'] = $request->file('file')->store('news');
Storage::delete($news->pic); //这条命令是用来删除旧的图片
}
$NewsModel = new News;
$result = $NewsModel::where('id','=',$news->id)->update($data);
// dd($result); 打印结果为1
if($result>0){
session()->flash('data',['class'=>'success','msg'=>'编辑成功']);
}else{
session()->flash('data',['class'=>'danger','msg'=>'编辑失败']);
}
return redirect(route('admin.news.index'));
}
删除文章的控制器方法
public function destroy(News $news)
{
// $result = (new News)::destroy($news->id); 返回值是删除的条数
//用delete返回值是布尔值
$result = $news->delete();
Storage::delete($news->pic); //这条命令是用来删除旧的图片
if($result){
session()->flash('data',['class'=>'success','msg'=>'删除成功']);
}else{
session()->flash('data',['class'=>'danger','msg'=>'删除失败']);
}
return redirect(route('admin.news.index'));
}
}
错误提示 如果直接使用官方文档的destroy方法dd打印结果没有返回值的时候,可以修改路由文件,
使用get方式获取删除链接(delete方法获取不到链接)
解决方法:
//新闻模块 不用destroy路由 自己新增一条删除路由
Route::resource('/news', 'Admin\NewsController')->except('destroy');
Route::get('admin/news/{news}/del', 'Admin\NewsController@destroy')->name('news.delete');
然后使用上面提到的destroy或者delete( // $result = (new News)::destroy($news->id); 返回值是删除的条数
//用delete返回值是布尔值
$result = $news->delete();
)===========================================================================================
编辑修改或者删除文章的时候,图片会保存下来,如果不删除原有的图片的话。因此编辑修改文章的时候更新图片的同时就要删除旧的图片
Storage::delete($news->pic);
使用官方文档推荐的命令即可 放在控制器相应的地方
======================================================================================
代码优化以及公共函数使用
公共函数放在bootstrap里面可以建立common.php文件,把公共函数放在里面,比如操作提示函数
<?php
function checkreturn($blur = false, $msg='操作'){
if($msg){
session()->flash('data',['class'=>'success','msg'=>$msg.'成功']);
}else{
session()->flash('data',['class'=>'danger','msg'=>$msg.'失败']);
}
}
?>
然后在bootstrap\app.php里面注册一下
require __DIR__.'/common.php';最后在控制器相应的方法里面调用
checkreturn($NewsModel->save(),'添加'); //这个是添加方法
checkreturn($result>0,'修改'); //这个是修改方法
//这个是删除方法
public function destroy(News $news)
{
// $result = (new News)::destroy($news->id); 返回值是删除的条数
//用delete返回值是布尔值
$result = $news->delete();
Storage::delete($news->pic);
checkreturn($result,'删除');
return redirect(route('admin.news.index'));
}
}