Laravel Coding Standard
Laravel Coding Standard
Table of Contents
1. Follow Laravel naming conventions
2. Use shorter and more readable syntax where possible
3. Single responsibility principle
4. Fat models, skinny controllers
5. validation
6. Business logic should be in service class (Interface and Repository if third party service include so type in
services folder inside make for particular service like : email service,payment service etc)
7. Don't repeat yourself (DRY)
8. Prefer to use Eloquent over using Query Builder and raw SQL queries. Prefer collections over arrays
(Request->all())
9. Mass assignment
10. Do not execute queries in Blade templates and use eager loading (N + 1 problem)
11. Do not put JS and CSS in Blade templates and do not put any HTML in PHP classes
12. Use config and language files, constants instead of text in the code
13. Use standard Laravel tools accepted by community
14. Use IoC container or facades instead of new Class
15. Do not get data from the ".env" file directly
16. Store dates in the standard format. Use accessors and mutators to modify date format
17. Other good practices
1. Follow Laravel Naming Conventions
So, follow naming conventions accepted by Laravel community:
Good:
public function index()
{
return view('index', ['clients' => $this->client->getWithNewOrders()]);
}
class Client extends Model
{
public function getWithNewOrders()
{
return $this->verified() ->with(['orders' => function ($q) {
$q->where('created_at', '>', Carbon::today()->subWeek());
}]) ->get();
}
}
5. validation
Note: Move validation from controllers to Request classes.
Bad:
public function store(Request $request)
{
$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
}
Good:
Good:
public function scopeActive($q)
{
return $q->where('verified', 1)->whereNotNull('deleted_at');
}
public function getActive()
{
return $this->active()->get();
}
public function getArticles()
{
return $this->whereHas('user', function ($q)
{
$q->active();
})->get();
}
9. Mass assignment
Bad:
$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();
Good:
$category->article()->create($request->all());
10. Do not execute queries in Blade templates and use eager loading
(N + 1 problem)
Bad (for 100 users, 101 DB queries will be executed):
@foreach (User::all() as $user)
@endforeach
Good (for 100 users, 2 DB queries will be executed):
$users = User::with('profile')->get();
@endforeach
11. Do not put JS and CSS in Blade templates and do not put any HTML
in PHP classes
Bad:
let article = ``;
Better:
<input id="article" type="hidden" value="">
Or
<button class="js-fav-article" data-article=""><button>
In a Javascript file:
Good:
public function isNormal()
{
return $article->type === Article::TYPE_NORMAL;
}
return back()->with('message', __('app.article_added'));
Good:
// config/api.php
$apiKey = config('api.key');
14. Store dates in the standard format. Use accessors and mutators
to modify date format
Good:
// Model
protected $dates = ['ordered_at', 'created_at', 'updated_at'];
Thank You