• 后盾网lavarel视频项目---lavarel使用模型进行增删改查操作


    后盾网lavarel视频项目---lavarel使用模型进行增删改查操作

    一、总结

    一句话总结:

    使用模型操作常用方法

    查一条:$model=Tag::find($id);
    删一条:Tag::destroy($id);
    查全部:$data=Tag::get();
    增加:$model->create($request->all());

    1、资源路由器操作处理的动作、URL、行为、路由名称?

    看手册喽,修改和增加用的是两个,一个是get显示界面,一个是处理逻辑
    动作URI行为路由名称
    GET /photos index photos.index
    GET /photos/create create photos.create
    POST /photos store photos.store
    GET /photos/{photo} show photos.show
    GET /photos/{photo}/edit edit photos.edit
    PUT/PATCH /photos/{photo} update photos.update
    DELETE /photos/{photo} destroy photos.destroy

    2、更新操作中,需要表单传递PUT请求,如何做?

    伪造表单方法:@method('PUT')
    <form action="/foo/bar" method="POST">
        @method('PUT')
    </form>

    3、解决剔除token字段存数据库的问题?

    模型中定义$guarded为空数组:protected $guarded=[];

    4、jquery自动传递csrf的token字段?

    在页头创建csrf-token的meta标签,在页尾用ajaxSetup设置token的值
    X-CSRF-TOKEN
    除了检查 POST 参数中的 CSRF 令牌外, VerifyCsrfToken 中间件还会检查 X-CSRF-TOKEN 请求头。你应该将令牌保存在 HTML meta 标签中,如下:
    
    <meta name="csrf-token" content="{{ csrf_token() }}">
    然后,一旦你创建了 meta 标签,就可以指示像 jQuery 这样的库自动将令牌添加到所有请求的头信息中。还可以为基于 AJAX 的应用提供简单、方便的 CSRF 保护。如下:
    
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    {tip} 默认情况下,resources/assets/js/bootstrap.js 文件会用 Axios HTTP 函数库注册 csrf-token meta 标签中的值。如果不使用这个函数库,则需要为你的应用手动配置此行为。

     

    二、lavarel使用模型进行增删改查操作

    1、相关知识

    资源控制器操作处理

    动作URI行为路由名称
    GET /photos index photos.index
    GET /photos/create create photos.create
    POST /photos store photos.store
    GET /photos/{photo} show photos.show
    GET /photos/{photo}/edit edit photos.edit
    PUT/PATCH /photos/{photo} update photos.update
    DELETE /photos/{photo} destroy photos.destroy

    指定资源模型

    如果你使用了路由模型绑定,并且想在资源控制器的方法中使用类型提示,你可以在生成控制器的时候使用 --model选项:

    php artisan make:controller PhotoController --resource --model=Photo

    伪造表单方法

    因为 HTML 表单不能生成 PUTPATCH 和 DELETE 请求,所以你需要添加一个隐藏的 _method 字段来伪造这些 HTTP 动作。 这个 Blade 指令 @method 可以为你创建这个字段:

    <form action="/foo/bar" method="POST">
        @method('PUT')
    </form>
     

    2、代码

    一、控制器

    app/Http/Controllers/Admin/TagController.php

     1 <?php
     2 
     3 namespace AppHttpControllersAdmin;
     4 
     5 use AppHttpRequestsTagRequest;
     6 use AppModelTag;
     7 use IlluminateHttpRequest;
     8 use AppHttpControllersController;
     9 
    10 class TagController extends CommonController
    11 {
    12 
    13     /**
    14      * Display a listing of the resource.
    15      *
    16      * @return IlluminateHttpResponse
    17      */
    18     public function index()
    19     {
    20         //
    21         session(['nowControllerAction'=>AppModelControllerAndFunction::jointControllerAndFunction()]);
    22         $data=Tag::get();
    23         return view('admin.tag.index',compact('data'));
    24     }
    25 
    26     /**
    27      * Show the form for creating a new resource.
    28      *
    29      * @return IlluminateHttpResponse
    30      */
    31     public function create()
    32     {
    33         return view('admin.tag.create');
    34     }
    35 
    36     /**
    37      * 保存新增的数据
    38      * Store a newly created resource in storage.
    39      *
    40      * @param  IlluminateHttpRequest  $request
    41      * @return IlluminateHttpResponse
    42      */
    43     public function store(TagRequest $request,Tag $model)
    44     {
    45         $model->create($request->all());
    46         return redirect('/admin/tag');
    47         //dd($request);
    48     }
    49 
    50     /**
    51      * Display the specified resource.
    52      *
    53      * @param  int  $id
    54      * @return IlluminateHttpResponse
    55      */
    56     public function show($id)
    57     {
    58         //
    59     }
    60 
    61     /**
    62      * Show the form for editing the specified resource.
    63      *
    64      * @param  int  $id
    65      * @return IlluminateHttpResponse
    66      */
    67     public function edit($id)
    68     {
    69         $model=Tag::find($id);
    70         return view('admin.tag.edit',compact('model'));
    71     }
    72 
    73     /**
    74      * Update the specified resource in storage.
    75      *
    76      * @param  IlluminateHttpRequest  $request
    77      * @param  int  $id
    78      * @return IlluminateHttpResponse
    79      */
    80     public function update(TagRequest $request, $id)
    81     {
    82         $model=Tag::find($id);
    83         $model['name']=$request['name'];
    84         $model->save();
    85         return redirect('/admin/tag');
    86     }
    87 
    88     /**
    89      * Remove the specified resource from storage.
    90      *
    91      * @param  int  $id
    92      * @return IlluminateHttpResponse
    93      */
    94     public function destroy($id)
    95     {
    96         Tag::destroy($id);
    97         return response()->json(['message'=>'刪除成功','valid'=>1]);
    98     }
    99 }

    第43行和第80行,都用TagRequest进行了验证

    二、模型

    app/Model/Tag.php

     1 <?php
     2 
     3 namespace AppModel;
     4 
     5 use IlluminateDatabaseEloquentModel;
     6 
     7 class Tag extends Model
     8 {
     9     //$guarded表示不允许批量填充的字段
    10     protected $guarded=[];
    11 }

    第10行,定义这个$guarded字段解决了剔除token字段存数据库的问题

    Tag模型对应数据库tag表,控制器中就是用Tag进行数据库操作

    三、请求

    app/Http/Requests/TagRequest.php

     1 <?php
     2 
     3 namespace AppHttpRequests;
     4 
     5 use IlluminateFoundationHttpFormRequest;
     6 
     7 class TagRequest extends FormRequest
     8 {
     9     /**
    10      * Determine if the user is authorized to make this request.
    11      *
    12      * @return bool
    13      */
    14     public function authorize()
    15     {
    16         return true;
    17     }
    18 
    19     /**
    20      * Get the validation rules that apply to the request.
    21      *
    22      * @return array
    23      */
    24     public function rules()
    25     {
    26         return [
    27             'name'=>'sometimes|required',
    28         ];
    29     }
    30 
    31     /**
    32      * 中文提示
    33      * @return array
    34      */
    35     public function messages()
    36     {
    37         return [
    38             'name.required'=>'标签名称不能为空',
    39         ];
    40     }
    41 }

    四、视图

    resources/views/admin/tag/create.blade.php
     1 @extends('admin.layout.master')
     2 @section('title','新增标签')
     3 @section('content')
     4     <!-- Content Header (Page header) -->
     5     <section class="content-header">
     6         <h1>
     7             Dashboard
     8             <small>Control panel</small>
     9         </h1>
    10         <ol class="breadcrumb">
    11             <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
    12             <li class="active">Dashboard</li>
    13         </ol>
    14     </section>
    15 
    16     <!-- Main content -->
    17     <section class="content">
    18         <div style="padding-bottom:15px;">
    19             <div class="btn-group" role="group" aria-label="...">
    20                 <a href="/admin/tag" type="button" class="btn btn-default">标签列表</a>
    21                 <a href="/admin/tag/create" type="button" class="btn btn-warning">新增标签</a>
    22             </div>
    23         </div>
    24 
    25         <div class="box box-info">
    26             <div class="box-header with-border">
    27                 <h3 class="box-title">Horizontal Form</h3>
    28             </div>
    29             <!-- /.box-header -->
    30             <!-- form start -->
    31             <form class="form-horizontal" action="/admin/tag" method="post">
    32                 {{csrf_field()}}
    33                 <div class="box-body">
    34                     <div class="form-group">
    35                         <label for="name" class="col-sm-2 control-label">标签</label>
    36 
    37                         <div class="col-sm-10">
    38                             <input type="text" name="name" class="form-control" id="name" required placeholder="标签">
    39                         </div>
    40                     </div>
    41 
    42                 </div>
    43                 <!-- /.box-body -->
    44                 <div class="box-footer">
    45                     <button type="submit" class="btn btn-info">保存数据</button>
    46                 </div>
    47                 <!-- /.box-footer -->
    48             </form>
    49         </div>
    50 
    51     </section>
    52     <!-- /.content -->
    53 @endsection
    resources/views/admin/tag/edit.blade.php
     1 @extends('admin.layout.master')
     2 @section('title','修改标签')
     3 @section('content')
     4     <!-- Content Header (Page header) -->
     5     <section class="content-header">
     6         <h1>
     7             Dashboard
     8             <small>Control panel</small>
     9         </h1>
    10         <ol class="breadcrumb">
    11             <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
    12             <li class="active">Dashboard</li>
    13         </ol>
    14     </section>
    15 
    16     <!-- Main content -->
    17     <section class="content">
    18         <div style="padding-bottom:15px;">
    19             <div class="btn-group" role="group" aria-label="...">
    20                 <a href="/admin/tag" type="button" class="btn btn-default">标签列表</a>
    21                 <a href="/admin/tag/create" type="button" class="btn btn-warning">修改标签</a>
    22             </div>
    23         </div>
    24 
    25         <div class="box box-info">
    26             <div class="box-header with-border">
    27                 <h3 class="box-title">Horizontal Form</h3>
    28             </div>
    29             <!-- /.box-header -->
    30             <!-- form start -->
    31             <form class="form-horizontal" action="/admin/tag/{{$model['id']}}" method="post">
    32                 {{csrf_field()}}
    33                 @method('PUT')
    34                 <div class="box-body">
    35                     <div class="form-group">
    36                         <label for="name" class="col-sm-2 control-label">标签</label>
    37 
    38                         <div class="col-sm-10">
    39                             <input type="text" name="name" class="form-control" id="name" required placeholder="标签" value="{{$model['name']}}">
    40                         </div>
    41                     </div>
    42 
    43                 </div>
    44                 <!-- /.box-body -->
    45                 <div class="box-footer">
    46                     <button type="submit" class="btn btn-info">保存数据</button>
    47                 </div>
    48                 <!-- /.box-footer -->
    49             </form>
    50         </div>
    51 
    52     </section>
    53     <!-- /.content -->
    54 @endsection

    第33行,请求伪造

    resources/views/admin/tag/index.blade.php
     1 @extends('admin.layout.master')
     2 @section('title','标签页面')
     3 @section('content')
     4     <!-- Content Header (Page header) -->
     5     <section class="content-header">
     6         <h1>
     7             Dashboard
     8             <small>Control panel</small>
     9         </h1>
    10         <ol class="breadcrumb">
    11             <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
    12             <li class="active">Dashboard</li>
    13         </ol>
    14     </section>
    15 
    16     <!-- Main content -->
    17     <section class="content">
    18         <div style="padding-bottom:15px;">
    19             <div class="btn-group" role="group" aria-label="...">
    20                 <a href="/admin/tag" type="button" class="btn btn-warning">标签列表</a>
    21                 <a href="/admin/tag/create" type="button" class="btn btn-default">新增标签</a>
    22             </div>
    23         </div>
    24 
    25         <div class="box box-primary">
    26             <div class="box-header with-border">
    27                 <h3 class="box-title">Bordered Table</h3>
    28             </div>
    29             <!-- /.box-header -->
    30             <div class="box-body">
    31                 <div class="table-responsive" style="overflow: visible;min-height: 200px;">
    32                     <table class="table table-hover">
    33                         <tbody>
    34                         <tr class="info">
    35                             <th style=" 10px">#</th>
    36                             <th>标签</th>
    37                             <th>操作</th>
    38                         </tr>
    39                         @foreach($data as $d)
    40                             <tr>
    41                                 <td>{{$d['id']}}.</td>
    42                                 <td>{{$d['name']}}</td>
    43                                 <td>
    44                                     <div class="btn-group">
    45                                         <button type="button" class="btn btn-info">操作</button>
    46                                         <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown">
    47                                             <span class="caret"></span>
    48                                             <span class="sr-only">Toggle Dropdown</span>
    49                                         </button>
    50                                         <ul class="dropdown-menu" role="menu" style="">
    51                                             <li><a href="/admin/tag/{{$d['id']}}/edit">编辑</a></li>
    52                                             <li><a href="javascript:;" onclick="del({{$d['id']}})">删除</a></li>
    53                                         </ul>
    54                                     </div>
    55                                 </td>
    56                             </tr>
    57                         @endforeach
    58 
    59                         </tbody>
    60                     </table>
    61                 </div>
    62 
    63             </div>
    64             <!-- /.box-body -->
    65             <div class="box-footer clearfix">
    66                 <ul class="pagination pagination-sm no-margin pull-right">
    67                     <li><a href="#">«</a></li>
    68                     <li><a href="#">1</a></li>
    69                     <li><a href="#">2</a></li>
    70                     <li><a href="#">3</a></li>
    71                     <li><a href="#">»</a></li>
    72                 </ul>
    73             </div>
    74         </div>
    75 
    76     </section>
    77     <!-- /.content -->
    78     <script>
    79         function del(id){
    80             // require(['util'],function () {
    81             //     util.confirm('确定删除么?',function () {
    82             //
    83             //     });
    84             // });
    85             if(confirm('确定删除么')){
    86                 $.ajax({
    87                     url:'/admin/tag/'+id,
    88                     method:'DELETE',
    89                     success:function (response) {
    90                         location.reload();
    91                     }
    92                 });
    93             }
    94         }
    95     </script>
    96 @endsection

    这里的ajax没有传token字段是因为 模板主页里面进行了jquery的token验证,调用jquery会自动传token来验证的

     
  • 相关阅读:
    HTML5语音合成Speech Synthesis API简介
    数据库两大神器【索引和锁】
    进程、进程组、作业、会话
    linux的会话、进程、进程组等概念
    linux命令eval的用法
    配置mutt
    Shell 实现多任务并发
    利用linux mutt 发送邮件(在Shell脚本中使用比较方便)
    Linux-Shell-使用mkfifo实现多任务并发及并发数控制
    js逆向笔记
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/11531274.html
Copyright © 2020-2023  润新知