授权:了解 Laravel 中的策略

控制用户在应用程序中可以执行或不能执行的操作是构建实际应用程序时需要做的最重要的事情之一。

例如,在待办事项应用程序中,您不希望用户能够编辑或删除其他用户的待办事项。

在本文中,您将学习在 laravel 中实现此目的的无缝方法之一,即使用策略来控制用户可以通过构建简单的待办事项应用程序执行哪些操作。

要学习本教程,您需要对 laravel 及其应用程序结构有基本的了解。

创建基础应用程序

运行以下命令在所需文件夹中创建一个新的 laravel 应用程序并移入其中:

composer create-project laravel/laravel todo-app && cd todo-app

接下来,运行以下命令来安装 laravel breeze:

php artisan breeze:install

breeze 将通过身份验证构建您的新应用程序,以便您的用户可以注册、登录、注销和查看他们的个性化仪表板。

之后,通过运行以下命令编译您的应用程序资产:

npm install && npm run dev

laravel 默认情况下附带基于文件的 sqlite 数据库,因此您需要做的下一件事是将应用程序数据库文件连接到数据库查看器,例如 tableplus 或任何其他您喜欢的数据库查看器。

将数据库连接到查看器后,运行以下命令将可用表迁移到数据库中:

php artisan migrate

完成后,运行以下命令在浏览器中查看您的应用程序:

php artisan serve

您现在应该在 localhost:8000 上看到新的 laravel 应用程序,如下所示:

授权:了解 Laravel 中的策略

您现在可以转到注册页面创建用户并访问仪表板,这是此时的整个应用程序。

模型设置

laravel 中的模型用于控制数据库表。使用以下命令在 app/models 文件夹中创建 todo 模型:

php artisan make:model todo

接下来,在新创建的文件中,用以下代码替换 todo 类:

class todo extends model{    use hasfactory;    protected $fillable = [        'title',        'description',        'completed',        'user_id'    ];    public function user()    {        return $this->belongsto(user::class);    }}

上面的代码将使用户能够提交具有 $fillable 属性的表单;它还定义了用户和待办事项之间的关系;在这种情况下,待办事项属于用户。让我们通过将以下代码添加到 app/models/user.php 文件来完成关系设置:

    public function todos()    {        return $this->hasmany(todo::class);    }

上面的代码将 user 模型连接到 todo 模型,以便它可以有很多待办事项。

迁移设置

laravel 中的迁移用于指定数据库表中应包含的内容。运行以下命令在 database/migrations 文件夹中创建迁移:

php artisan make:migration create_todos_table

接下来,将新文件中的 up 函数替换为以下内容,该函数会将 todo 表添加到数据库中,其中包含 id、user_id、title、description、completed 和 timestamp 列:

   public function up(): void    {        schema::create('todos', function (blueprint $table) {            $table->id();            $table->foreignid('user_id')->constrained()->ondelete('cascade');            $table->string('title');            $table->text('description')->nullable();            $table->boolean('completed')->default(false);            $table->timestamps();        });    }

接下来,运行以下命令将 todos 表添加到数据库中:

php artisan migrate

策略设置

laravel 中的策略允许您定义谁可以使用特定资源(在本例中为待办事项)执行哪些操作。

让我们通过使用以下命令在 app/policies 文件夹中生成 todopolicy 来看看它是如何工作的:

php artisan make:policy todopolicy --model=todo

接下来,在新创建的 todopolicy 文件中,将 todopolicy 类替换为以下代码:

class todopolicy{    /**     * determine if the user can view any todos.     */    public function viewany(user $user): bool    {        return true;    }    /**     * determine if the user can view the todo.     */    public function view(user $user, todo $todo): bool    {        return $user->id === $todo->user_id;    }    /**     * determine if the user can create todos.     */    public function create(user $user): bool    {        return true;    }    /**     * determine if the user can update the todo.     */    public function update(user $user, todo $todo): bool    {        return $user->id === $todo->user_id;    }    /**     * determine if the user can delete the todo.     */    public function delete(user $user, todo $todo): bool    {        return $user->id === $todo->user_id;    }}

上面的代码指定用户可以创建待办事项,但只能查看、更新或删除属于自己的待办事项。

接下来,让我们在下一节中设置控制器。

控制器设置

laravel 中的控制器控制应用程序针对特定资源的功能。运行以下命令在 app/http/controllers 中生成 todocontroller:

php artisan make:controller todocontroller

在新建的todocontroller文件顶部添加以下代码,导入用于数据库操作的todo模型和用于授权的gate类:

use appmodelstodo;use illuminatesupportfacadesgate;

指数法

将索引方法替换为以下代码,以获取并返回所有登录用户的待办事项:

    public function index()    {        gate::authorize('viewany', todo::class);        $todos = auth()->user()->todos;        return view('todos.index', compact('todos'));    }

gate::authorize 方法验证用户是否使用您在上一节中定义的 viewany 策略方法登录。

创建方法

将 create 方法替换为以下代码,以验证用户是否已登录,然后再将创建待办事项表单返回给用户,以便他们可以创建待办事项:

    public function create()    {        gate::authorize('create', todo::class);        return view('todos.create');    }

储存方式

用以下代码替换 store 方法,检查用户是否可以创建待办事项、验证请求、创建待办事项并将用户重定向到待办事项列表页面:

public function store(request $request)    {        gate::authorize('create', todo::class);        $validated = $request->validate([            'title' => 'required|max:255',            'description' => 'nullable'        ]);        $todo = auth()->user()->todos()->create($validated);        return redirect()->route('todos.index')            ->with('success', 'todo created successfully');    }

编辑方法

将编辑方法替换为以下代码,以验证用户是否可以编辑该待办事项,然后将填充了所选待办事项的编辑待办事项表单返回给用户,以便他们可以对其进行编辑:

    public function edit(todo $todo)    {        gate::authorize('update', $todo);        return view('todos.edit', compact('todo'));    }

更新方法

用以下代码替换 update 方法,检查用户是否可以更新待办事项、验证请求、更新选定的待办事项并将用户重定向到待办事项列表页面:

    public function update(request $request, todo $todo)    {        gate::authorize('update', $todo);        $validated = $request->validate([            'title' => 'required|max:255',            'description' => 'nullable'        ]);        $todo->update($validated);        return redirect()->route('todos.index')            ->with('success', 'todo updated successfully');    }

销毁方法

用以下代码替换 destroy 方法,检查用户是否可以删除该待办事项,删除它,并将用户重定向到待办事项列表页面:

    public function destroy(todo $todo)    {        gate::authorize('delete', $todo);        $todo->delete();        return redirect()->route('todos.index')            ->with('success', 'todo deleted successfully');    }

您的 todocontroller 文件现在应该如下所示:

user()->todos;        return view('todos.index', compact('todos'));    }    public function create()    {        gate::authorize('create', todo::class);        return view('todos.create');    }    public function store(request $request)    {        gate::authorize('create', todo::class);        $validated = $request->validate([            'title' => 'required|max:255',            'description' => 'nullable'        ]);        $todo = auth()->user()->todos()->create($validated);        return redirect()->route('todos.index')            ->with('success', 'todo created successfully');    }    public function edit(todo $todo)    {        gate::authorize('update', $todo);        return view('todos.edit', compact('todo'));    }    public function update(request $request, todo $todo)    {        gate::authorize('update', $todo);        $validated = $request->validate([            'title' => 'required|max:255',            'description' => 'nullable'        ]);        $todo->update($validated);        return redirect()->route('todos.index')            ->with('success', 'todo updated successfully');    }    public function destroy(todo $todo)    {        gate::authorize('delete', $todo);        $todo->delete();        return redirect()->route('todos.index')            ->with('success', 'todo deleted successfully');    }}

视图设置

现在您的 todocontroller 方法已全部设置完毕,您现在可以通过在 resources/views 文件夹中创建一个新的 todos 文件夹来为您的应用程序创建视图。之后,在新的todos文件夹中创建create.blade.php、edit.blade.php、index.blade.php文件。

索引视图

将以下代码粘贴到index.blade.php中:

            

{{ __('todos') }}

{{-- --}}
@foreach($todos as $todo)

{{ $todo->title }}

{{ $todo->description }}

edit @csrf @method('delete')
@endforeach

创建视图

将以下代码粘贴到 create.blade.php 中:

            

{{ __('create todo') }}

@csrf

编辑视图

将以下代码粘贴到 edit.blade.php 中:

            

{{ __('edit todo') }}

@csrf @method('put')
title }}" class="w-full px-3 py-2 border rounded" required>

路线设置

使用 laravel 中的资源方法处理 todocontroller 的路由相对简单。通过将以下代码添加到 paths/web.php 文件夹的末尾来实现此目的,如下所示:

// rest of the fileRoute::middleware(['auth'])->group(function () {    Route::resource('todos', TodoController::class);});

上面的代码使用了 auth 中间件来保护 todos 资源。登录后,您现在应该能够在应用程序中访问以下路线:

/todos: 列出所有用户的待办事项/todos/create: 显示创建待办事项的表单/todos/edit/1:显示用于编辑给定 id 的待办事项的表单;在本例中为 1。

您现在可以创建、编辑和删除待办事项,但在编辑和删除时只能以登录用户和所选待办事项的所有者身份进行。

结论

就是这样!您刚刚创建了一个真实的待办事项应用程序,该应用程序允许用户仅创建、查看、编辑和删除自己的待办事项。如果您有任何更正、建议或问题,请在评论中告诉我!

最后,记得在 dev、linkedin 和 twitter 上关注我。非常感谢您的阅读,我们下一篇再见!

以上就是授权:了解 Laravel 中的策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1248649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 20:40:59
下一篇 2025年12月9日 20:41:06

相关推荐

  • 如何使用 Eloquent 计算多列的总和

    在本教程中,我将向您展示如何使用 eloquent 计算多列的总和。 laravel 提供了通过“sum”方法聚合列值的内置支持,允许您计算列值的总和。您可以学习如何使用 eloquent 计算列的平均值 这里的主要警告是 eloquent 一次只能对一列求和。要对 2 列求和,我们可以调用 sum…

    2025年12月9日
    000
  • Laravel 中新的 `@bool` Blade 指令!

    新的 @bool blade 指令 laravel 的 blade 模板引擎获得了一个方便的新功能:@bool 指令。这允许您直接将布尔值打印到字符串中或在对象构造中使用它们,使您的 javascript 集成更干净、更高效。 使用方法如下: let config = { isactive: @bo…

    2025年12月9日
    000
  • Laravel 领域驱动设计 (DDD) 简单指南

    您是否曾感觉到,随着 laravel 项目的发展,事情开始变得有点失控?控制器变得臃肿,模型开始做太多事情,突然之间,你的代码库就像你几个月来一直想组织的抽屉一样。这就是 领域驱动设计 (ddd) 可以介入并让您的生活更轻松的地方。 ddd 是一种设计应用程序的方法,使其结构与您在现实世界中解决的问…

    2025年12月9日
    000
  • Laravel 中的交易

    在某些情况下,我们需要进行一系列连续的操作,必须全部顺利完成,不能半途而废。 一个常见的示例是创建用户,其中还必须分配角色并发送注册电子邮件。 为了处理这些类型的情况,需要使用事务。下面的方法创建用户、分配角色,然后通过 sendemail() 方法发送电子邮件。此方法接收电子邮件作为参数并相应地发…

    2025年12月9日
    000
  • 了解 PSR – PHP 编码风格指南

    如果您使用 php 进行开发已有一段时间,您可能遇到过术语 psr-12。它是 php 社区中最广泛接受的编码标准之一,旨在确保不同项目之间 php 代码库的一致性。无论您是单独工作还是作为团队的一员,遵循 psr-12 都可以使您的代码更干净、更具可读性并且更易于维护。在本博客中,我们将详细介绍 …

    2025年12月9日
    000
  • Laravel 中的整洁代码架构:实用指南

    如果您使用 laravel 进行开发已经有一段时间了,您可能听说过“干净的代码”这个词。但它在 laravel 开发的背景下实际上意味着什么?更重要的是,你为什么要关心? “干净的代码”是指易于理解、维护和扩展的代码。干净的代码架构通过提供一种结构使这一点更进一步,使您可以随着应用程序的增长更轻松地…

    2025年12月9日
    000
  • Laravel 自定义辅助函数 – 快速提示

    辅助函数在 laravel 开发者中非常流行。它们提供了对一些巧妙算法的访问,可以使用单个语句在您的代码中使用。 最知名的辅助函数可能是 url(),它允许您生成内部应用程序 url。 另一个很棒的帮手是 retry() 函数,例如:https://laravel.com/docs/11.x/hel…

    2025年12月9日
    000
  • Lithe 上的 PHP 会话管理:从基础配置到高级使用

    当我们谈论 web 应用程序时,首要需求之一是在用户浏览页面时维护用户的信息。这就是 lithe 中的 会话管理 的用武之地,它允许您存储登录信息或用户首选项等数据。 安装简单快捷 要开始在 lithe 中使用会话,您只需通过 composer 安装会话中间件。只需在项目中的终端中运行以下命令: c…

    2025年12月9日
    000
  • 使用 Lithe 进行 PHP 会话管理:从基本设置到高级使用

    当我们谈论 web 应用程序时,首要需求之一是在用户浏览页面时维护用户信息。这就是 lithe 中的 会话管理 的用武之地,它允许您存储登录信息或用户首选项等数据。 安装简单快捷 要开始在 lithe 中使用会话,您只需通过 composer 安装会话中间件。只需在项目中的终端中运行以下命令: co…

    2025年12月9日
    000
  • 支持 HydePHP 并使您的影响加倍!

    将您对 HydePHP 的捐款翻倍! 我们很高兴能有机会支持 HydePHP 并让您的贡献更进一步! Simon Hamp (@simonhamp) 为开源项目发起了慷慨的匹配捐赠活动。您可以通过以下方式参与并帮助 HydePHP: 向 HydePHP 的 OpenCollective 捐赠任意金额…

    2025年12月9日
    000
  • 使用接口和特征在 PHP 中编写灵活的枚举

    php 枚举是一个强大的工具,用于定义一组固定的常量,同时使您能够将功能附加到这些常量。除了简单地保存值之外,枚举还可以实现接口并使用特征来扩展其功能。这使得它们在复杂的应用程序中更加灵活和可重用。 在这篇文章中,我们将通过将枚举与接口和特征相结合,将您的 php 枚举设计提升到一个新的水平。我们将…

    2025年12月9日
    000
  • Comparison: Lithe vs Other PHP Frameworks

    如果您正在为下一个项目探索 PHP 框架,很自然会遇到 Laravel、Symfony 和 Slim 等选项。但是,是什么让 Lithe 与这些更强大、更知名的框架区分开来呢?以下是一些突出 Lithe 脱颖而出的注意事项。 1. 轻量级和性能 Lithe 的设计重点关注轻量级架构,提供快速高效的解…

    2025年12月9日
    000
  • Laravel API 课程

    Laravel 是构建强大 API 的最受欢迎的框架之一,现在,经过多年的规划,我很高兴终于能分享我的终极 Laravel API 课程!生活给我带来了一些麻烦,但感谢我超级支持的老板和 Treblle API 学院,我终于在令人惊叹的克罗地亚度过了一周的时间实现了这一目标。虽然我本可以更深入,但它…

    2025年12月9日
    000
  • 发布开源包:真的值得吗?

    很多人喜欢说开源社区是现代发展的支柱。但对于普通开发者来说,投入时间和精力来发布 python 和 php 包真的值得吗?一些人认为,为了获得知名度和机会,任何困难都是值得的。其他人则认为这只是一种“昂贵的爱好”,与付出的努力相比,回报即使不是不存在,也是微乎其微的。 现实情况是,大多数为开源包做出…

    2025年12月9日
    000
  • 如何使用雄辩?

    eloquent 是 laravel 的内置对象关系映射器 (orm),它提供了一种简单有效的方式与数据库交互。如何使用 eloquent,它允许您像 php 对象一样使用数据库表,并以其干净且富有表现力的语法而闻名。这是帮助您开始使用 eloquent 的指南。 如何使用 eloquent 的步骤…

    2025年12月9日
    000
  • Filament:从现有数据库架构生成资源

    在 filament 中,您可以使用 artisan 命令 make:filament-resource 生成 filament 资源。 此命令将生成一个空资源,您可以根据需要配置它。 如果您已经在 laravel 应用程序中完成了迁移和模型,则可以使用参数 –generate 让 fi…

    2025年12月9日
    000
  • 理解 Laravel 11 中 pluck() 和 select() 之间的区别

    laravel 是最流行的 php 框架之一,提供了一系列强大的数据操作方法。其中,pluck() 和 select() 在处理集合时经常使用。尽管它们看起来相似,但它们的目的不同。在本文中,我们将探讨这两种方法之间的差异,解释何时使用每种方法,并提供实际的编码示例来演示它们在 laravel 11…

    2025年12月9日
    000
  • 使用 Twig 通过 PHP 渲染 Markdown

    twig 是使用 symfony 开发 web 应用程序时渲染 html 的首选模板引擎。然而,twig 的灵活性不仅仅限于生成 html 页面。它可以成为跨多个渠道交付内容的强大工具,例如生成 markdown 文件、json 输出,甚至纯文本,所有这些都来自同一组内容。 这种适应性使您可以为不同…

    2025年12月9日
    000
  • 为什么 Docker 近年来正在失去优势

    近年来,docker一度成为开发领域的明星工具,以其突破性的技术彻底改变了软件开发。最初,docker 通过其轻量级容器化技术显着简化了开发和部署流程。然而,到了 2024 年,这项技术的缺点越来越明显。 早期的辉煌 不久前,Docker 成功解决了“它在我的机器上可以运行,但在你的机器上不行”的老…

    2025年12月9日 好文分享
    000
  • 为什么你应该为开源付费

    几乎每个开发人员每天都会使用开源项目,无论是在 VS Code 中编写代码、使用 TailwindCSS 加速开发,还是使用最流行的 PHP 框架 Laravel 构建强大的 Web 应用程序。我们不要忘记用于创建管理面板的 FilamentPHP。 这些项目不是鬼建的,而是由鬼魂建造的。它们是由人…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信