Cách sử dụng routing trong Laravel

Routing hay route trong Laravel được hiểu là 1 thành phần để điều hướng URL đến controller, đến view cụ thể nào đó … Nghĩa là routing sẽ định nghĩa mỗi một URL cụ thể khi người dùng truy cập trên trình duyệt web thì routing sẽ dựa vào URL đó đã được định nghĩa trong file route hay chưa để gọi controller, hay gọi view tương ứng.

File routes trong Laravel nằm ở đâu?

Toàn bộ những file routes của Laravel được lưu ở thư mục routes. Những file này mặc định sẽ được tự động load khi Laravel framework chạy. File routes/web.php thì sẽ định nghĩa tất cả những routes cho website của bạn. Những routes của web.php thì nằm trong middleware tên là web, middleware này cung cấp những tính năng như là session (lưu phiên làm việc như authentication …), bảo mật CRSF (tạo ra CRSF token cho form). Ngoài ra chúng ta còn có file routes/api.php sẽ định nghĩa tất cả những routes khi chúng ta viết API cho website để giao tiếp với mobile app chẳng hạn. Và những routes của api.php thì nằm trong middleware tên là api.

Để hiểu routing thực sự hoạt động ra sao trong Laravel, chúng ta sẽ đi qua những cách khai báo routing dưới đây

Cách đơn giản nhất: khai báo hàm thực thi cho routing ngay trong file routes

Chúng ta mở file routes/web.php và thêm vào dòng dưới đây

Đoạn code trong file route phía trên nghĩa là khi người dùng truy cập vào đường dẫn URL /hello (ví dụ http://domain.com/hello) thì sẽ thực thi 1 hàm trả về 1 đoạn text “Welcome to laptrinh.info” ra màn hình. Bạn có thể truy cập vào URL phía trên để kiểm tra kết quả (domain.com là domain tương ứng của bạn)

Cách thứ 2: trả về 1 file view khi gọi 1 routing

Routing khi chúng ta gọi mà trả về 1 file view thì chúng ta gọi view routes. Cách khai báo cũng rất đơn giản như sau

Đoạn code trên nghĩa là khi người dùng truy cập vào đường dẫn URL /hello thì Laravel sẽ gọi file view resources/view/hello.blade.php rồi trả về nội dung file view đó trên trình duyệt web.

Ngoài ra chúng ta còn có thể truyền biến vào file view như sau

Đoạn code trên cũng gọi file view tương ứng như trên, nhưng mà sẽ truyền biến $name có giá trị là “laptrinh.info” vào file view. Và chúng ta có thể hiển thị biến $name đó trong file view.

Cách thứ 3: gọi controller từ 1 routing

Đây là cách mà đa phần các bạn khi lập trình web sẽ sử dụng nhiều nhất, đó là gọi 1 controller tương ứng với routing. Đối với 2 cách trên, khi chúng ta khai báo hàm trực tiếp trong file route, hoặc gọi view rồi truyền biến số như trên sẽ làm file route vô cùng dài dòng và khó đọc, khó maintain sau này. Thay vì như vậy chúng ta sẽ gọi controller và mọi logic code sẽ do controller đảm nhiệm, routing chỉ có vai trò điều hướng URL mà thôi

Ví dụ

Đoạn code trên nghĩa là khi người dùng truy cập vào /hello trên ứng dụng web, thì Laravel sẽ gọi hàm index trong file controller nằm ở app/Http/Controllers/HelloController.php

Ngoài ra còn có 1 số cách khai báo route khác như

Redirect route (hay còn gọi là route chuyển hướng)

Nếu bạn muốn user khi truy cập vào 1 URL trên web của bạn sẽ được chuyển hướng (redirect) đến 1 URL khác thì bạn có thể dùng route loại này (thường sẽ rất hữu ích khi SEO cho website). Cách khai báo như sau

Mặc định Route::redirect sẽ trả về mã HTTP code là 302. Nếu bạn muốn thay đổi mã HTTP code (ví dụ thành 301) bạn có thể khai báo như sau

Hoặc bạn có thể sử dụng Route::permanentRedirect để Laravel tự hiểu là trả về 301

Cách phương thức của route

Phương thức của route ở đây là các phương thức truyền data như là GET, POST, PUT, PATCH, DELETE. Chúng ta có thể khai báo phương thức đi kèm với route như sau

Nếu 1 route có 2 hoặc nhiều phương thức mà chúng ta không muốn viết riêng rẽ, ta có thể gộp lại bằng Route::match như sau (bên dưới là gộp 2 phương thức GET và POST)

Hoặc gộp toàn bộ các phương thức bằng Route::any

Bảo vệ CSRF cho form

CSRF là gì? CSRF là viết tắt của chữ Cross Site Request Forgery, là kỹ thuật tấn công bằng cách sử dụng quyền chứng thực của người sử dụng đối với 1 website khác. Nói nôm na CSRF là 1 lỗ hổng bảo mật web mà hacker có thể lợi dụng nó để mượn tay người dùng tấn công 1 website nào đó. Về CSRF các bạn có thể tìm hiểu thêm trên Google.

Để phòng chống việc này khi truyền data trong form, Laravel sẽ cung cấp cho bạn 1 blade directive là @csrf. Đối với các phương thức submit data như POST, PATCH, PUT, DELETE thì bạn nên sử dụng @csrf để bảo mật data. @csrf sẽ tự động sinh ra 1 CSRF token cho mỗi user truy cập vào website. Cách khai báo @csrf trong form như bên dưới

(còn tiếp …)

Cài đặt Percona toolkit – công cụ hỗ trợ đắc lực cho MySQL

Percona toolkit là tập hợp những công cụ, ứng dụng chạy trên dòng lệnh được phát triển bởi hãng Percona, giúp chúng ta có thể quản lý, phân tích, tối ưu những cơ sở dữ liệu như MySQL hoặc MongoDB một cách hiệu quả và nhanh chóng hơn.

Trước tiên chúng ta cần add GPG key và add repo vào Linux

Tiếp theo chúng ta tiến hành update để Linux có thể nhận được repo mới của Percona

Sau cùng chúng ta tiến hành cài đặt Percona toolkit

 

Phân tích những query chạy chậm trên MySQL bằng mysqldumpslow và pt-query-digest

*** Lưu ý: bài viết này dành cho MySQL version 5.5 trở lên. Đối với những version cũ hơn có thể những cú pháp, câu lệnh trong bài viết này sẽ không chính xác.

MySQL có thể lưu log những câu lệnh query chạy chậm và tốn nhiều thời gian để thực thi. Việc lưu log như vậy có thể giúp chúng ta debug được dễ dàng cũng như dễ dàng fix những lỗi trong code dẫn đến việc xảy ra những câu query của MySQL chạy chậm.

Bật tính năng slow-query-log

Mở file cấu hình của MySQL /etc/mysql/my.cnf và chỉnh với những thông số như bên dưới

Dòng cuối cùng sẽ khai báo với slow-query-log rằng chúng ta sẽ lưu log những câu query không sử dụng index

Sử dụng mysqldumpslow

Câu lệnh dưới đây sẽ hiển thị top 5 câu query trả về nhiều rows nhất, bạn có thể kiểm tra nếu quá nhiều rows trả về trong câu query, có thể bạn quên không sử dụng LIMIT của MySQL

Còn dưới đây là câu lệnh trả về top 5 câu query được chạy nhiều nhất trong slow logs. Bạn có thể kiểm tra và tối ưu chúng.

Sử dụng pt-query-digest

Công cụ này là 1 phần trong gói Percona toolkit

Chạy dòng lệnh dưới đây để phân tích slow queries

Nếu bạn đang có nhiều database, thì bạn có thể lọc theo database name bằng cách sau (db_wordpress là tên của database, bạn có thể thay tương ứng bằng tên database của bạn)

Sử dụng mysqlsla

Đây là 1 ứng dụng của bên thứ 3, bạn có thể tham khảo trên Github tại link này => https://github.com/daniel-nichter/hackmysql.com

Chạy dòng lệnh dưới đây để phân tích slow queries

Lọc theo database như sau