Laravel - 访客用户门控:初学者指南

你好,有抱负的开发者们!今天,我们将深入 Laravel 的世界,探索一个名为“访客用户门控”的有趣概念。如果你是编程新手,不用担心——我会像过去几年教导无数学生一样,一步步地解释所有内容。所以,拿起一杯咖啡,让我们一起开始这段激动人心的旅程!

Laravel - Guest User Gates

什么是访客用户门控?

在我们跳入代码之前,先来了解一下访客用户门控是什么。想象你在家里举办一个派对。对于你的亲密朋友和不太熟悉的客人,你有不同的规则。Laravel 中的访客用户门控也是这样工作的——它们帮助你为未登录到应用程序的用户设置规则。

为什么我们需要访客用户门控?

你可能会有疑问:“为什么要麻烦处理访客用户?我们不可以把所有内容都设为公开吗?” 嗯,我的年轻朋友,安全性在网页开发中至关重要。访客用户门控允许我们控制匿名用户在应用程序中可以和不可以做什么,保持我们的数字家庭派对对每个人来说都是安全和有趣的!

设置访客用户门控

现在,让我们卷起袖子,亲自动手写一些代码。别担心一开始看起来可能有点吓人——我们会一行行地过。

步骤 1:定义门控

首先,我们需要定义我们的门控。在 Laravel 中,我们通常在 AuthServiceProvider.php 文件中这样做。下面是如何操作的:

use Illuminate\Support\Facades\Gate;

public function boot()
{
$this->registerPolicies();

Gate::define('view-post', function (?User $user) {
return true;
});
}

让我们分解一下:

  1. 我们使用了 Gate 门面,它提供了一个简单的方式来在 Laravel 中授权动作。
  2. boot 方法内,我们定义了一个名为 'view-post' 的新门控。
  3. ?User $user 参数允许这个门控用于认证用户和访客用户。
  4. 现在,我们返回 true,这意味着每个人(包括访客)都可以查看帖子。

步骤 2:在控制器中使用门控

现在我们已经定义了门控,让我们在控制器中使用它:

use Illuminate\Support\Facades\Gate;

public function show(Post $post)
{
if (Gate::allows('view-post')) {
return view('posts.show', compact('post'));
}

abort(403);
}

这里发生了什么:

  1. 我们检查当前用户(访客或认证)是否被允许查看帖子。
  2. 如果允许,我们返回带有帖子的视图。
  3. 如果不允许,我们中断并返回一个 403(禁止)错误。

步骤 3:给门控添加逻辑

让我们使我们的门控更智能一些。我们将允许访客仅查看已发布的帖子:

Gate::define('view-post', function (?User $user, Post $post) {
return $post->published_at !== null;
});

现在我们的门控接受两个参数:

  1. 用户(对于访客可能是 null)
  2. 我们试图查看的特定帖子

我们检查帖子是否有 published_at 日期。如果有,帖子可供访客查看。

步骤 4:更新控制器

让我们更新我们的控制器以使用这个新的逻辑:

public function show(Post $post)
{
if (Gate::allows('view-post', $post)) {
return view('posts.show', compact('post'));
}

abort(403);
}

这里唯一的改变是我们把 $post 传递给了 Gate::allows() 方法。

高级访客用户门控

现在你已经掌握了基础知识,让我们看看一些更高级的技术。

结合访客用户和认证用户的逻辑

有时,你希望为访客和认证用户设置不同的规则。下面是如何做到的:

Gate::define('view-post', function (?User $user, Post $post) {
if ($user === null) {
return $post->published_at !== null;
}

return $user->id === $post->user_id || $post->published_at !== null;
});

在这个例子中:

  • 访客只能查看已发布的帖子
  • 认证用户可以查看他们自己的帖子(即使未发布)和任何已发布的帖子

在 Blade 模板中使用门控

门控不仅适用于控制器!你还可以在 Blade 模板中使用它们:

@can('view-post', $post)
<h1>{{ $post->title }}</h1>
<p>{{ $post->content }}</p>
@else
<p>抱歉,你不能查看这个帖子。</p>
@endcan

这使得你的模板更加动态和安全。

访客用户门控的最佳实践

在我们结束之前,让我们谈谈我多年来学到的一些最佳实践:

  1. 保持简单:从简单的门控开始,并根据需要增加复杂性。
  2. 明确性:即使你认为一个路由是公开的,也要始终检查权限。
  3. 使用策略类:对于复杂的授权逻辑,考虑使用策略类而不是内联门控。
  4. 测试你的门控:编写测试以确保你的门控对访客和认证用户的行为正确。

结论

恭喜你!你已经迈出了进入 Laravel 访客用户门控世界的第一步。记住,就像学习骑自行车一样,一开始可能会感到不稳,但随着练习,你很快就能自如地骑行。

以下是我们在本文中涵盖的方法的快速参考表:

方法 描述
Gate::define() 定义一个新的门控
Gate::allows() 检查门控是否允许一个动作
@can Blade 指令用于门控检查

继续编码,继续学习,最重要的是,享受乐趣!谁知道呢?也许有一天,你将成为教导新一代开发者 Laravel 奇迹的人。下次见,快乐编码!

Credits: Image by storyset