发布于 2026-01-06 3 阅读
0

Laravel 最佳实践【编码规范 第二部分】🧑‍🦰👩‍🦰 文章 02:原则应遵循。✊ 其他文章 👈👈👈 由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

Laravel 最佳实践【编码规范第二部分】🧑‍🦰👩‍🦰

第二条:原则应当坚持。✊

其他文章👈👈👈

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

各位朋友大家好,这是Laravel 编码规范系列文章第二篇。

如果你还没看过第一篇文章,我建议你先阅读一下,以便更好地理解和实践。

Laravel 最佳实践文章 01 =>点击此处打开文章

arraow

第二条:原则应当坚持。✊

在这里我将谈谈开发人员应该遵循的一些原则

pK-gMzy3meGp1rdP21xe1TUB9Dde408OFq4S

01 不要在控制器内部使用验证 👈

当我审查初级开发人员的代码时,我发现控制器里有很多验证器。有时候他们只是在网上搜索问题,然后从 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());
    }
Enter fullscreen mode Exit fullscreen mode

所以这种放置验证器的方式是不正确的。
我们应该使用客户请求来处理验证器。

01 创建自定义请求。👈
php artisan make:request UserCreateRequest
Enter fullscreen mode Exit fullscreen mode

以上内容可作为请求名称。您也可以使用实际场景。例如:如果您想处理用户更新表单请求,则可以创建名为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 [
            //
        ];
    }
}

Enter fullscreen mode Exit fullscreen mode

在类中,您可能会看到两个预构建函数,分别名为
authorize()rules()

02 允许 CSRF 👈

authorize()函数中,你需要将返回值改为true

否则您的请求将无法成功。

03 添加验证规则。👈

您可以在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']
        ];
    }

Enter fullscreen mode Exit fullscreen mode
04 添加自定义验证消息。👈

然后,您可以为每个输入框和每种验证方法添加自定义验证消息。这里您需要重写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.",
        ];
    }
Enter fullscreen mode Exit fullscreen mode

最后,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.",
        ];
    }
}

Enter fullscreen mode Exit fullscreen mode

现在你可以在控制器函数中使用UserCreateRequest

了 。

   /**
     * Store Customer
     *
     * @param  UserCreateRequest $request
     * @return User
     */
    public function store(UserCreateRequest $request){
        return User::store($request->all());
    }

Enter fullscreen mode Exit fullscreen mode

通过这种自定义请求,您可以在其中添加许多复杂的逻辑和规则。

图片

02 使用配置文件、常量和语言文件,无需编写复杂的代码。👈

假设你要向数据库中添加用户,并给用户添加多个状态。

例如:待审批已批准、已拒绝已重新提交

这是很多低年级学生都在做的坏事。


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;

}

Enter fullscreen mode Exit fullscreen mode

如上所示,如果我们更改了相关状态的整数,我们也必须更改开关函数以纠正状态,而且如果注释被以某种方式删除,您就不知道在情况 1 中发生了什么,在情况 2 中发生了什么,等等。

为了避免这种情况,我们可以使用在相关模型中定义的常量变量。


 CONST STATUS =[
        "ApprovalPending"=>1,
        "Approved"=>2,
        "Declined"=>3,
        "ReSubmitted"=>4,
    ];


Enter fullscreen mode Exit fullscreen mode

然后你就可以在 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;
}

Enter fullscreen mode Exit fullscreen mode

识别 SQLite 浏览器

03 不要在 Blade 模板文件中执行查询。👈

很多初级开发人员都在不加注意地做这件事。


@foreach (Customer::all() as $customer)
    {{ $customer->address->street_address }}
@endforeach

Enter fullscreen mode Exit fullscreen mode

这段代码本身没有问题,但让我们深入分析一下。它会对1000 个客户执行1001 次查询


$customers = Customer::with('address')->get();

@foreach ($customers as $customer)
    {{ $customer->address->street_address }}
@endforeach

Enter fullscreen mode Exit fullscreen mode

完美!这样只需1000 个客户执行2 次查询即可。

上面我谈到了初级开发人员最常遇到的 3 个主要问题。

希望我的帖子对您​​有所帮助!欢迎提出任何意见和建议!

您可以在这里找到我的Upwork个人资料。

https://www.upwork.com/freelancers/lathindu

下面我列出了我的其他文章,您也可以阅读一下。

其他文章👈👈👈

这里我添加了一个公开的GitHub仓库,里面会存放我所有的教程。你可以克隆它,查看我发布的所有教程🤗。

GitHub 仓库






非常感谢
--拉廷杜·普拉穆迪萨--

GitHub个人资料

GitHub 标志 lathindu1 / lathindu1

这是关于 Lathindu Pramuditha 的账户

ආයුබෝවන්(欢迎)🙏🏻,我是Lathindu Pramuditha Amarasekara!

Axcertro创始人兼首席执行官

领英:lathindu-pramuditha GitHub 关注者 Waka Readme

关于我,再补充一点……

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,
        '
Enter fullscreen mode Exit fullscreen mode

屏幕截图 2021-04-19 23.08.02

文章来源:https://dev.to/lathindu1/laravel-best-practice-coding-standards-part-02-a40