【问题标题】:Laravel Destroy Option not deletingLaravel 销毁选项不删除
【发布时间】:2017-01-18 04:14:19
【问题描述】:

为什么会出现这种情况?这是我所有帐户的索引列表。我只想通过 category.destroy 路由删除特定类别,但它是

index.blade.php

@extends('layouts.master')
@section('title','All Categories')
@section('contents')
<div class="row">
    <div class="col-md-8 col-sm-4 col-md-offset-2">
        <div class="panel panel-default">
            <div class="panel-heading">All Categories</div> 
            <div class="panel-body">
                <article>
                    <div class="table-responsive-vertical shadow-z-1">
                        <!-- Table starts here -->
                        <table id="table" class="table table-hover table-mc-light-blue">
                            <thead>
                                <tr>
                                    <th>ID No</th>
                                    <th>Category</th>
                                    <th>Edit/Delete</th>
                                    <th>Status</th>
                                </tr>
                            </thead>
                            @foreach($categories as $category)
                            <tbody>
                                <tr>
                                    <td data-title="ID">{{$category->id}}</td>
                                    <td data-title="Name">{{$category->name}}</td>
                                    <td><a href="{{ route('category.edit',$category->id)  }}" class="btn btn-primary btn-sm pull-left">Edit</a>
                                        &nbsp<a href="{{ route('category.destroy', $category->id)  }}" class="btn btn-danger btn-sm">Delete</a>
                                    </td>

                                </tr>         
                            </tbody>
                            @endforeach
                        </table>
                    </div>
                </article>

            </div>
        </div>
    </div>
</div>
@endsection
@section('js') 
{!!Html::script('assets/js/jquery.min.js')!!} 
{!!Html::script('assets/js/bootstrap.min.js') !!}
<script>
    $('#flash-overlay-modal').modal();
</script>

<script>
    $('div.alert').not('.alert-important').delay(3000).fadeOut(350);
</script>
@endsection

CategoryController.php

public function destroy($id){
        $category = Category::findOrFail($id);
        $category->delete();
        Session::flash('flash_message', 'Task successfully deleted!');
        return redirect()->route('category.index');
    }

相反,它只显示类别的视图特定条目。不是删除什么的

【问题讨论】:

  • 如果你链接到路由,那么你实际上并没有访问那个路由,因为销毁路由不是GET,而是DELETE,因此你实际上应该创建一个小的表单到销毁路由并使用按钮触发表单操作到实际路由。

标签: php laravel laravel-5 laravel-routing


【解决方案1】:

试试这条路线:

Route::get('category/{category}/destroy',[
  'uses'=>'CategoryController@destroy',
  'as' => 'category.destroy'
]);

【讨论】:

  • @A.Sand 虽然这可能有效,但 GET 请求应该是“只读”的。您可能不想开始允许 GET 请求修改数据。您最好访问由资源定义创建的正确的 DELETE 路由。
  • @patricus 是的,这并不安全,但如果他像管理员用户一样通过身份验证保护他的请求,是否存在同样的漏洞?
  • @maudev 如果链接在身份验证之后,您无需担心网络爬虫,但身份验证墙不会阻止其他问题,例如预取或 CSRF 攻击(Laravel 保护“写" 动词(POST、DELETE 等)默认带有一个标记;需要额外的工作来保护特定的 GET 请求)。
  • @patricus 谢谢你的信息,我会记住的。
【解决方案2】:

要访问您的销毁路由,您必须使用 DELETE HTTP 请求动词。 HTML 链接只允许 GET 请求。

您应该将 HTML 链接更改为spoofs DELETE 方法的 HTML 表单,或者考虑使用 restfulizer.js 之类的东西,它会自动将您的删除链接转换为删除表单。

正如建议的那样,您也可以为删除功能创建一个 GET 路由,但这样做有潜在的后果。 GET 和 HEAD 请求通常应被视为“只读”请求,不应修改任何数据。 POST、PUT、PATCH 和 DELETE 请求通常被认为是“写入”请求。网络蜘蛛可能会抓取您的删除链接并最终删除您的所有数据,或者网络浏览器可能会预先获取页面上的所有 GET 请求,因此即使没有人点击删除按钮,也会访问删除链接。当您开始允许 GET 请求修改数据时,可能会发生很多潜在的令人讨厌的事情。 this answer有一些很好的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多