Qua nhiều lần khảo sát cũng như trao đổi với nhiều bạn làm về Laravel mình nhận thấy nhiều bạn mắc lỗi về cách viết trong OOP (Hướng đối tượng).
Hôm nay mình viết bài này để chia sẻ cho các bạn code Laravel sao cho đúng (ý kiến cá nhân mình ^^) nhằm tăng performance website cũng như tính thẩm mỹ trong code.
Nói đến hướng đối tượng thì không riêng gì Laravel mà các Framework khác cũng như thế. MVC là gì mình không cần phải nói ai cũng biết phải không nào ?. Nhưng liệu chúng ta có hiểu được mỗi thành phần trong đó xử lý những gì không nào? Đây là cái mình sẽ nói chính trong bài viết này.
1. Sử dụng MVC theo đúng nghĩa !
Qua nhiều lần trao đổi với nhiều bạn, đa phần các bạn viết sai công dụng của các thành trên. Controller nhiều bạn gọi Models và viết cả câu query để truy vấn dữ liệu như vậy là sai nhé các bạn. Viết như thế sẽ không còn mô hình MVC nữa nhé.
Vậy viết sao cho đúng nghĩa MVC ?
Với Models chúng ta nên viết function xử lý trong chính Class bạn muốn lấy dữ liệu. Sau khi có fucntion mong muốn Controller chỉ cần điều hướng tới Models gọi function cần thiết và trả về dữ liệu. Các bạn hãy xem qua ví dụ sau.
//Models Class User extends Model { protected $table = 'users'; public function getListUser() { return self::get(); } } //Controllers use App\User; Class UserController extends Controller { function __construct(User $user) { $this->user = $user; } public function index() { $listUser = $this->user->getListUser(); return view('viewName', compact('listUser')); } }
Khá là đơn giản phải không nào. Trong ví vụ trên mình có dùng __construct trong việc khởi tạo models. Nhiều bạn vẫn thường dùng new ModelClass() điều này không sai nhưng việc cứ lặp đi lặp lại mỗi function bạn phải gọi new Model nhìn code không đẹp cho lắm. Thì __construct sẽ giúp các bạn trong việc này.
Qua ví vụ trên các bạn thấy code có ngắn gọn hơn không? Nếu code bạn cũng đang mắc phải tình trạng mình vừa nói thì hãy thử theo cách của mình nhé.
2. Request hãy để nó làm việc theo đúng những gì nó có !
Cũng như Models, Request sẽ quản lý các xử lý liên quan gửi và nhận yêu cầu từ phía người dùng (Views). Nhiều bạn vẫn dùng nó ngay tại controller điều này không sai, nhưng nó sẽ dẫn tới việc lặp đi lặp lại làm cho function chức năng của chúng ta như một mớ hỗn độn khó mà quản lý.
Cách giải quyết hợp lý nhất là ta nên xây dựng một nơi để quản lý vấn đề này bằng cách tạo một Request riêng. Với Laravel chúng đã tích hợp sẵn lệnh tạo một Request thông qua Artisan Console các bạn có thể thực hiện như sau:
php artisan make:request RelipaRequest
Đây là nội dung Request ta vừa tạo. Mình đã tạo một file Request có tên là RelipaRequest:
//app/Http/Requests/RelipaRequest; namespace App\Http\Requests; use App\Http\Requests\Request; class RelipaRequest extends Request { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return false; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; } }
Chúng ta sẽ làm gì với nó? Nhiều bạn chưa sử dụng qua chắc chắn sẽ bối rối phải không nào. Tại đây chúng ta sẽ xử lý Validate input từ form được gửi lên từ người dùng, mà những Rules validate này đã có sẵn trong Laravel Docs. Các bạn có thể xem qua ví vụ sau:
/* Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'username' => 'required' ]; }
Khá quen thuộc phải không nào. Không dừng ở đó tại đây các bạn có thể custom được cả thuộc tính Attribute của input và custom được message sẽ hiện thị khi bắt lỗi
/** * Get the validation attributes that apply to the request. * * @return array */ public function attributes() { return [ 'username' => 'Tên người dùng' ]; } /** * Get the validation custom message that apply to the request. * * @return array */ public function customMessages() { return [ 'username.required' => 'Tên người dùng bắt buộc nhập', ]; }
Vậy sử dụng Request này như thế nào? Đơn giản thôi, tại Controller bạn muốn sử dụng các bạn hãy gọi NameSpace của nó ra để khái báo rằng bạn sẽ sử dụng nó.
use App\Http\Requests\RelipaRequest; Class UserController extends Controller { // }
– Khổ quá, biết rồi, ví dụ cụ thể đi.
– Vâng, và đây, truyền tham chiếu nó vào action bạn cần xử lý Request. Ví vụ mình có action đăng ký người dùng như sau:
use App\Http\Requests\RelipaRequest; Class UserController extends Controller { // public function userRegister(RelipaRequest $request) { // your code here. } }
Ở function userRegister các bạn sẽ không cần phải gọi Validator rồi make rules các kiểu nữa vì RelipaRequest đã thay bạn làm cả rồi.^^
3. Tạo Helper hãy vận dụng OOP thông qua Namespace
Nhiều bạn mắc lỗi nho nhỏ khi tạo thư viên helper cua mình nhằm giúp xử lý các tác vụ nhỏ khi cần thiết nhu xử lý chuỗi, mảng ,…Mọi người thường xử lý theo dạng php thuần trong khi các bạn đang viết OOP.
funtion getString($string) { return $string; }
Đây cũng là một cách, nhưng thật sự không tối ưu khi chỉnh sửa và thường gặp lỗi với autoload khi các bạn thêm vào composer.json autoload. Ý kiến cá nhân của mình các bạn nên tận dụng cái mà OOP đang làm cách mà Laravel đang sử dụng. Mọi thứ đều viết với dạng các lớp , thuộc tính và phương thức.
namespace App\Helpers; class Helper { public function getString($string) { return $string } }
Việc sử dụng cũng khá dẽ dàng các bạn chỉ cần khai báo namespace tại controller và gọi phương thức của nó ra.
use App\Helpers\Helper; Class UserController extends Controller { function __construct(Helper $helper) { $this->helper = $helper; } public function userRegister(UserRequest $request) { $this->helper->getString($string); // your code here. } }
Lời kết:
Trên đây chỉ là ý kiến cá nhân của mình, mọi góp ý các bạn có thể comment bên dưới. Hy vọng bài viết giúp ích cho các bạn trong việc học tập cũng như rèn luyện code của mình.
Còn khá nhiều thủ thuật khác mình sẽ đề cập trong bài viết tiếp theo nhé!. Chúc các bạn thành công. Nếu thấy bổ ích các bạn hãy share cho bạn bè nhé!
Và đừng quên rằng Relipa đang cần những chiến binh thiện chiến về PHP, cùng nhau trao dồi thêm kiến thức. Hãy nhanh tay ứng tuyển ngay tại: https://v.relipasoft.com/jobs/