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'));
        } 

    }

到这里文章模块全部完成

posted @ 2020-08-06 17:41  孤单照夜清  阅读(240)  评论(0编辑  收藏  举报