每個(gè) web 開(kāi)發(fā)人員在寫(xiě)代碼時(shí)都有自己的風(fēng)格。與此同時(shí),如果我們使用 laravel 框架,一切都準(zhǔn)備就緒,但通常我們?cè)谶@里誤用了術(shù)語(yǔ)。 涉及不同的風(fēng)格問(wèn)題不大,但我們必須確保我們的代碼遵循良好的風(fēng)格。這意味著我們的代碼必須可擴(kuò)展,可維護(hù)和可測(cè)試。【相關(guān)推薦:laravel視頻教程】
是什么讓我們的代碼變得糟糕或者良好?因?yàn)?a href="http://m.babyishan.com/tag/php">php是一種面向對(duì)象的語(yǔ)言,我們應(yīng)該遵循面向?qū)ο?/b>的原則,如 SOLID 設(shè)計(jì)原則,并考慮使用面向?qū)ο髾C(jī)制,如繼承,抽象等。此外,Laravel有一個(gè)大社區(qū),有時(shí)會(huì)有一些社區(qū)創(chuàng)造的約定。因此,其他遵循這些約定的 laravel 開(kāi)發(fā)人員能夠更好地、更快地理解我們的代碼。在本文中,我將根據(jù)面向?qū)ο笤瓌t和一些 Laravel 社區(qū)約定,在 Laravel 上向你展示7個(gè)最佳實(shí)踐。
1.胖模型,瘦控制器
如果我們有一個(gè)非常復(fù)雜的查詢(xún)構(gòu)造器或原始 sql語(yǔ)句,我們應(yīng)該將此查詢(xún)移動(dòng)到模型或倉(cāng)庫(kù)中。
壞的:
<?php public function index() { $partners = Partner::where('email_verified_at', '!=', null) ->with(['products'?=>?function?($q)?{ ????????????$q->whereDate('created_at',?now()); ????????}]) ????????->get(); ????return?view('index',?['partners'?=>?$partners]); }
好的:
<?php public function index() { return view('index', ['partners' =>?$this->partner->newProducts()]); } class?Partner?extends?Model { ????public?function?newProducts() ????{ ????????return?$this->where('email_verified_at',?'!=',?null) ????????????->with(['products'?=>?function?($q)?{ ????????????????$q->whereDate('created_at',?now()); ????????????}]) ????????????->get(); ????} }
2.服務(wù)類(lèi)中的業(yè)務(wù)邏輯
與上述第一點(diǎn)相關(guān),我們應(yīng)該有一個(gè)瘦控制器,然后我們應(yīng)該將所有業(yè)務(wù)邏輯移動(dòng)到單獨(dú)的服務(wù)類(lèi)中。 所以控制器應(yīng)該只有一個(gè)職責(zé),希望我們可以在其他控制器中重用這個(gè)服務(wù)。
壞的:
<?php public function store(Request $request) { $user = User::create(); $user->update(['last_login'?=>?now()]); ????dispatch(new?UserCreated($user)); ????//?... }
好的:
<?php public function store(Request $request) { $this->userService->create($request); ????.... } class?UserService { ????public?function?create($request) ????{ ???????//?... ????} }
3.Eloquent 查詢(xún)優(yōu)于原生 SQL 語(yǔ)句。
使用 Eloquent 進(jìn)行查詢(xún)更具可讀性,避免 SQL 注入,并且易于維護(hù)。
壞的:
<?php SELECT * FROM `articles` WHERE EXISTS (SELECT * FROM `users` WHERE `articles`.`user_id` = `users`.`id` AND EXISTS (SELECT * FROM `profiles` WHERE `profiles`.`user_id` = `users`.`id`) AND `users`.`deleted_at` IS NULL) AND `verified` = '1' AND `active` = '1' ORDER BY `created_at` DESC
好的:
<?php Article::has('user.profile')->verified()->latest()->get();
4.DRY (Don’t Repeat Yourself)
我們應(yīng)該考慮將可重用的邏輯/組件部分移動(dòng)到單獨(dú)的地方。
在 blade 模板中,我們可以使用組件來(lái)重用前端部分。在服務(wù)器中,我們可以將邏輯移動(dòng)到一個(gè)單獨(dú)的服務(wù)類(lèi)、Eloquent scope作用域,甚至可以創(chuàng)建我們自己的包。
nbsp;html> <title>DRY</title><h1>Custom?Calendar</h1> <x-custom-calendar></x-custom-calendar>
5.不要在 Blade 模板中執(zhí)行查詢(xún)
盡管在 blade 模板中執(zhí)行查詢(xún)是可行的, 但最好不要這么做。
壞的。 將會(huì)造成 N+1 問(wèn)題。
@foreach?(User::all()?as?$user) ????{{?$user->email?}} @endforeach
好的:
$users?=?User::all();?//?Server?Query @foreach?($users?as?$user) ????{{?$user->email?}} @endforeach
6.使用數(shù)據(jù)庫(kù)事務(wù)
如果我們有一些復(fù)雜而冗長(zhǎng)的邏輯/查詢(xún),那么我們應(yīng)該考慮使用數(shù)據(jù)庫(kù)事務(wù)。通過(guò)使用此功能,我們可以在需要時(shí)輕松回滾數(shù)據(jù)庫(kù),以確保我們的數(shù)據(jù)不會(huì)保存到數(shù)據(jù)庫(kù)中,因此我們確信我們的數(shù)據(jù)是可靠的。
<?php public function store(Request $request) { DB::beginTransaction(); $user = User::create(); $response = app('service')->create($user); ????if?(!$response)?{ ??????DB::rollback(); ??????return; ????} ????//?... ????DB::commit(); ?}
7.不要硬編碼文本
我們不應(yīng)該在代碼/控制器中硬編碼任何文本。這樣以后很容易維護(hù)和擴(kuò)展。如果我們想向用戶(hù)顯示消息,我們可以使用翻譯,模型/類(lèi)中的常量來(lái)設(shè)置任何值或配置文件來(lái)保存我們的配置。
trans('user.created');?//?'User?Successfully?Created' $types?=?Product::TYPES;?//?Const?in?a?Class/Model
原文地址:https://cerwyn.medium.com/7-best-practices-in-laravel-you-should-know-2ed9878293de譯文地址:https://learnku.com/laravel/t/67021
更多編程相關(guān)知識(shí),請(qǐng)?jiān)L問(wèn):laravel視頻教程!!