干净可读的代码是将经验丰富的程序员与初学者区分开的重要方面。达到这一水平的代码质量需要经验和观察。尽管每个框架都有自己的一套规则,但我将专注于在本培训课程的Laravel框架的背景下分享一些有用的原则。
在上一篇文章中,我们讨论了及其模板的静止体系结构,从而增强了控制器内部的代码可读性。现在,让我们探索大规模分配的概念和称为请求的工具。
在开始之前,让我们花一点时间了解validate
函数的输出:
了解验证函数的一个重要方面是,它专门返回符合您指定规则的数据数组。换句话说,即使用户尝试将注入的字段发送到我们的服务器,validate函数也只会返回我们定义的信息!这有助于维护我们服务器端数据处理的完整性和安全性:
$data = request()->validate([
'title' => 'required|min:3|max:120|unique:tasks,title',
'description' => 'nullable|min:3|max:255',
'expired_at' => 'nullable|date|after:now'
]);
Task::create($data);
看吗?现在更可读了。让我们继续并要求查看结果:
您遇到的错误的原因是,Laravel中的模型默认情况下,防止质量分配以避免接受不正确的值。例如,如果您没有正确定义验证规则,则可能会错误地设置敏感用户信息(例如电子邮件或密码)。 Laravel希望确保您知道这个潜在的问题。幸运的是,我们有两种改变此默认行为的解决方案。
一种解决方案是使用fillable
属性,这是您要允许质量分配的一系列字段
protected $fillable = ['attribute'];
另外,您可以使用guarded
属性,该属性可以通过允许您指定不想质量分配的字段来使用相反的方式:
protected $guarded = ['attribute'];
在我们的示例中,我们需要在模型中包括其中一种:
我个人更喜欢使用一个空阵列guarded
现在,让我们探索Laravel中的另一个有用的工具,称为 formRequest ,它使我们能够将请求验证与控制器分开。这种分离增强了代码的清晰度和组织。
通过创建请求类,我们可以定义该请求的验证规则,使我们的控制器专注于处理业务逻辑。
要创建一个请求类,我们可以使用以下工匠命令:
php artisan make:request <request-name>
此外,Laravel使用make:model
Artisan Command时还提供了方便的选项。
例如,您可以包含为模型生成新控制器的-c
选项,-r
选项表明生成的控制器应为资源控制器,-m
选项,以创建模型的新迁移文件,以及-R
选项创建新表单请求类并在资源控制器中自动使用它们:
php artisan make:model <model-name> -c -r -m -R
好吧,让我们回到我们的项目添加了我们商店功能的请求:
php artisan make:request StoreTaskRequest
创建后,您可以在Directory app/Http/Requests
中打开StoreTaskRequest
文件,并在规则方法中定义验证规则:
(提示:我只是放弃唯一的标题规则,以使其更有意义!)
class StoreTaskRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'title' => 'required|min:3|max:120',
'description' => 'nullable|min:3|max:255',
'expired_at' => 'nullable|date|after:now'
];
}
}
默认情况下,还有一个authorize
功能,您可以决定是否授权用户提出此请求,对吗?现在只是设置其值true
,让任何人都有访问请求。
除了规则外,您还可以通过在FormRequest
文件中覆盖消息方法来自定义错误消息:
public function messages(): array
{
return [
'title.required' => 'Hey, don\'t forget to fill in your title!',
'title.min' => 'Oops! Your name should be at least three characters long.',
'description.min' => 'Hold up! The description too short!!!',
];
}
现在让我们使用它!
为了实现这一目标,我们可以将StoreTaskRequest
类注入控制器的store
方法。这允许Laravel自动处理验证过程。如果验证失败,则将用户以及错误消息将用户重定向到上一页。另一方面,如果验证成功通过,将执行控制器方法。
在上图中,要获取经过验证的数据,您可以使用validated
方法。如果未指定任何键作为验证函数的输入,它将返回规则数组中定义的所有键。另外,如果您只需要特定的键或所需的键,则可以将它们作为输入传递给该功能。这很简单,对吗?
现在让我们为我们的更新方法做同样的事情,然后将UpdateTaskRequest
用于更新功能:
php artisan make:request UpdateTaskRequest
和更新UpdateTaskRequest
如下:
class UpdateTaskRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'title' => 'required|min:3|max:120',
'description' => 'nullable|min:3|max:255',
'expired_at' => 'nullable|date|after:now'
];
}
}
再次使用我们只需要轻松地将UpdateTaskRequest类作为我们控制器更新方法中的参数,但是这次我们必须在绑定模型上应用更新方法,如下所示:
public function update(Task $task, UpdateTaskRequest $request)
{
$task->update($request->validated());
return redirect("/tasks");
}
这将我们带到了本文的结尾。我们介绍了如何重构代码并提高其清晰度。在下一篇文章中,我们将在Laravel内进行授权。希望您发现这篇文章愉快而有益。请继续关注更多!