删除任务:
添加删除按钮:
我们在我们的代码里面留下了 “TODO” 记号,这个位置将会被我替换成我删除按钮,所以,让我们在 tasks/index.blade.php 视图里面的每一行都添加一个删除按钮来监听删除事件。我们将会创建一个小的单独的按钮form表单对于每一个任务列表。当这个按钮被点击,一个 删除动作 / task 请求将会被发送到应用里面,这个启动我们的TaskController@destory 方法。
一个标记在函数里面哄骗
标记这个删除按钮表单的提交方法作为POST方式,甚至虽然我们通过路由 Route::delete来反馈通过请求。
HTML 表单仅仅允许GET和POST方式进行HTTP提交,所以,我们需要通过一种途径来欺骗请求方式在我们的form表单里面。
我们可以欺骗一个 delete 类型的请求通过 在表单中使用 method_field(‘DELETE’)函数。这个函数产生一个隐藏表单input 方式,laravel 承认这个,并且将会重写实际的HTTP请求方法,创建的字段如下图:
<input type="hidden" name="_method" value="DELETE">
路由绑定:
现在,我们几乎准备定义这个 destory 方法在我们的TaskController 控制器里面。但是,首先,让我们在回顾一下我们的路由定义。
Route::delete(‘task/{task}’,’TaskController@destory’);
不需要添加任何额外的代码,laravel 将会注入这个 给到的任务ID到 TaskController@destory 方法里面,
然而,在任何事情开始前,我们都需要恢复任务实例通过ID在数据库里面查找。所以,再好不过了,如果laravel 框架仅仅注入 Task 实例,首先匹配到地i个地方,让我们更好的处理一下。
在你的 app/Providers/RouteServiceProvider.php 文件里面的 boot 函数,让我们添加如下的代码。
这个简单一行代码将会指导 laravel 框架检索 task 模型,这个模型匹配一个ID,这个ID从路由文件中{task}里面获取到的。现在我们定义我们的销毁方法。
认证:
现在,我们拥有一个 Task 实例注入我们的 destory 方法,然而,我们没办法保证认证用户实际拥有自己的任务列表,举个例子,一条恶意的请求图谋尝试删除其它人的任务通过一个随机的任务ID到 /task/{task}地址,所以,我们需要laravels 框架认证能力能够确保作者实际拥有 Task 实例,在路由中指向的。
创建一个政策:
laravels 使用 “policies”来组织认证逻辑到简单的、小的类,典型的,每个政策匹配一个模型,所以,让我们创建一个 TaskPolicy 使用artisan 命令行,
这个将会生产存放文件 app/Policies/TaskPolicy.php
php artisan make:policy TaskPolicy
接下来,让我们添加一个 destory 方法到这个policy。 这个方法将会接收到 User 实例化跟 一个 Task 实例化。这个方法应该简单的检查这个用户的ID是否匹配 user_id 在任务里面的。所以这个方法返回的就只有 true 跟 false 方式。
最后,我们需要联合我们Task 模型跟我们的 TaskPolicy 。 我们做这些,通过添加一个行 app/Providers/AuthServiceProvider.php , 这个将会通知 laravel
应该使用 U
认证这个行为:
现在我们的政策已经写完了,让我们使用我们的destory 方法,所有的 laravel 控制器可以调用 authorize 方法。这个 暴露了一个 AuthorizesRequest trait
通过调用一下来检查这个方法,这个第一个参数传递到 authorize 方法是这个政策
请确认阅读完整的 authorization 文档。
删除任务: