laravel 中级任务--小白教程----实际操作-创建基础任务 to-do-list 案例 ---删除数据
2017-06-02 22:35 吃饱了才能撑着 阅读(81) 评论(0) 收藏 举报到目前为止,整个程序,看起来,已经差不多了!
但是默认的删除的为?
<form action='{{url("/task/{$task->id}")}}'method="post">
{{csrf_field()}}
{{method_field('DELETE')}}
<button>删除按钮</button>
{{csrf_field()}}
{{method_field('DELETE')}}
<button>删除按钮</button>
</form>
跳转地址为?
http://www.laravel.net/index.php/task/task_ID 提交方式是 delete
对应的 处理函数是
public function destroy(Request $request,Task$task){
//TODO
$this->authorize('destroy',$task);
$task->delete();
return redirect('/tasks');
//TODO
$this->authorize('destroy',$task);
$task->delete();
return redirect('/tasks');
}
报错信息为:
This action is unauthorized.
HTTP Exception
开启新的征程,解决报错。
如何解决这个问题呢?
第一步: 在我们的 app/Providers/RouteServiceProvider.php 文件的 boot 方法里面,添加一下,新的 内容。
如:
$router->model('task','App\Task');
添加完成的整体效果:
public function boot(Router $router)
{
//
parent::boot($router);
$router->model('task','App\Task');
{
//
parent::boot($router);
$router->model('task','App\Task');
}
这行代码的意义,就是告诉 laravel 框架,无论什么时候,在路由文件中,只要遇到{task} 这样的标记,就要记得匹配我们的 App\Task 模型。
也就是说,以前可以 这样写的代码。
public function destroy(Request $request, $taskId){}
可以改写为:
public function destroy(Request $request, Task $task){}
就是第二个输入的参数类型,转换称为了 Task 模型的实例化。
完成了 从ID 到 Task 模型的转换,让我们继续。 也就是 完成了 Task 实例 注入到 destroy 方法。这样做的好处,就是,可以让我 直接通过调用 Task 模型的 delete() 方法来删除数据。
但是,我们如果仅仅凭借ID 来删除 数据的话,就会有心怀叵测之人,随意可以删除其它人的数据,那么我们删除的时候,同样需要数据验证。
所以呢,我们在我们的认证体系里面,创建了一个 可以删除数据的 政策。操作命令如下
php artisan make:policy TaskPolicy
执行成功之后,会发现在我们的 app\Policies\TaskPolicy.php 文件,就多出来了。
接下来,让我们完善一下这个代码。
在 类命名空间引入的位置 添加
use App\User;
use App\Task;
类内部添加这个方法:
public function destroy(User $user,Task $task){
return $user->id === $task->user_id;
return $user->id === $task->user_id;
}
来判读,当前操作的人,跟添加这条数据的人,是否是同一个人。
创建完成,让我们来告诉程序,我们 政策创建完成了,怎么告诉呢?很简单
找到我们的 app/Providers/AuthServiceProvider.php 这个文件
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
Task::class => TaskPolicy::class,
'App\Model' => 'App\Policies\ModelPolicy',
Task::class => TaskPolicy::class,
];
use App\Task;
use App\Policies\TaskPolicy;
添加完成!
或者可以这样添加:
'App\Task' => 'App\Policies\TaskPolicy',
那么使用呢,就是我们上面的那个 authorize() 函数,进行了使用。
再次刷新,就执行删除成功了!
总结:
第一步:将 task_Id 映射到 Task 模型,这样,就可以直接使用 Task 模型 的 delete() 方法来删除数据了。
第二步:为了方式其他人恶意删除数据,我们添加了删除政策,绑定政策,及使用政策。
php初学者-千锋php课程笔记
浙公网安备 33010602011771号