首页 >后端开发 >php教程 >适用于 5 人的 Laravel 最佳实践、提示和技巧

适用于 5 人的 Laravel 最佳实践、提示和技巧

Linda Hamilton
Linda Hamilton原创
2024-10-30 00:17:29717浏览

Laravel Best Practices, Tips, and Tricks for 5

随着 2025 年的临近,Laravel 仍然是 Web 开发的首选,为开发人员提供创建强大而高效的应用程序的工具。本文概述了关键的最佳实践、提示和技巧,无论您使用的是 Laravel 9、10 还是 11,它们都可以提高代码质量并简化工作流程。这些见解将帮助您充分利用 Laravel 并提高您的开发技能,无论您是初学者还是经验丰富的开发人员。

保持 Laravel 和软件包更新

保持 Laravel 更新有几个主要好处:

  • 提高安全性:定期发布包括保护您的应用程序的重要安全修复。
  • 更好的性能:更新通常会增强性能,从而加快加载时间并提高代码效率。
  • 新特性和功能:保持最新状态,利用新功能来增强开发体验。
  • 兼容性:确保与最新的官方和社区包更好的兼容性。

定期运行 Composer 更新对于保持包更新至关重要。这个简单的做法是确保您的软件包具有最新功能和安全补丁的最佳方法之一。

如果您对更新犹豫不决,可能表明您的代码没有经过充分的测试。通过采用测试实践,您可以确保主要更新不会破坏您的代码,从而使您能够充分利用 Laravel 的改进。

如果您不想手动更新,可以考虑使用 ServBay,这是一个环境管理工具,它已经集成了 PHP 8.4 beta 版本,可以更轻松地保持 Laravel 和各种软件包的更新。

通过保持强有力的测试来防止严重错误

自动化测试是一个广泛但经常被低估的领域。然而,它是确保项目可靠性的最重要的最佳实践之一。

维护强大的测试套件的主要好处包括:

  • 更少的错误:定期测试有助于及早发现问题,从而形成更稳定的代码库。
  • 更满意的客户:可靠的软件会让用户满意,他们可以信任您的产品。
  • 满意的雇主:经过充分测试的项目体现了专业精神和对质量的承诺。
  • 自信的开发人员:通过全面的测试套件,您可以进行更改,而不必担心引入新的错误。休息后返回项目变得不再那么令人畏惧。

修改代码时,只需运行 php artisan test 即可识别任何损坏的功能,修复问题,然后重复该过程!

自动化测试可以显着增强项目稳定性,极大地提升您的职业生涯。

为了帮助您入门,Laracasts 提供免费测试课程。您可以了解 PHPUnit(行业标准)和 Pest(一种简化 PHP 测试的现代测试框架)。强烈推荐《Pest From Scratch》课程。

遵循默认目录组织

你有没有想过为什么要使用像 Laravel 这样的框架?

框架提供了结构化的开发方法,确保所有团队成员保持一致并朝着共同的目标努力。它们具有丰富、复杂、经过实战考验的功能,让您能够专注于项目的独特方面,而不会陷入细节的困境。

那么,遵循 Laravel 的默认项目结构是否被认为是最佳实践?绝对地!原因如下:

  • 方便:Laravel 的约定和结构都有详细记录。当您几周或几个月后返回项目时,您会欣赏默认设置的清晰度和熟悉度。
  • 团队协作:与团队成员合作时,每个人都了解 Laravel 的约定,使协作变得更加容易。利用这些共享知识可以推动项目向前发展,而不是每次都重新发明轮子。

使用自定义表单请求进行复杂验证

Laravel 中的自定义表单请求是处理验证的强大工具,提供了几个关键优势:

  • 重用验证逻辑:跨多个控制器轻松重用验证规则,保持代码干燥(不要重复)。
  • 减少控制器膨胀:将验证代码卸载到专用的表单请求类,保持控制器干净并专注于业务逻辑。

创建自定义表单请求

创建自定义表单请求很简单。只需运行以下 Artisan 命令:

php artisan make:request StorePostRequest

然后,在您的控制器中,您可以简单地键入提示请求:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}

增强自定义表单请求

自定义表单请求还可以包含验证之外的其他逻辑。例如,您可以通过重写prepareForValidation方法在输入数据到达控制器之前对其进行规范化:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}

在此示例中,该方法在验证过程发生之前自动从标题生成一个 slug。

授权管理

自定义表单请求还可以处理授权逻辑。如果您发现使用策略很麻烦,您可以直接在表单请求中包含简单的授权检查。

使用单一操作控制器简化您的代码库

即使遵循最佳实践,控制器也可能变得笨拙。一个很好的解决方案是在 Laravel 中使用单动作控制器。这些控制器旨在处理单个操作,而不是像标准资源控制器那样处理多个操作。

创建单个动作控制器

要创建单个动作控制器,请使用以下 Artisan 命令:

php artisan make:request StorePostRequest

此命令创建一个只有一个操作的控制器,名为 __invoke。有关 __invoke 魔术方法的更多信息,请参阅 Laravel 文档。

定义路线

使用单个操作控制器,您可以简化路由定义。以下是如何在您的路线中使用它:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}

主观最佳实践

使用单一动作控制器是一种主观的最佳实践。由您和您的团队决定此方法是否适合项目的结构和可读性偏好。

使用中间件避免代码重复

在 Laravel 中,中间件是一个强大的工具,允许您过滤或修改传入的请求。通过利用中间件,您可以避免代码重复并保持控制器干净且易于管理。以下是一些常见的中间件用例:

  • 检查所需权限:确保用户拥有访问某些路由所需的权限。
  • 设置用户区域设置:检查用户的首选语言并相应调整应用程序的区域设置。

Laravel 为常见任务提供了各种内置中间件,例如身份验证和速率限制。

创建自定义中间件

要创建自定义中间件,请使用以下 Artisan 命令:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}

在您的中间件中,您可以定义处理请求的逻辑。这是一个检查用户是否有足够令牌的中间件示例:

php artisan make:controller ShowPostController --invokable

将中间件附加到路由

定义中间件后,您可以将其附加到任意数量的路由。这种模块化方法有助于保持代码整洁并减少控制器中的重复。

use App\Http\Controllers\ShowPostController;

// Single action controller route
Route::get('/posts/{post}', ShowPostController::class);

使用策略进行授权

在 Laravel 中利用授权策略对于构建清晰且可维护的应用程序至关重要。使用策略的三个主要好处是:

  • 跨控制器共享授权逻辑:通过将授权规则合并到策略中,您可以提高一致性并消除应用程序中的重复代码。
  • 降低控制器复杂性:将授权逻辑移至策略使控制器能够专注于其主要任务,从而生成更清晰、更易于理解的代码。
  • 简化授权码访问:策略位于app/Policies目录下,方便开发者在需要时轻松查找和修改授权规则。

让我们看一下使用帖子更新策略的实际场景:

php artisan make:request StorePostRequest

确保迁移是最新的

迁移是一种使用纯 PHP 代码定义数据库架构的方法。您可以将它们视为 phpMyAdmin 的代码替代方案,提供一种编程方式来管理数据库结构。这种方法对团队特别有利,因为它允许每个人在本地计算机上复制相同的开发环境,并在 Git 中维护清晰的更改历史记录。

迁移还有助于将项目部署到新环境(例如暂存或生产),而无需从其他环境导出数据库。然而,一个常见的陷阱是一些开发人员直接对数据库进行更改,而不是创建新的迁移。这种做法可能会给其他团队成员带来不便,他们可能需要通过 Slack 请求数据库转储。为了提升项目并保持一致性,有效利用迁移非常重要。

使用匿名迁移来防止冲突(Laravel 8 及更高版本)

匿名迁移是避免类名冲突的有效解决方案。通过此功能,您可以创建多个名为“update_posts_table”的迁移而不会遇到错误,从而减少开发过程中的摩擦。

在 Laravel 9 及更高版本中,当您运行以下命令时,会自动生成匿名迁移:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}

这些迁移的结构如下所示:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}

有趣的是,您还可以在 Laravel 8 中实现匿名迁移。为此,只需将类名替换为 return new class 并确保在末尾包含分号即可。这样,即使在早期版本中,您也可以享受匿名迁移的好处。

正确实现 down() 方法进行回滚

php artisan migrate:rollback 命令使用 down() 方法来撤销对数据库所做的更改。当一些开发人员选择实现它而其他开发人员不这样做时,重要的是要确保在使用它时正确定义您的 down() 方法。

本质上,down() 方法应该反转 up() 方法中执行的操作。这是一个基本示例:

php artisan make:request StorePostRequest

如果您不想使用 down() 方法,只需删除它即可。

遵循 Eloquent 的数据库表命名约定

遵守 Laravel 的表命名约定是一种简单的最佳实践,可以使您的团队受益匪浅。当您使用 Artisan 命令时,框架会自动处理这些约定,例如 php artisan make:model Post --migration --factory。

如果由于某种原因,您无法使用这些命令,这里有一个快速指南:

  • 对于名为Post的模型,对应的表应命名为posts,使用复数形式。例如:

    • 评论模型→评论表
    • 回复模型→回复表
  • 对于连接帖子和评论的数据透视表(例如,comment_post):

    • 使用两个名字的单数形式。
    • 按字母顺序排列。

更多详情请参考官方文档。

使用预加载避免 N 1 问题

还有更多最佳实践需要介绍!你遇到过N 1 问题吗?预加载是防止它们的有效方法。

例如,如果您显示 30 个帖子及其作者的列表,由于延迟加载,Eloquent 将为这 30 个帖子执行一个查询,然后为每个作者执行额外的 30 个查询(这意味着每次您调用 $post ->代码中的用户,它检索用户关系)。

解决方案很简单:使用with()方法将查询次数从31个减少到2个。

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}

为了防止 N 1 问题,您可以将应用程序配置为在延迟加载关系时抛出异常。此限制仅应在本地环境中强制执行。

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}

使用 Eloquent 的严格模式避免性能问题和错误

Eloquent 的严格模式是一个很有价值的调试工具。它通过在各种场景下抛出异常来帮助开发人员识别开发过程中的潜在问题:

  • 延迟加载关系:延迟加载可能会导致性能问题,尤其是在处理大型数据集时。当相关模型仅在访问时才从数据库中获取时,就会出现这种情况。在严格模式下,如果关系是延迟加载的,则会抛出异常,鼓励使用急切加载。
  • 分配不可填充的属性:Eloquent 模型中的 $fillable 属性可以防止批量分配漏洞。如果您尝试分配不可填充的属性,则会触发异常,确保开发人员在处理批量分配时保持谨慎。
  • 访问不存在的属性:尝试访问不存在或尚未从数据库检索的属性可能会导致不可预测的行为或错误。严格模式会在这种情况下抛出异常,帮助开发者定位并解决这些问题。

要启用严格模式,请将以下代码添加到 AppServiceProvider.php 的 boot() 方法中:

php artisan make:request StorePostRequest

使用新方法定义访问器和修改器

Laravel 9 引入了一种声明访问器和修改器的新方法。现在介绍如何实施它们:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}

这种新语法允许您以更简洁的方式定义访问器和修改器。您还可以缓存计算成本较高的值:

public function prepareForValidation()
{
    $this->merge([
        'slug' => Str::slug($this->title),
    ]);
}

相比之下,之前的方法看起来像这样:

php artisan make:controller ShowPostController --invokable

切换到新语法简化了代码并增强了可读性。

使用dispatchAfterResponse()处理长时间运行的任务

在处理耗时的任务时(例如提交联系表单后发送电子邮件),您可以通过将任务延迟到服务器响应用户之后来改善用户体验。这就是dispatchAfterResponse()发挥作用的地方,它允许您推迟长时间运行的进程:

use App\Http\Controllers\ShowPostController;

// Single action controller route
Route::get('/posts/{post}', ShowPostController::class);

或者,如果您更喜欢使用匿名函数来安排任务,您可以这样做:

php artisan make:middleware CheckTokens

通过使用dispatchAfterResponse(),您可以确保用户从服务器收到更快的响应,同时后台任务不会影响用户体验。

使用队列处理长时间运行的任务

在处理计算密集型任务(例如处理用户上传的图像)时,立即执行这些操作可能会使服务器过载并导致糟糕的用户体验。解决方法如下:

  • 服务器压力:为每个用户提交实时处理任务可能会使服务器不堪重负。
  • 用户体验:用户被迫等待,盯着加载屏幕,导致沮丧。

Laravel 的队列系统允许您推迟这些长时间运行的任务以有序或受控的并行方式运行,确保服务器保持响应并且用户不必等待。

为了方便任务管理,请考虑使用 Laravel Horizo​​n,它提供了一个用于有效监视和控制队列任务的用户界面。这样,您可以在后台处理复杂的进程,同时保持流畅的性能。

每次测试之前延迟刷新数据库

在本地环境中进行测试时,最好每次运行测试时都使用新的数据库。 Laravel 提供了一种有效的方法来处理这个问题,即在每次测试之前延迟刷新数据库。这可以使用测试类中的 RefreshDatabase 特征来完成。这可以确保每次运行测试时数据库都处于干净状态,从而消除剩余数据引起的潜在问题。

使用刷新数据库

在测试类中使用 RefreshDatabase 特征:

php artisan make:request StorePostRequest

优点

  • 一致性:保证每次测试运行时数据库状态一致,避免因状态变化导致测试失败。
  • 隔离:每个测试独立运行,互不干扰,增强测试的可靠性。

安全管理敏感信息

管理敏感信息时,确保安全至关重要。以下是一些最佳实践:

使用环境变量

将敏感信息(例如 API 密钥和数据库凭据)存储在 .env 文件中,而不是代码库中。

使用 Laravel 的加密功能

对于需要加密的数据,请利用 Laravel 的加密功能:

use App\Http\Requests\StorePostRequest;

class PostController
{
    public function store(StorePostRequest $request)
    {
        $validated = $request->validated();
        Post::create($validated);
        // Other logic...
    }
}

定期更新密钥

确保定期更新应用密钥(APP_KEY)并在更新后重新加密数据。

结论

通过遵循这些最佳实践、提示和技巧,您可以显着提高 Laravel 应用程序的质量和安全性。这些方法不仅可以帮助您编写更高效的代码,还可以为您的用户提供更好的体验。继续学习和应用这些实践将帮助您在发展中取得更大的成功。

以上是适用于 5 人的 Laravel 最佳实践、提示和技巧的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn