Laravel còn giấu diếm chúng ta những gì? (Hậu truyện)

910

Người viết: Hong Quan

Như tiêu đề, đây là hậu truyện của phần “Laravel còn giấu diếm chúng ta những gì” khá là thành công trước đó. Cho bạn nào vừa ở trên rừng xuống thì Laravel đã cho ra mắt phiên bản 6.0 cách đây ít ngày, bản thân mình còn chưa đọc hết document của các phiên bản trước nữa mà đã thấy có 1 đống thứ hay ho ít người biết rồi.

  Tìm hiểu thêm về Laravel - Laravel còn giấu diếm chúng ta những gì?

Có lẽ series này sẽ được làm thành hẳn 1 franchise rồi up to saga giống như Avengers luôn, vì các phiên bản mới của Laravel đang liên tục được cập nhật và cứ mỗi lần cập nhật là có thêm một cơ số những thứ mà mấy ông dev rảnh rỗi thêm vào.

Anyway, let’s begin!

Default Model

Nếu bạn đang có mộn relation ví dụ như belongsToMorphOne hoặc HasOne, nó có thể trả về kết quả null. Trong trường hợp đó, bạn có thể đặt giá trị mặc định bằng phương thức withDefault()

Cache Forever

Nếu bạn đang sử dụng chức năng lưu Cache, sẽ có đôi lúc bạn muốn dữ liệu của mình được lưu lâu dài, rồi xóa lúc nào cần thiết, trong trường hợp đó chỉ cần sử dụng phương thức rememberForever() như này:

Nhân bản và làm mới Model

Đầu tiên là làm mới một Model, bạn có thể sử dụng phương thức fresh() hoặc refresh() để làm mới một Model hoặc, đưa Model đó về trạng thái ban đầu nếu có “nhỡ tay” thay đổi mất

Xem ví dụ cho dễ hiểu:

Thật sự không hiểu lắm ông dev nào rảnh rỗi nghĩ ra cái này, cá nhân mình thấy nó chưa hữu dụng ở chỗ nào mà chỉ để biết cho vui thôi

Tiếp cái dưới đây mới có ích này. Nếu bạn muốn nhân bản một Model, hãy sử dụng phương thức replicate(), đừng như mình  get dữ liệu ra xong đưa lại vào 1 mảng giống hệt vì cần thay đổi một số dữ liệu xong lại lưu vào DB

Hơn thế nữa, phương thức này còn cho phép bỏ qua một số trường mà bạn không muốn hoặc không nên được duplicate

Có 6 phương thức routing chính mà chúng ta hay sử dụng đó là:

Nhưng ngoài ra bạn có biết còn 2 phương thức nữa cũng cực kỳ hữu dụng?

1.

Phương thức này dành cho bạn nào muốn một route có thể sử dụng 2 hoặc nhiều phương thức HTTP cùng lúc.

2.

Phương thức này cho phép một route có thể nhận một HTTP methods bất kỳ luôn, lười level max. Tất nhiên sử dụng thế nào là ở bạn nhưng theo mình cái any() này cũng chả hữu dụng lắm, chỉ để biết cho vui thôi

Redirect URL ngay trong web.php

Có rất nhiều trường hợp, nhất là ở các bạn newbie mới tìm hiểu Laravel, viết hẳn một Controller rất hoành tráng, trong là một mớ methods mà có nhiều cái chỉ làm đúng nhiệm vụ redirect sang một trang khác.

Cách đơn giản để thực hiện một việc đơn giản là sử dụng luôn một phương thức redirect mà Laravel đã cung cấp sẵn, ngay trong web.php

Return view trong web.php

Tương tự như trường hợp trên, bạn cũng có thể return ra một view ngay trong web.php nhưng với cách gọn hơn như này rất nhiều:

Route name prefixes

Nếu bạn có một đống các routes và có thể bạn đang đặt tên cho nó kiểu như thế này:

Bạn có thể gom tất cả các route name bắt đầu bằng blog thành các group với prefix là blog. như sau:

Code clean, tại sao lại không chứ?

optional()

Một phương thức rất hữu dụng khác nhưng có lẽ ít người để ý. Phương thức này nhận vào tất cả value và cho phép bạn gọi đến các thuộc tính hoặc phương thức mà bạn truyền vào nó. Nếu method hoặc thuộc tính bạn truyền vào là null thì nó sẽ trả ra null luôn.

Rất hữu dụng khi bạn không biết liệu một array mình dùng có value mình cần hay không, thay thế câu lệnh if/else luôn được ấy

Sử dụng array_wrap() để chắc rằng biến là một array

Đôi khi bạn cần làm việc với một array nhưng bạn không dám chắc tham số đầu vào là gì vì nó có thể nhận mọi loại dữ liệu, bạn sẽ muốn sử dụng phương thức trên để biến mọi loại dữ liệu về với kiểu array cực kỳ đơn giản thay vì cách truyền thống như này:

Hãy làm như này:

Hoặc

Lấy phần tử đầu tiên của mảng KHÔNG TRƯỢT PHÁT NÀO bằng Collection first()

Nghe thì có vẻ hiển nhiên nhưng bạn đã rơi vào trường hợp muốn lấy ra một phần tử của mảng nhưng không chắc rằng tham số đầu vào là một string hay một array??

Tôi đã rơi vào trường hợp này khi đã quên mất một case trong quá trình validate dữ liệu, khi cho phép tham số đầu dùng mà người dùng nhập vào có thể là bất cứ điều gì, tôi cứ hồn nhiên lấy ra phần tử đầu tiên bằng $array[0], vào một ngày đẹp trời, có bạn tester nhập vào một string và thế là toanggg.

Sau đó tôi đã ngay lập tức chữa cháy bằng một cú fix:

Trông có vẻ ngon nhưng hơi khó chịu thôi :v vì phải mất công tạo thêm một function cho một case bé tí, sau đó tôi đã phát hiện ra một cách đơn giản hơn nhiều, đó là lợi dụng phương thức collect() của Laravel. Mặc định phương thức này sẽ trả về một array bất kể đầu vào là một array hay một string hay một integer, nếu đầu vào là một string, đầu ra sẽ là một mảng một Collection một phần tử, chỉ cần dùng ->first() là xong

HOẶC Bạn có thể lợi dụng luôn array_wrap() để lấy ra phần tử đầu tiên như vậy nhưng chỉ là trông nó không được đẹp cho lắm:

Lấy phần tử trong mảng theo điều kiện bất kỳ bằng Collection filter()

Vấn đề thế này, bạn có một mảng dữ liệu, mỗi phần tử trong mảng là một object với nhiều thuộc tính và ác thuộc tính đó đều được sử dụng cho một câu lệnh tìm kiếm, ví dụ với array sau:

Bây giờ tôi muốn lấy một cuốn sách với duy nhất một tham số điều kiện là $condition, với điều kiện tôi đưa vào, tôi sẽ lấy được một cuốn sách có author hoặc book hoặc type là $condition.

Đơn giản thôi, foreach rồi if/else có gì khó đâu:

Hầu hết sẽ làm như vầy đúng không, đúng là rất đơn giản nhưng lại quá dài, không clean.

Thay vào đó Laravel cung cấp cho chúng ta một công cụ mạnh mẽ hơn nhiều, giờ hãy thử dùng phương thức filter() như sau:

Kết quả trả về của cả 2 đều là object phù hợp với điều kiện đưa vào nhưng sử dụng filter() cho code gọn và clean hơn nhiều

Có thể bạn quan tâm:

Xem thêm việc làm Software Developers tại TopDev

TopDev via Viblo

  Nâng cao kỹ năng debug trong Javascript bằng Console
  Mẹo quy ước tên cho CSS giúp bạn rút ngắn 2/3 thời gian khi debug!
SHARE