You might also want to check out the real-world Laravel example application and Eloquent SQL reference
ژباړې:
Nederlands (by Protoqol)
Indonesia (by P0rguy, Doni Ahmad)
한국어 (by cherrypick)
ภาษาไทย (by kongvut sangkla)
বাংলা (by Anowar Hossain)
فارسی (by amirhossein baghaie)
Українська (by Tenevyk)
Tiếng Việt (by Chung Nguyễn)
Español (by César Escudero)
Français (by Mikayil S.)
Polski (by Karol Pietruszka)
Deutsch (by Sujal Patel)
Italiana (by Sujal Patel)
Azərbaycanca (by Maharramoff)
العربية (by ahmedsaoud31)
اردو (by RizwanAshraf1)
میتودونه باید یوازې یو کار ترسره کړي
لوی ماډلونه، کوچني کنټرولرونه!
د پروګرام منطق باید په service class کې وي.
د DRY اصل یا خپل ځان مه تکراروه!
(Mass assignment) ډله ایزه دنده
د دې پر ځای چې query په blade کې ولیکئ د eager loading څخه کار واخلئ. (N+1 مسئله)
د ډېرې ډېټا لپاره د ډېټا چنک (data chunk) نه استفاده وکړئ
تبصرې وکړئ (Comments)، مګر د متودونو یا متغیرونو نومونه توضیحي او معنی لرونکي په پام کې ونیسئ.
په Blade ټیمپلیټونو کې له js او css څخه کار مه اخلئ او هېڅ HTML کوډ په PHP class کې مه کاروئ.
پر ځای د مستقیم متنونو څخه په کوډ کې، د config او languages فایلونو څخه کار واخلئ!
د لاراول د معیاري وسایلو څخه چې د لاراول ټولنې یا کمیونیټي لخوا تایید شوي دي کار واخلئ
د لاراول د نومونو له اصولو څخه کار واخلئ.
کنوانسیون د تنظیماتو په پرتله غوره دی
تر حده پورې په خپل کوډ کې، د معنی لرونکي او لنډ Syntax څخه کار واخلئ.
د object د جوړولو په وخت کې د new کیورد پر ځای IoC container او facades څخه کار واخلئ
له .env فایل څخه هېڅ وخت مستقیم ډېټا مه ترلاسه کوئ.
یو کلس باید یوه وظیفه ولري.
بد کوډ:
public function update(Request $request): string
{
$validated = $request->validate([
'title' => 'required|max:255',
'events' => 'required|array:date,type'
]);
foreach ($request->events as $event) {
$date = $this->carbon->parse($event['date'])->toString();
$this->logger->log('Update event ' . $date . ' :: ' . $);
}
$this->event->updateGeneralEvent($request->validated());
return back();
}
ښه کوډ:
public function update(UpdateRequest $request): string
{
$this->logService->logEvents($request->events);
$this->event->updateGeneralEvent($request->validated());
return back();
}
یو فنکشن باید یوازې یو کار ترسره کړي او باید په ښه شکل یې ترسره کړي.
بد کوډ:
public function getFullNameAttribute(): string
{
if (auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified()) {
return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
} else {
return $this->first_name[0] . '. ' . $this->last_name;
}
}
ښه کوډ:
public function getFullNameAttribute(): string
{
return $this->isVerifiedClient() ? $this->getFullNameLong() : $this->getFullNameShort();
}
public function isVerifiedClient(): bool
{
return auth()->user() && auth()->user()->hasRole('client') && auth()->user()->isVerified();
}
public function getFullNameLong(): string
{
return 'Mr. ' . $this->first_name . ' ' . $this->middle_name . ' ' . $this->last_name;
}
public function getFullNameShort(): string
{
return $this->first_name[0] . '. ' . $this->last_name;
}
د ډېټابیس مربوط شیان په Eloquent models کې ولیکئ.
بد کوډ:
public function index()
{
$clients = Client::verified()
->with(['orders' => function ($q) {
$q->where('created_at', '>', Carbon::today()->subWeek());
}])
->get();
return view('index', ['clients' => $clients]);
}
ښه کوډ:
public function index()
{
return view('index', ['clients' => $this->client->getWithNewOrders()]);
}
class Client extends Model
{
public function getWithNewOrders(): Collection
{
return $this->verified()
->with(['orders' => function ($q) {
$q->where('created_at', '>', Carbon::today()->subWeek());
}])
->get();
}
}
د ډېټا تصدیق یا ولیدیشن د کنټرولرونو پر ځای په Request classess کې ولیکئ.
بد کوډ:
public function store(Request $request)
{
$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
...
}
ښه کوډ:
public function store(PostRequest $request)
{
...
}
class PostRequest extends Request
{
public function rules(): array
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
];
}
}
یو کنټرولر باید یوازې یو مسؤلیت ولري، نو د کوډ منطق په د کنټرولرونو پر ځای باید په service classes کې ولیکئ.
بد کوډ:
public function store(Request $request)
{
if ($request->hasFile('image')) {
$request->file('image')->move(public_path('images') . 'temp');
}
...
}
ښه کوډ:
public function store(Request $request)
{
$this->articleService->handleUploadedImage($request->file('image'));
...
}
class ArticleService
{
public function handleUploadedImage($image): void
{
if (!is_null($image)) {
$image->move(public_path('images') . 'temp');
}
}
}
کوډ یو وار ولیکئ او ډېر ځایه یې استعمال کړی د کوډ د تکرار څخه ډډه وکړئ. همچنان Blade templates کوډ هم مه تکراروئ، د Eloquent scope څخه استفاده وکړئ.
بد کوډ:
public function getActive()
{
return $this->where('verified', 1)->whereNotNull('deleted_at')->get();
}
public function getArticles()
{
return $this->whereHas('user', function ($q) {
$q->where('verified', 1)->whereNotNull('deleted_at');
})->get();
}
ښه کوډ:
public function scopeActive($q)
{
return $q->where('verified', true)->whereNotNull('deleted_at');
}
public function getActive(): Collection
{
return $this->active()->get();
}
public function getArticles(): Collection
{
return $this->whereHas('user', function ($q) {
$q->active();
})->get();
}
د Query Builder او raw SQL queries پر ځای باید د Eloquent ORM څخه کار واخیستل شي. او همچنان د Arrays پر ځای د Collections څخه کار واخیستل شي
د Eloquent په واسېه تاسې کولی شئ چې کوډ ویونکي او -هغه چا ته چې وروسته په کوډ کې تغییرات راولی- ته آسانه کوډ ولیکئ. همچنان Eloquent مخکې جوړ شوي شیان لري لکه soft deletes, events, scopes وغیره Eloquent SQL ته مرجع.
بد کوډ:
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
ښه کوډ:
Article::has('user.profile')->verified()->latest()->get();
بد کوډ:
$article = new Article;
$article->title = $request->title;
$article->content = $request->content;
$article->verified = $request->verified;
// Add category to article
$article->category_id = $category->id;
$article->save();
ښه کوډ:
$category->article()->create($request->validated());
بد کوډ (د ۱۰۰ کارنو لپاره ۱۰۱ کیوریانې رن کوي):
@foreach (User::all() as $user)
{{ $user->profile->name }}
@endforeach
ښه کوډ (for 100 users, 2 DB queries will be executed): ښه کوډ (د ۱۰۰ کارنو لپاره ۲ کیوریانې رن کوي):
$users = User::with('profile')->get();
@foreach ($users as $user)
{{ $user->profile->name }}
@endforeach
بد کوډ:
$users = $this->get();
foreach ($users as $user) {
...
}
ښه کوډ:
$this->chunk(500, function ($users) {
foreach ($users as $user) {
...
}
});
بد کوډ:
// Determine if there are any joins
if (count((array) $builder->getQuery()->joins) > 0)
ښه کوډ:
if ($this->hasJoins())
بد کوډ:
let article = `{{ json_encode($article) }}`;
بهتر کوډ:
<input id="article" type="hidden" value='@json($article)'>
یا
<button class="js-fav-article" data-article='@json($article)'>{{ $article->name }}<button>
په یو جاواسکریپت فایل کې
let article = $('#article').val();
بهتره داده چې د PHP to JS .پکیج څخه د ډیټا د لېږلو په خاطر استفاده وشي
بد کوډ:
public function isNormal(): bool
{
return $article->type === 'normal';
}
return back()->with('message', 'Your article has been added!');
ښه کوډ:
public function isNormal()
{
return $article->type === Article::TYPE_NORMAL;
}
return back()->with('message', __('app.article_added'));
د دې پر ځای چې دریمګړي پکیجونو او ټولس نه استفاده وکړئ دا به ښه وي چې د لاراول او د لاراول ټولنې له خوا چې کوم پکیجونه او ټولس جوړ شوي، نه استفاده وشي. هر هغه ډېوېلوپر چې په راتلونکي کې ستاسو له اپلکیشن څخه استفاده کوی، باید نوي ټولس زده کړي. او که چېرې تاسې دا پکیجونه او ټولس چې رسمي د لاراول ټولنې څخه نه وي، استفاده کوئ. که چېرې کومې ستونزې سره مخامخ کېږئ نه حلول به یې ګران کار وي.
وظیفه | معیاري وسایل | (غیر معیاری) 3 ګړي وسایل |
---|---|---|
Authorization | Policies | Entrust, Sentinel and other packages |
Compiling assets | Laravel Mix, Vite | Grunt, Gulp, 3rd party packages |
Development Environment | Laravel Sail, Homestead | Docker |
Deployment | Laravel Forge | Deployer and other solutions |
Unit testing | PHPUnit, Mockery | Phpspec, Pest |
Browser testing | Laravel Dusk | Codeception |
DB | Eloquent | SQL, Doctrine |
Templates | Blade | Twig |
Working with data | Laravel collections | Arrays |
Form validation | Request classes | 3rd party packages, validation in controller |
Authentication | Built-in | 3rd party packages, your own solution |
API authentication | Laravel Passport, Laravel Sanctum | 3rd party JWT and OAuth packages |
Creating API | Built-in | Dingo API and similar packages |
Working with DB structure | Migrations | Working with DB structure directly |
Localization | Built-in | 3rd party packages |
Realtime user interfaces | Laravel Echo, Pusher | 3rd party packages and working with WebSockets directly |
Generating testing data | Seeder classes, Model Factories, Faker | Creating testing data manually |
Task scheduling | Laravel Task Scheduler | Scripts and 3rd party packages |
DB | MySQL, PostgreSQL, SQLite, SQL Server | MongoDB |
دا تعقیب کړئ PSR standards.
همچنان هغه اصول چې د لاراول د ټولنې لخوا منل شوي دي، تعقیب کړئ
څه | څنګه | ښه کوډ | بد کوډ |
---|---|---|---|
Controller | singular | ArticleController | |
Route | plural | articles/1 | |
Route name | snake_case with dot notation | users.show_active | |
Model | singular | User | |
hasOne or belongsTo relationship | singular | articleComment | |
All other relationships | plural | articleComments | |
Table | plural | article_comments | |
Pivot table | singular model names in alphabetical order | article_user | |
Table column | snake_case without model name | meta_title | |
Model property | snake_case | $model->created_at | |
Foreign key | singular model name with _id suffix | article_id | |
Primary key | - | id | |
Migration | - | 2017_01_01_000000_create_articles_table | |
Method | camelCase | getAll | |
Method in resource controller | table | store | |
Method in test class | camelCase | testGuestCannotSeeArticle | |
Variable | camelCase | $articlesWithAuthor | |
Collection | descriptive, plural | $activeUsers = User::active()->get() | |
Object | descriptive, singular | $activeUser = User::active()->first() | |
Config and language files index | snake_case | articles_enabled | |
View | kebab-case | show-filtered.blade.php | |
Config | snake_case | google_calendar.php | |
Contract (interface) | adjective or noun | AuthenticationInterface | |
Trait | adjective | Notifiable | |
Trait (PSR) | adjective | NotifiableTrait | |
Enum | singular | UserType | |
FormRequest | singular | UpdateUserRequest | |
Seeder | singular | UserSeeder |
که تاسو دې اصولو ته پاملرنه وکړئ نو اضافي کانفیګ او کوډونو ته به اړتیا و نه لرئ
بد کوډ:
// Table name 'Customer'
// Primary key 'customer_id'
class Customer extends Model
{
const CREATED_AT = 'created_at';
const UPDATED_AT = 'updated_at';
protected $table = 'Customer';
protected $primaryKey = 'customer_id';
public function roles(): BelongsToMany
{
return $this->belongsToMany(Role::class, 'role_customer', 'customer_id', 'role_id');
}
}
ښه کوډ:
// Table name 'customers'
// Primary key 'id'
class Customer extends Model
{
public function roles(): BelongsToMany
{
return $this->belongsToMany(Role::class);
}
}
بد کوډ:
$request->session()->get('cart');
$request->input('name');
ښه کوډ:
session('cart');
$request->name;
نور مثالونه:
عام Syntax | لنډ او کوډ لوستونکي ته آسانه کوډ |
---|---|
Session::get('cart') |
session('cart') |
$request->session()->get('cart') |
session('cart') |
Session::put('cart', $data) |
session(['cart' => $data]) |
$request->input('name'), Request::get('name') |
$request->name, request('name') |
return Redirect::back() |
return back() |
is_null($object->relation) ? null : $object->relation->id |
optional($object->relation)->id (in PHP 8: $object->relation?->id ) |
return view('index')->with('title', $title)->with('client', $client) |
return view('index', compact('title', 'client')) |
$request->has('value') ? $request->value : 'default'; |
$request->get('value', 'default') |
Carbon::now(), Carbon::today() |
now(), today() |
App::make('Class') |
app('Class') |
->where('column', '=', 1) |
->where('column', 1) |
->orderBy('created_at', 'desc') |
->latest() |
->orderBy('age', 'desc') |
->latest('age') |
->orderBy('created_at', 'asc') |
->oldest() |
->select('id', 'name')->get() |
->get(['id', 'name']) |
->first()->name |
->value('name') |
د کلسونو نوی syntax کوډ پېچلی کوي د هغه پر ځای د IoC container او Facades نه استفاده وکړئ.
بد کوډ:
$user = new User;
$user->create($request->validated());
ښه کوډ:
public function __construct(User $user)
{
$this->user = $user;
}
...
$this->user->create($request->validated());
د .env فایل څخه مستقیما ډېټا مه را اخلئ دهغه پر ځای د config() helper function نه استفاده وکړئ.
بد کوډ:
$apiKey = env('API_KEY');
ښه کوډ:
// config/api.php
'key' => env('API_KEY'),
// Use the data
$apiKey = config('api.key');
تاریخ او وخت په معیاري بڼه کې ذخیره کړئ. د تاریخ او وخت د ښودلو لپاره له Accessors & Mutators څخه کار واخلئ
یو نېټه د string په بڼه د یو object لږ باوري ده، لکه د کاربون (Carbon) بیلګه. سپارښتنه کیږي چې د نیټې د strings پر ځای د کاربون بیلګې د ټولګیو ترمنځ ولېږدوئ. ښودنه باید په view برخه د اپلکېشن (templates) کې وشي.
بد کوډ:
{{ Carbon::createFromFormat('Y-d-m H-i', $object->ordered_at)->toDateString() }}
{{ Carbon::createFromFormat('Y-d-m H-i', $object->ordered_at)->format('m-d') }}
ښه کوډ:
// Model
protected $casts = [
'ordered_at' => 'datetime',
];
// Blade view
{{ $object->ordered_at->toDateString() }}
{{ $object->ordered_at->format('m-d') }}
DotBlocks د کوډ ویل سختوي، نو باید د descriptive method او د php د نوي خصوصیاتو (features) څخه استفاده وشي لکه return type hints.
بد کوډ:
/**
* The function checks if given string is a valid ASCII string
*
* @param string $string String we get from frontend which might contain
* illegal characters. Returns True is the string
* is valid.
*
* @return bool
* @author John Smith
*
* @license GPL
*/
public function checkString($string)
{
}
ښه کوډ:
public function isValidAsciiString(string $string): bool
{
}
هغه patterns له هغو وسایلو نه چې له لاراول ته له مشابهو فریمورکونو څخه دي لکه جانګو یا روبي، نه ډډه وکړئ. که ستاسو Symfony یا Sprint فریمورکونه خوښیږي، دا به ښه وي چې د لاراول پر ځای له هغو نه استفاده وکړئ.
په Route فایلونو کې هیڅکله خپل د اپلکیشن کډ مه لیکئ.
له خالص پي اچ پي یا vanilla php څخه به blade templates کې کوشش وکړئ چې تر آخری خده ډډه وکړئ.
د ټسټنګ لپاره د in-memory DB نه استفاده وکړئ
د فریمورک په کود او features کې تغییر مه راولئ.
د عصري پی اچ پي څخه استفاده وکړئ، داسې کوډ ولیکئ چې په راتلونکي کې، ویل یې آسانه وي.
د View Composers د استعمال څخه ډډه وکړئ تر هغه پورې چې سل سلنه پرې پوه نشئ. پهر ډېرو حالاتو کې ډېرې نورې آسانې لارې هم شته چې هغه کار تر سره کړئ.