2026-03-28 15:07:29 -05:00
# Conventions & Style
## Follow Laravel Naming Conventions
| What | Convention | Good | Bad |
|------|-----------|------|-----|
| Controller | singular | `ArticleController` | `ArticlesController` |
| Model | singular | `User` | `Users` |
| Table | plural, snake_case | `article_comments` | `articleComments` |
| Pivot table | singular alphabetical | `article_user` | `user_article` |
| Column | snake_case, no model name | `meta_title` | `article_meta_title` |
| Foreign key | singular model + `_id` | `article_id` | `articles_id` |
| Route | plural | `articles/1` | `article/1` |
| Route name | snake_case with dots | `users.show_active` | `users.show-active` |
| Method | camelCase | `getAll` | `get_all` |
| Variable | camelCase | `$articlesWithAuthor` | `$articles_with_author` |
| Collection | descriptive, plural | `$activeUsers` | `$data` |
| Object | descriptive, singular | `$activeUser` | `$users` |
| View | kebab-case | `show-filtered.blade.php` | `showFiltered.blade.php` |
| Config | snake_case | `google_calendar.php` | `googleCalendar.php` |
| Enum | singular | `UserType` | `UserTypes` |
## Prefer Shorter Readable Syntax
| Verbose | Shorter |
|---------|---------|
| `Session::get('cart')` | `session('cart')` |
| `$request->session()->get('cart')` | `session('cart')` |
| `$request->input('name')` | `$request->name` |
| `return Redirect::back()` | `return back()` |
| `Carbon::now()` | `now()` |
| `App::make('Class')` | `app('Class')` |
| `->where('column', '=', 1)` | `->where('column', 1)` |
| `->orderBy('created_at', 'desc')` | `->latest()` |
| `->orderBy('created_at', 'asc')` | `->oldest()` |
| `->first()->name` | `->value('name')` |
## Use Laravel String & Array Helpers
Laravel provides `Str` , `Arr` , `Number` , and `Uri` helper classes that are more readable, chainable, and UTF-8 safe than raw PHP functions. Always prefer them.
Strings — use `Str` and fluent `Str::of()` over raw PHP:
```php
// Incorrect
$slug = strtolower ( str_replace ( ' ' , '-' , $title ));
$short = substr ( $text , 0 , 100 ) . '...' ;
2026-05-14 08:59:57 -05:00
$class = substr ( strrchr ( 'App\Models\User' , '\'), 1);
2026-03-28 15:07:29 -05:00
// Correct
$slug = Str::slug($title);
$short = Str::limit($text, 100);
2026-05-14 08:59:57 -05:00
$class = class_basename(' App\Models\User ' );
2026-03-28 15:07:29 -05:00
```
Fluent strings — chain operations for complex transformations:
```php
// Incorrect
$result = strtolower ( trim ( str_replace ( '_' , '-' , $input )));
// Correct
$result = Str :: of ( $input ) -> trim () -> replace ( '_' , '-' ) -> lower ();
```
Key `Str` methods to prefer: `Str::slug()` , `Str::limit()` , `Str::contains()` , `Str::before()` , `Str::after()` , `Str::between()` , `Str::camel()` , `Str::snake()` , `Str::kebab()` , `Str::headline()` , `Str::squish()` , `Str::mask()` , `Str::uuid()` , `Str::ulid()` , `Str::random()` , `Str::is()` .
Arrays — use `Arr` over raw PHP:
```php
// Incorrect
$name = isset ( $array [ 'user' ][ 'name' ]) ? $array [ 'user' ][ 'name' ] : 'default' ;
// Correct
$name = Arr :: get ( $array , 'user.name' , 'default' );
```
Key `Arr` methods: `Arr::get()` , `Arr::has()` , `Arr::only()` , `Arr::except()` , `Arr::first()` , `Arr::flatten()` , `Arr::pluck()` , `Arr::where()` , `Arr::wrap()` .
Numbers — use `Number` for display formatting:
```php
Number :: format ( 1000000 ); // "1,000,000"
Number :: currency ( 1500 , 'USD' ); // "$1,500.00"
Number :: abbreviate ( 1000000 ); // "1M"
Number :: fileSize ( 1024 * 1024 ); // "1 MB"
Number :: percentage ( 75.5 ); // "75.5%"
```
URIs — use `Uri` for URL manipulation:
```php
$uri = Uri :: of ( 'https://example.com/search' )
-> withQuery ([ 'q' => 'laravel' , 'page' => 1 ]);
```
Use `$request->string('name')` to get a fluent `Stringable` directly from request input for immediate chaining.
Use `search-docs` for the full list of available methods — these helpers are extensive.
## No Inline JS/CSS in Blade
Do not put JS or CSS in Blade templates. Do not put HTML in PHP classes.
Incorrect:
```blade
let article = `{{ json_encode($article) }}`;
```
Correct:
```blade
<button class="js-fav-article" data-article='@json($article)'>{{ $article->name }}</button>
```
Pass data to JS via data attributes or use a dedicated PHP-to-JS package.
## No Unnecessary Comments
Code should be readable on its own. Use descriptive method and variable names instead of comments. The only exception is config files, where descriptive comments are expected.
Incorrect:
```php
// Check if there are any joins
if ( count (( array ) $builder -> getQuery () -> joins ) > 0 )
```
Correct:
```php
if ( $this -> hasJoins ())
```