随着 2025 年的临近,Laravel 仍然是 Web 开发的首选,为开发人员提供创建强大而高效的应用程序的工具。本文概述了关键的最佳实践、提示和技巧,无论您使用的是 Laravel 9、10 还是 11,它们都可以提高代码质量并简化工作流程。这些见解将帮助您充分利用 Laravel 并提高您的开发技能,无论您是初学者还是经验丰富的开发人员。
保持 Laravel 更新有几个主要好处:
定期运行 Composer 更新对于保持包更新至关重要。这个简单的做法是确保您的软件包具有最新功能和安全补丁的最佳方法之一。
如果您对更新犹豫不决,可能表明您的代码没有经过充分的测试。通过采用测试实践,您可以确保主要更新不会破坏您的代码,从而使您能够充分利用 Laravel 的改进。
如果您不想手动更新,可以考虑使用 ServBay,这是一个环境管理工具,它已经集成了 PHP 8.4 beta 版本,可以更轻松地保持 Laravel 和各种软件包的更新。
自动化测试是一个广泛但经常被低估的领域。然而,它是确保项目可靠性的最重要的最佳实践之一。
维护强大的测试套件的主要好处包括:
修改代码时,只需运行 php artisan test 即可识别任何损坏的功能,修复问题,然后重复该过程!
自动化测试可以显着增强项目稳定性,极大地提升您的职业生涯。
为了帮助您入门,Laracasts 提供免费测试课程。您可以了解 PHPUnit(行业标准)和 Pest(一种简化 PHP 测试的现代测试框架)。强烈推荐《Pest From Scratch》课程。
你有没有想过为什么要使用像 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 中利用授权策略对于构建清晰且可维护的应用程序至关重要。使用策略的三个主要好处是:
让我们看一下使用帖子更新策略的实际场景:
php artisan make:request StorePostRequest
迁移是一种使用纯 PHP 代码定义数据库架构的方法。您可以将它们视为 phpMyAdmin 的代码替代方案,提供一种编程方式来管理数据库结构。这种方法对团队特别有利,因为它允许每个人在本地计算机上复制相同的开发环境,并在 Git 中维护清晰的更改历史记录。
迁移还有助于将项目部署到新环境(例如暂存或生产),而无需从其他环境导出数据库。然而,一个常见的陷阱是一些开发人员直接对数据库进行更改,而不是创建新的迁移。这种做法可能会给其他团队成员带来不便,他们可能需要通过 Slack 请求数据库转储。为了提升项目并保持一致性,有效利用迁移非常重要。
匿名迁移是避免类名冲突的有效解决方案。通过此功能,您可以创建多个名为“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 并确保在末尾包含分号即可。这样,即使在早期版本中,您也可以享受匿名迁移的好处。
php artisan migrate:rollback 命令使用 down() 方法来撤销对数据库所做的更改。当一些开发人员选择实现它而其他开发人员不这样做时,重要的是要确保在使用它时正确定义您的 down() 方法。
本质上,down() 方法应该反转 up() 方法中执行的操作。这是一个基本示例:
php artisan make:request StorePostRequest
如果您不想使用 down() 方法,只需删除它即可。
遵守 Laravel 的表命名约定是一种简单的最佳实践,可以使您的团队受益匪浅。当您使用 Artisan 命令时,框架会自动处理这些约定,例如 php artisan make:model Post --migration --factory。
如果由于某种原因,您无法使用这些命令,这里有一个快速指南:
对于名为Post的模型,对应的表应命名为posts,使用复数形式。例如:
对于连接帖子和评论的数据透视表(例如,comment_post):
更多详情请参考官方文档。
还有更多最佳实践需要介绍!你遇到过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 的严格模式是一个很有价值的调试工具。它通过在各种场景下抛出异常来帮助开发人员识别开发过程中的潜在问题:
要启用严格模式,请将以下代码添加到 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()发挥作用的地方,它允许您推迟长时间运行的进程:
use App\Http\Controllers\ShowPostController; // Single action controller route Route::get('/posts/{post}', ShowPostController::class);
或者,如果您更喜欢使用匿名函数来安排任务,您可以这样做:
php artisan make:middleware CheckTokens
通过使用dispatchAfterResponse(),您可以确保用户从服务器收到更快的响应,同时后台任务不会影响用户体验。
在处理计算密集型任务(例如处理用户上传的图像)时,立即执行这些操作可能会使服务器过载并导致糟糕的用户体验。解决方法如下:
Laravel 的队列系统允许您推迟这些长时间运行的任务以有序或受控的并行方式运行,确保服务器保持响应并且用户不必等待。
为了方便任务管理,请考虑使用 Laravel Horizon,它提供了一个用于有效监视和控制队列任务的用户界面。这样,您可以在后台处理复杂的进程,同时保持流畅的性能。
在本地环境中进行测试时,最好每次运行测试时都使用新的数据库。 Laravel 提供了一种有效的方法来处理这个问题,即在每次测试之前延迟刷新数据库。这可以使用测试类中的 RefreshDatabase 特征来完成。这可以确保每次运行测试时数据库都处于干净状态,从而消除剩余数据引起的潜在问题。
在测试类中使用 RefreshDatabase 特征:
php artisan make:request StorePostRequest
管理敏感信息时,确保安全至关重要。以下是一些最佳实践:
将敏感信息(例如 API 密钥和数据库凭据)存储在 .env 文件中,而不是代码库中。
对于需要加密的数据,请利用 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中文网其他相关文章!