Toàn bộ dự án của monkey được viết theo chuẩn psr2 . Việc theo 1 chẩn format code sẽ giúp team có 1 sự thống nhất và giúp review code dễ dàng hơn và tiện cho quá trình support chéo và maintain tính năng của người
https://www.php-fig.org/psr/psr-2/
1. Cách đặt tên
1.1 Chuẩn cơ bản
Tên Classes và Namespaces: Namespaces và tên classes phải tuân theo quy chuẩn "autoloading" của PSR:
Tên class: Tên class phải được viết dưới dạng StudlyCaps, tức là các chữ cái đầu từ viết hoa, viết liền.
Tên Method: Tên Method phải được viết dưới dạng camelCase, tức là từ đầu tiên viết thường, các từ tiếp theo viết hoa chữ cái đầu.
Tên biến: Tên biến phải có nghĩa, không đặt kiểu $p, $num1, $num2,...
Hằng số const: Constants của class phải được viết hoa toàn bộ và sử dụng gạch dưới ngăn cách giữa các từ. Ví dụ:
const DATE_APPROVED = '2014-03-04';
Keywords: Những keywords của PHP phải được viết thường. (không viết hoa); constants của PHP là true, false, và null cũng cần phải viết thường.
1.2 Đặt tên trong Laravel
Dựa trên chuẩn PSR standards
Ghi chú:
- singular: Số ít
- plural: Số nhiều
- snake_case: Sử dụng dấu gạch dưới giữa các từ, tất cả các từ viết thường.
- camelCase: Từ đầu tiên viết thường, các từ tiếp theo viết hoa chữ cái đầu
- dot notation: Sử dụng dấu . phân cách
- singular model names in alphabetical order: Tên model số ít và thứ tự theo bảng chữ cái
- snakecase without model name: snake_case không bao gồm tên Model
- descriptive: Định nghĩa
- adjective: Tính từ
- noun: Danh từ
Đối tượng | Chuẩn đặt tên | Tốt | Chưa tốt |
---|---|---|---|
Controller | Singular | ProductController | ProductsController |
Route | Plural | products/1 | product/1 |
Tên route | snake_case + dot notation | products.write_review | products.write-review, write-review-products |
Model | Singular + UpperCase | Product | Products |
hasOne or belongsTo relationship | Singular + camelCase | productComment | productComments, product_comment |
Các quan hệ khác | Plural + camelCase | productComments | productComment, article_comments |
Tên bảng | Plural + snake_case | product_comments | product_comment, productComments |
Tên bảng trung gian | singular model names in alphabetical order | article_user | user_article, articles_users |
Tên cột trong bảng | snake_case without model name | meta_title | MetaTitle, article_meta_title |
Thành phần trong Model | snake_case | $model->created_at | $model->createdAt |
Khóa ngoại | singular model name + _id suffix | article_id | ArticleId, id_article, articles_id |
Khóa chính | - | id | custom_id |
Migration | - | 2017_01_01_000000_create_articles_table | 2017_01_01_000000_articles |
Tên phương thức | camelCase | getAll | get_all |
Phương thức trong resource controller | tên bảng | store | saveArticle |
Phương thức trong test class | camelCase | testGuestCannotSeeArticle | test_guest_cannot_see_article |
Tên biến | camelCase | $articlesWithAuthor | $articles_with_author |
Collection | descriptive, plural | $activeUsers = User::active()->get() | $active, $data |
Object | descriptive, singular | $activeUser = User::active()->first() | $users, $obj |
Config and language files index | snake_case | articles_enabled | ArticlesEnabled; articles-enabled |
Tên file View | snake_case | show_filtered.blade.php | showFiltered.blade.php, show-filtered.blade.php |
Tên file config | snake_case | google_calendar.php | googleCalendar.php, google-calendar.php |
Contract (interface) | adjective or noun | Authenticatable | AuthenticationInterface,IAuthentication |
Trait | adjective | Notifiable |
2. Chuẩn về bố cục file code
2.1 Tab - indent
Code không dùng tab, mà phải sử dụng 4 dấu cách làm indent.
2.2 Độ dài dòng
Không có hard limit về độ dài của một dòng; soft limit phải là 120 chữ. Một dòng nên có không quá 80 chữ.
2.3 Dòng trống
Cần phải có một dòng trống ở sau phần khai báo namespace. Ngoài ra cũng cần có một dòng trống phía sau phần khai báo use.
Mọi file phải kết thúc bằng một dòng trống.
Một dòng không trống không được phép có trailing whitespace (dấu cách ở cuối dòng)
Dòng trống có thể được thêm vào để code có thể được dễ đọc hơn và để phân cách những đoạn code.
Không được có quá 1 dòng trống liền nhau
Nếu trước return có logic code thì phải có dòng trống phía trước nó, còn nếu không có logic code thì không có dòng trống phía trước.
2.4 Khoảng trắng (whitespace)
Cần phải có một dấu cách phía sau những từ khoá Control structure (như if, else, for ...).
Không được có dấu cách phía sau tên của method khi gọi hàm.
Một dòng không trống không được phép có trailing whitespace (dấu cách ở cuối dòng)
Ngoài các indent tab thì không được có quá 1 khoảng trắng liền nhau
Cần có 1 space trước và sau các toán tử như +, -, *, /, ., >, <, == ...
Không được có khoảng trắng dư ở cuối các dòng.
Khi gọi một method hay một function, không được phép có khoảng trắng giữa tên của method hay function và dấu mở ngoặc tròn. Không được phép có khoảng trắng sau dấu mở ngoặc tròn. Và không được phép có khoảng trắng trước dấu đóng ngoặc tròn.
Trong danh sách argument, không được phép có khoảng trắng trước mỗi dấu phẩy, và phải có một khoảng trắng sau mỗi dấu phẩy.
Danh sách argument có thể được tách ra thành nhiều dòng, trong đó mỗi dòng theo sau được indent một lần. Khi làm như vậy thì argument đầu tiên phải được đặt trên một dòng mới, và mỗi dòng chỉ được phép chứa một argument.
2.5 Khối lệnh
Khai báo Class: Dấu mở ngặc nhọn dùng khi khai báo class phải được viết ở dòng mới (không viết cùng dòng với phần khai báo tên class), và dấu đóng ngoặc nhọn của một class phải được viết ở dòng mới sau khi kết thúc body của class.
Khai báo Method: Dấu mở ngặc nhọn dùng khi khai báo method phải được viết ở dòng mới (không viết cùng dòng với phần khai báo tên method), và dấu đóng ngoặc nhọn của một method phải được viết ở dòng mới sau khi kết thúc body của method.
Khai báo use:
Những phần khai báo use phải được đặt phía sau phần khai báo namespace
Phải dùng một từ use cho mỗi khai báo.
Phải có một dòng trắng phía sau đoạn code use.
Control structures:
Dấu mở ngoặc nhọn cho control structures (như if, else, for ...) phải được viết cùng dòng, trong khi đó đấu đóng ngoặc phải được viết ở dòng mới.
Cần phải có một dấu cách phía sau những từ khoá Control structure (như if, else, for ...). Không được có dấu cách phía sau tên của method khi gọi hàm.
Không được có một khoảng trắng sau dấu mở ngoặc tròn hoặc trước dấu đóng ngoặc tròn
Phải có một khoảng trắng sau đấu đóng ngoặc tròn và trước dấu mở ngoặc nhọn
Phần thân của structure phải được indent một lần
Từ khoá elseif nên được dùng thay cho else if, để mọi control keywords chỉ là một từ đơn.
Phần case phải được indent một lần so với switch, và break keyword (hay các keyword ngắt khác) phải được indent giống với phần thân của case. Phải có một comment kiểu như // no break nếu phần thân của case không trống, và được cố tình cho qua (không có break)
Phải luôn khai báo tính visibility (public, protected hay là private) của properties cũng như methods, abstract và final phải được khai báo phía trước tính visibility và staticphải được khai báo sau tính visibility.
Nếu trước return có logic code thì phải có dòng trống phía trước nó, còn nếu không có logic code thì không có dòng trống phía trước.