教程
这里我会展示我教程中的所有代码块。你可以复制任何内容,也可以学习任何内容。
各位朋友大家好,这是Laravel 编码规范系列文章的第二篇。
如果你还没看过第一篇文章,我建议你先阅读一下,以便更好地理解和实践。
在这里我将谈谈开发人员应该遵循的一些原则。
当我审查初级开发人员的代码时,我发现控制器里有很多验证器。有时候他们只是在网上搜索问题,然后从 Stack Overflow 或其他地方复制粘贴一些代码,根本不做任何研究就直接放进代码里。这就是我发现他们存在的主要问题。
这里您可能会看到一些控制器中使用验证器的错误代码。
public function store(Request $request){
Validator::make($request, [
'first_name' => ['required', 'string', 'max:255'],
'last_name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' =>['required', 'string', new Password, 'confirmed']
])->validate();
return User::store($request->all());
}
所以这种放置验证器的方式是不正确的。
我们应该使用客户请求来处理验证器。
php artisan make:request UserCreateRequest
以上内容可作为请求名称。您也可以使用实际场景。例如:如果您想处理用户更新表单请求,则可以创建名为UserUpdateRequest 的请求。
通过命令创建请求后,您可以在项目根目录 -> app -> Http -> Requests中看到UserCreateRequest。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserCreateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
在类中,您可能会看到两个预构建函数,分别名为
authorize()和rules()。
在authorize()函数中,你需要将返回值改为true。
否则您的请求将无法成功。
您可以在rules()函数内部添加验证方法。
public function rules()
{
return [
'first_name' => ['required', 'string', 'max:255'],
'last_name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' =>['required', 'string', new Password, 'confirmed']
];
}
然后,您可以为每个输入框和每种验证方法添加自定义验证消息。这里您需要重写formRequest Trait 中的message()函数。
添加消息时,请提及输入和规则,并用点号分隔。
public function messages()
{
return [
"first_name.required" => "User first name is required",
"first_name.string" => "User first name type must be a string",
"email.unique" => "This email is already used.",
];
}
最后,UserCreateRequest可能如下所示。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserCreateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'first_name' => ['required', 'string', 'max:255'],
'last_name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' =>['required', 'string', new Password, 'confirmed']
];
}
/**
* Get custom messages for validator errors.
*
* @return array
*/
public function messages()
{
return [
"first_name.required" => "User first name is required",
"first_name.string" => "User first name type must be a string",
"email.unique" => "This email is already used.",
];
}
}
现在你可以在控制器函数中使用UserCreateRequest
了 。
/**
* Store Customer
*
* @param UserCreateRequest $request
* @return User
*/
public function store(UserCreateRequest $request){
return User::store($request->all());
}
通过这种自定义请求,您可以在其中添加许多复杂的逻辑和规则。
假设你要向数据库中添加用户,并给用户添加多个状态。
例如:待审批、已批准、已拒绝、已重新提交
这是很多低年级学生都在做的坏事。
switch ($user->status) {
case 1:
// do the things for Pending status
break;
case 2:
// do the things for Approved status
break;
case 3:
// do the things for Declined status
break;
case 4:
// do the things for Resubmitted status
break;
}
如上所示,如果我们更改了相关状态的整数,我们也必须更改开关函数以纠正状态,而且如果注释被以某种方式删除,您就不知道在情况 1 中发生了什么,在情况 2 中发生了什么,等等。
为了避免这种情况,我们可以使用在相关模型中定义的常量变量。
CONST STATUS =[
"ApprovalPending"=>1,
"Approved"=>2,
"Declined"=>3,
"ReSubmitted"=>4,
];
然后你就可以在 switch 语句的任何位置使用 STATUS 变量了。
switch ($user->status) {
case User::STATUS['ApprovalPending']:
// do the things for Pending status
break;
case User::STATUS['Approved']:
// do the things for Approved status
break;
case User::STATUS['Declined']:
// do the things for Declined status
break;
case User::STATUS['ReSubmitted']:
// do the things for Resubmitted status
break;
}
很多初级开发人员都在不加注意地做这件事。
@foreach (Customer::all() as $customer)
{{ $customer->address->street_address }}
@endforeach
这段代码本身没有问题,但让我们深入分析一下。它会对1000 个客户执行1001 次查询。
$customers = Customer::with('address')->get();
@foreach ($customers as $customer)
{{ $customer->address->street_address }}
@endforeach
完美!这样只需对1000 个客户执行2 次查询即可。
上面我谈到了初级开发人员最常遇到的 3 个主要问题。
希望我的帖子对您有所帮助!欢迎提出任何意见和建议!
https://www.upwork.com/freelancers/lathindu
下面我列出了我的其他文章,您也可以阅读一下。
Laravel 最佳实践编码规范(第一部分)
MetaMask 与 Laravel 集成(第二部分)点击此处
MetaMask 与 Laravel 集成(第一部分)点击此处
这里我添加了一个公开的GitHub仓库,里面会存放我所有的教程。你可以克隆它,查看我发布的所有教程🤗。
GitHub 仓库
这里我会展示我教程中的所有代码块。你可以复制任何内容,也可以学习任何内容。
非常感谢。
--拉廷杜·普拉穆迪萨--
GitHub个人资料
Axcertro创始人兼首席执行官
namespace App\Models
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Life;
class ProfileOfLathindu extends Life
{
use HasFactory;
const LANGUAGES = [
'JAVASCRIPT' => 1,
'PHP' => 2,
'PYTHON' => 3,
'SOLIDITY' => 4,
'DART' => 5
];
const FRAMEWORKS = [
'NextJs' => 1,
'LARAVEL' => 2,
'FLUTTER' => 3,
'DJANGO' => 4,
'ANGULAR' => 5,
'IONIC' => 6
];
const EXPERIENCE = 'xxxxxxxxxx of hours from 2017';
const MORE_EXPERIENCE = [
'PAYPAL_API' => 1,
'STRIPE_API' => 2,
'…